Don't generate lshr for cb array indexing. (#812)
This commit is contained in:
Родитель
0b309e9faf
Коммит
259d6624e6
|
@ -5315,8 +5315,7 @@ void TranslateCBGepLegacy(GetElementPtrInst *GEP, Value *handle,
|
||||||
unsigned idxInc = tempOffset >> 4;
|
unsigned idxInc = tempOffset >> 4;
|
||||||
legacyIndex = Builder.CreateAdd(legacyIndex, hlslOP->GetU32Const(idxInc));
|
legacyIndex = Builder.CreateAdd(legacyIndex, hlslOP->GetU32Const(idxInc));
|
||||||
} else {
|
} else {
|
||||||
Value *tempOffset = Builder.CreateMul(idx, hlslOP->GetU32Const(size));
|
Value *idxInc = Builder.CreateMul(idx, hlslOP->GetU32Const(size>>4));
|
||||||
Value *idxInc = Builder.CreateLShr(tempOffset, 4);
|
|
||||||
legacyIndex = Builder.CreateAdd(legacyIndex, idxInc);
|
legacyIndex = Builder.CreateAdd(legacyIndex, idxInc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5366,8 +5365,7 @@ void TranslateCBGepLegacy(GetElementPtrInst *GEP, Value *handle,
|
||||||
unsigned idxInc = tempOffset >> 4;
|
unsigned idxInc = tempOffset >> 4;
|
||||||
legacyIndex = Builder.CreateAdd(legacyIndex, hlslOP->GetU32Const(idxInc));
|
legacyIndex = Builder.CreateAdd(legacyIndex, hlslOP->GetU32Const(idxInc));
|
||||||
} else {
|
} else {
|
||||||
Value *tempOffset = Builder.CreateMul(idx, hlslOP->GetU32Const(size));
|
Value *idxInc = Builder.CreateMul(idx, hlslOP->GetU32Const(size>>4));
|
||||||
Value *idxInc = Builder.CreateLShr(tempOffset, 4);
|
|
||||||
legacyIndex = Builder.CreateAdd(legacyIndex, idxInc);
|
legacyIndex = Builder.CreateAdd(legacyIndex, idxInc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
|
||||||
|
|
||||||
|
// Make sure no lshr created for cbuffer array.
|
||||||
|
// CHECK-NOT: lshr
|
||||||
|
// CHECK:[[ID:[^ ]+]] = call i32 @dx.op.loadInput.i32
|
||||||
|
// CHECK:[[ADD:[^ ]+]] = add nsw i32 [[ID]], 2
|
||||||
|
// CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %"$Globals_buffer", i32 [[ADD]])
|
||||||
|
|
||||||
|
|
||||||
|
float A[6] : register(b0);
|
||||||
|
float main(int i : A) : SV_TARGET
|
||||||
|
{
|
||||||
|
return A[i] + A[i+1] + A[i+2] ;
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче