Skip to content

Commit 92f6bbe

Browse files
committed
[SER] Transform RayDesc in ScalarReplHLSL for robust lowering
ScalarReplHLSL will refuse to faltten RayDesc if some users are incompatible. This is at odds with HLOperationLower, which always expects a specific flattened form. This implements explicit RayDesc flattening in ScalarReplHLSL to make this more reliable. One issue with RayDesc-from-cbuffer in RayQuery remains and is documented with a test. Implement ScalarReplHLSL handling for RayDesc param in HL ops: - HitObject::MakeMiss [RewriteCallArg] - HitObject::TraceRay [RewriteCallArg] - TraceRay [RewriteCallArg] - RayQuery::TraceRayInline [unchanged - flatten to RayDesc elements] In the process: - Fix copyout code in RewriteCallArg (ScalarReplHLSL) - Remove obsolete tests that expected a RayDesc alloca (where RayDesc is now SROA'd entirely) - Document RayQuery lowering bug when RayDesc is taken directly from cbuffer. Closes microsoft#7434 Unflattened RayDesc breaking HL->DXIL lowering microsoft#7434
1 parent 556fc5b commit 92f6bbe

File tree

6 files changed

+182
-104
lines changed

6 files changed

+182
-104
lines changed

include/dxc/HLSL/HLOperations.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ const unsigned kAnnotateNodeHandleNodePropIdx = 2;
434434
const unsigned kAnnotateNodeRecordHandleNodeRecordPropIdx = 2;
435435

436436
// HitObject::MakeMiss
437-
const unsigned kHitObjectMakeMiss_NumOp = 8;
437+
const unsigned kHitObjectMakeMiss_NumOp = 5;
438438
const unsigned kHitObjectMakeMissRayDescOpIdx = 4;
439439

440440
// HitObject::TraceRay

lib/HLSL/HLOperationLower.cpp

+12-27
Original file line numberDiff line numberDiff line change
@@ -6217,35 +6217,20 @@ Value *TranslateHitObjectMake(CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode,
62176217

62186218
DXASSERT_NOMSG(CI->getNumArgOperands() ==
62196219
HLOperandIndex::kHitObjectMakeMiss_NumOp);
6220-
Value *RayFlags = CI->getArgOperand(SrcIdx++);
6221-
Value *MissShaderIdx = CI->getArgOperand(SrcIdx++);
6222-
DXASSERT_NOMSG(SrcIdx == HLOperandIndex::kHitObjectMakeMissRayDescOpIdx);
6223-
Value *RayDescOrigin = CI->getArgOperand(SrcIdx++);
6224-
Value *RayDescOriginX =
6225-
Builder.CreateExtractElement(RayDescOrigin, (uint64_t)0);
6226-
Value *RayDescOriginY =
6227-
Builder.CreateExtractElement(RayDescOrigin, (uint64_t)1);
6228-
Value *RayDescOriginZ =
6229-
Builder.CreateExtractElement(RayDescOrigin, (uint64_t)2);
6230-
6231-
Value *RayDescTMin = CI->getArgOperand(SrcIdx++);
6232-
Value *RayDescDirection = CI->getArgOperand(SrcIdx++);
6233-
Value *RayDescDirectionX =
6234-
Builder.CreateExtractElement(RayDescDirection, (uint64_t)0);
6235-
Value *RayDescDirectionY =
6236-
Builder.CreateExtractElement(RayDescDirection, (uint64_t)1);
6237-
Value *RayDescDirectionZ =
6238-
Builder.CreateExtractElement(RayDescDirection, (uint64_t)2);
6239-
6240-
Value *RayDescTMax = CI->getArgOperand(SrcIdx++);
6220+
const unsigned DxilNumArgs = DxilInst_HitObject_MakeMiss::arg_TMax + 1;
6221+
Value *Args[DxilNumArgs];
6222+
Args[0] = nullptr; // Opcode
6223+
unsigned DestIdx = 1;
6224+
Args[DestIdx++] = CI->getArgOperand(SrcIdx++); // RayFlags
6225+
Args[DestIdx++] = CI->getArgOperand(SrcIdx++); // MissShaderIdx
6226+
Value *RayDescPtr = CI->getArgOperand(SrcIdx++);
6227+
DestIdx = LoadRayDescElementsIntoArgs(Args, &Helper.hlslOP, Builder,
6228+
RayDescPtr, DestIdx);
62416229
DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands());
6230+
DXASSERT_NOMSG(DestIdx == DxilNumArgs);
62426231

6243-
Value *OutHitObject = TrivialDxilOperation(
6244-
Opcode,
6245-
{nullptr, RayFlags, MissShaderIdx, RayDescOriginX, RayDescOriginY,
6246-
RayDescOriginZ, RayDescTMin, RayDescDirectionX, RayDescDirectionY,
6247-
RayDescDirectionZ, RayDescTMax},
6248-
Helper.voidTy, CI, HlslOP);
6232+
Value *OutHitObject =
6233+
TrivialDxilOperation(Opcode, Args, Helper.voidTy, CI, HlslOP);
62496234
Builder.CreateStore(OutHitObject, HitObjectPtr);
62506235
return nullptr;
62516236
}

lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

+28-30
Original file line numberDiff line numberDiff line change
@@ -1539,9 +1539,7 @@ void isSafeForScalarRepl(Instruction *I, uint64_t Offset, AllocaInfo &Info) {
15391539
// TODO: should we check HL parameter type for UDT overload instead of
15401540
// basing on IOP?
15411541
IntrinsicOp opcode = static_cast<IntrinsicOp>(GetHLOpcode(CI));
1542-
if (IntrinsicOp::IOP_TraceRay == opcode ||
1543-
IntrinsicOp::MOP_DxHitObject_TraceRay == opcode ||
1544-
IntrinsicOp::MOP_DxHitObject_Invoke == opcode ||
1542+
if (IntrinsicOp::MOP_DxHitObject_Invoke == opcode ||
15451543
IntrinsicOp::IOP_ReportHit == opcode ||
15461544
IntrinsicOp::IOP_CallShader == opcode) {
15471545
return MarkUnsafe(Info, User);
@@ -2687,7 +2685,7 @@ void SROA_Helper::RewriteCallArg(CallInst *CI, unsigned ArgIdx, bool bIn,
26872685
Builder.SetInsertPoint(CI->getNextNode());
26882686
MemCpyInst *cpy = cast<MemCpyInst>(Builder.CreateMemCpy(
26892687
userTyV, Alloca, DL.getTypeAllocSize(userTyElt), false));
2690-
RewriteMemIntrin(cpy, cpy->getRawSource());
2688+
RewriteMemIntrin(cpy, cpy->getRawDest());
26912689
}
26922690
}
26932691

@@ -2756,18 +2754,21 @@ void SROA_Helper::RewriteCall(CallInst *CI) {
27562754
/*loadElts*/ false);
27572755
DeadInsts.push_back(CI);
27582756
} break;
2759-
case IntrinsicOp::IOP_TraceRay: {
2760-
if (OldVal ==
2761-
CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx)) {
2762-
RewriteCallArg(CI, HLOperandIndex::kTraceRayRayDescOpIdx,
2763-
/*bIn*/ true, /*bOut*/ false);
2764-
} else {
2765-
DXASSERT(OldVal ==
2766-
CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx),
2767-
"else invalid TraceRay");
2768-
RewriteCallArg(CI, HLOperandIndex::kTraceRayPayLoadOpIdx,
2769-
/*bIn*/ true, /*bOut*/ true);
2757+
case IntrinsicOp::IOP_TraceRay:
2758+
case IntrinsicOp::MOP_DxHitObject_TraceRay: {
2759+
const int RayDescIdx =
2760+
IOP == IntrinsicOp::IOP_TraceRay
2761+
? HLOperandIndex::kTraceRayRayDescOpIdx
2762+
: HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx;
2763+
if (OldVal == CI->getArgOperand(RayDescIdx)) {
2764+
RewriteCallArg(CI, RayDescIdx, /*bIn*/ true, /*bOut*/ false);
2765+
break;
27702766
}
2767+
const int PayloadIdx = CI->getNumArgOperands() - 1;
2768+
DXASSERT(OldVal == CI->getArgOperand(PayloadIdx),
2769+
"else invalid TraceRay");
2770+
RewriteCallArg(CI, PayloadIdx,
2771+
/*bIn*/ true, /*bOut*/ true);
27712772
} break;
27722773
case IntrinsicOp::IOP_ReportHit: {
27732774
RewriteCallArg(CI, HLOperandIndex::kReportIntersectionAttributeOpIdx,
@@ -2780,21 +2781,10 @@ void SROA_Helper::RewriteCall(CallInst *CI) {
27802781
case IntrinsicOp::MOP_DxHitObject_MakeMiss: {
27812782
if (OldVal ==
27822783
CI->getArgOperand(HLOperandIndex::kHitObjectMakeMissRayDescOpIdx)) {
2783-
RewriteWithFlattenedHLIntrinsicCall(CI, OldVal, NewElts,
2784-
/*loadElts*/ true);
2785-
DeadInsts.push_back(CI);
2784+
RewriteCallArg(CI, HLOperandIndex::kHitObjectMakeMissRayDescOpIdx,
2785+
/*bIn*/ true, /*bOut*/ false);
27862786
}
27872787
} break;
2788-
case IntrinsicOp::MOP_TraceRayInline: {
2789-
if (OldVal ==
2790-
CI->getArgOperand(HLOperandIndex::kTraceRayInlineRayDescOpIdx)) {
2791-
RewriteWithFlattenedHLIntrinsicCall(CI, OldVal, NewElts,
2792-
/*loadElts*/ true);
2793-
DeadInsts.push_back(CI);
2794-
break;
2795-
}
2796-
}
2797-
LLVM_FALLTHROUGH;
27982788
case IntrinsicOp::MOP_DxHitObject_FromRayQuery: {
27992789
const bool IsWithAttrs =
28002790
CI->getNumArgOperands() ==
@@ -2808,7 +2798,6 @@ void SROA_Helper::RewriteCall(CallInst *CI) {
28082798
CI,
28092799
HLOperandIndex::kHitObjectFromRayQuery_WithAttrs_AttributeOpIdx,
28102800
/*bIn*/ true, /*bOut*/ false);
2811-
break;
28122801
}
28132802

28142803
// For RayQuery methods, we want to replace the RayQuery this pointer
@@ -2817,8 +2806,17 @@ void SROA_Helper::RewriteCall(CallInst *CI) {
28172806
RewriteWithFlattenedHLIntrinsicCall(CI, OldVal, NewElts,
28182807
/*loadElts*/ true);
28192808
DeadInsts.push_back(CI);
2820-
break;
2809+
} break;
2810+
case IntrinsicOp::MOP_TraceRayInline: {
2811+
if (OldVal ==
2812+
CI->getArgOperand(HLOperandIndex::kTraceRayInlineRayDescOpIdx)) {
2813+
RewriteWithFlattenedHLIntrinsicCall(CI, OldVal, NewElts,
2814+
/*loadElts*/ true);
2815+
DeadInsts.push_back(CI);
2816+
break;
2817+
}
28212818
}
2819+
LLVM_FALLTHROUGH;
28222820
default:
28232821
// RayQuery this pointer replacement.
28242822
if (OldVal->getType()->isPointerTy() &&
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// RUN: %dxc %s -T lib_6_9 -DPRESET_LOCAL_RAYDESC=1 | FileCheck %s --check-prefix LOCAL
2+
// RUN: %dxc %s -T lib_6_9 -DPRESET_CBUFFER_RAYDESC_NORQ=1 | FileCheck %s --check-prefix CBUFFER
3+
4+
// cbank load lowering bug:
5+
// COM: %dxc %s -T lib_6_9 -DPRESET_CBUFFER_RAYDESC=1 | FileCheck %s --check-prefix CBUFFER_RQ
6+
7+
#if PRESET_LOCAL_RAYDESC
8+
// Single local RayDesc with using ops
9+
10+
#define RD0 1
11+
// #define RD1 1
12+
#define HIT1 1
13+
#define HIT2 1
14+
#define HIT3 1
15+
#define HIT4 1
16+
17+
// LOCAL: %{{[^ ]+}} = call %dx.types.HitObject @dx.op.hitObject_MakeMiss(i32 265, i32 0, i32 0, float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00) ; HitObject_MakeMiss(RayFlags,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax)
18+
// LOCAL: %{{[^ ]+}} = call %dx.types.HitObject @dx.op.hitObject_TraceRay.struct.PerRayData(i32 262, %dx.types.Handle %{{[^ ]+}}, i32 256, i32 255, i32 0, i32 0, i32 0, float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, %struct.PerRayData* nonnull %{{[^ ]+}}) ; HitObject_TraceRay(accelerationStructure,rayFlags,instanceInclusionMask,rayContributionToHitGroupIndex,multiplierForGeometryContributionToHitGroupIndex,missShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload)
19+
// LOCAL: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %{{[^ ]+}}, %dx.types.Handle %{{[^ ]+}}, i32 0, i32 255, float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00) ; RayQuery_TraceRayInline(rayQueryHandle,accelerationStructure,rayFlags,instanceInclusionMask,origin_X,origin_Y,origin_Z,tMin,direction_X,direction_Y,direction_Z,tMax)
20+
// LOCAL: call void @dx.op.traceRay.struct.PerRayData(i32 157, %dx.types.Handle %{{[^ ]+}}, i32 256, i32 255, i32 0, i32 0, i32 0, float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, %struct.PerRayData* nonnull %{{[^ ]+}}) ; TraceRay(AccelerationStructure,RayFlags,InstanceInclusionMask,RayContributionToHitGroupIndex,MultiplierForGeometryContributionToShaderIndex,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload)
21+
22+
#endif
23+
24+
25+
#if PRESET_CBUFFER_RAYDESC_NORQ
26+
// RayDesc served from cbuffer
27+
28+
// #define RD0 1
29+
#define RD1 1
30+
#define HIT1 1
31+
#define HIT2 1
32+
// #define HIT3 1
33+
#define HIT4 1
34+
35+
// CBUFFER: %[[LD00:[^ ]+]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %[[CBH:[^ ]+]], i32 0) ; CBufferLoadLegacy(handle,regIndex)
36+
// CBUFFER: %[[RD0O0:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD00]], 0
37+
// CBUFFER: %[[RD0O1:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD00]], 1
38+
// CBUFFER: %[[RD0O2:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD00]], 2
39+
// CBUFFER: %[[RD0MIN:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD00]], 3
40+
// CBUFFER: %[[LD01:[^ ]+]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %[[CBH]], i32 1) ; CBufferLoadLegacy(handle,regIndex)
41+
// CBUFFER: %[[RD0D0:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD01]], 0
42+
// CBUFFER: %[[RD0D1:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD01]], 1
43+
// CBUFFER: %[[RD0D2:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD01]], 2
44+
// CBUFFER: %[[RD0MAX:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD01]], 3
45+
// CBUFFER: %{{[^ ]+}} = call %dx.types.HitObject @dx.op.hitObject_MakeMiss(i32 265, i32 0, i32 0, float %[[RD0O0]], float %[[RD0O1]], float %[[RD0O2]], float %[[RD0MIN]], float %[[RD0D0]], float %[[RD0D1]], float %[[RD0D2]], float %[[RD0MAX]]) ; HitObject_MakeMiss(RayFlags,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax)
46+
47+
// CBUFFER: %[[LD10:[^ ]+]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %[[CBH]], i32 0) ; CBufferLoadLegacy(handle,regIndex)
48+
// CBUFFER: %[[RD1O0:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD10]], 0
49+
// CBUFFER: %[[RD1O1:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD10]], 1
50+
// CBUFFER: %[[RD1O2:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD10]], 2
51+
// CBUFFER: %[[RD1MIN:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD10]], 3
52+
// CBUFFER: %[[LD11:[^ ]+]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %[[CBH]], i32 1) ; CBufferLoadLegacy(handle,regIndex)
53+
// CBUFFER: %[[RD1D0:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD11]], 0
54+
// CBUFFER: %[[RD1D1:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD11]], 1
55+
// CBUFFER: %[[RD1D2:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD11]], 2
56+
// CBUFFER: %[[RD1MAX:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD11]], 3
57+
// CBUFFER: %{{[^ ]+}} = call %dx.types.HitObject @dx.op.hitObject_TraceRay.struct.PerRayData(i32 262, %dx.types.Handle %{{[^ ]+}}, i32 256, i32 255, i32 0, i32 0, i32 0, float %[[RD1O0]], float %[[RD1O1]], float %[[RD1O2]], float %[[RD1MIN]], float %[[RD1D0]], float %[[RD1D1]], float %[[RD1D2]], float %[[RD1MAX]], %struct.PerRayData* nonnull %{{[^ ]+}}) ; HitObject_TraceRay(accelerationStructure,rayFlags,instanceInclusionMask,rayContributionToHitGroupIndex,multiplierForGeometryContributionToHitGroupIndex,missShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload)
58+
59+
// CBUFFER: %[[LD20:[^ ]+]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %[[CBH]], i32 0) ; CBufferLoadLegacy(handle,regIndex)
60+
// CBUFFER: %[[RD2O0:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD20]], 0
61+
// CBUFFER: %[[RD2O1:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD20]], 1
62+
// CBUFFER: %[[RD2O2:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD20]], 2
63+
// CBUFFER: %[[RD2MIN:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD20]], 3
64+
// CBUFFER: %[[LD21:[^ ]+]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %[[CBH]], i32 1) ; CBufferLoadLegacy(handle,regIndex)
65+
// CBUFFER: %[[RD2D0:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD21]], 0
66+
// CBUFFER: %[[RD2D1:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD21]], 1
67+
// CBUFFER: %[[RD2D2:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD21]], 2
68+
// CBUFFER: %[[RD2MAX:[^ ]+]] = extractvalue %dx.types.CBufRet.f32 %[[LD21]], 3
69+
// CBUFFER: call void @dx.op.traceRay.struct.PerRayData(i32 157, %dx.types.Handle %{{[^ ]+}}, i32 256, i32 255, i32 0, i32 0, i32 0, float %[[RD2O0]], float %[[RD2O1]], float %[[RD2O2]], float %[[RD2MIN]], float %[[RD2D0]], float %[[RD2D1]], float %[[RD2D2]], float %[[RD2MAX]], %struct.PerRayData* nonnull %{{[^ ]+}}) ; TraceRay(AccelerationStructure,RayFlags,InstanceInclusionMask,RayContributionToHitGroupIndex,MultiplierForGeometryContributionToShaderIndex,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload)
70+
71+
#endif
72+
73+
#if PRESET_CBUFFER_RAYDESC
74+
// TraceRayInline with RayDesc from cbuffer
75+
// Lowering broken
76+
77+
// #define RD0 1
78+
#define RD1 1
79+
// #define HIT1 1
80+
// #define HIT2 1
81+
#define HIT3 1
82+
// #define HIT4 1
83+
#endif
84+
85+
86+
struct[raypayload] PerRayData
87+
{
88+
};
89+
90+
RaytracingAccelerationStructure topObject : register(t0);
91+
92+
#if RD1
93+
RayDesc ray;
94+
#endif
95+
96+
[shader("raygeneration")]
97+
void raygen()
98+
{
99+
#if RD0
100+
RayDesc ray = {{0, 1, 2}, 3, {4, 5, 6}, 7};
101+
#endif
102+
103+
PerRayData payload;
104+
#if HIT1
105+
dx::HitObject hit1 = dx::HitObject::MakeMiss(RAY_FLAG_NONE, 0, ray);
106+
dx::MaybeReorderThread(hit1);
107+
#endif
108+
#if HIT2
109+
dx::HitObject hit2 = dx::HitObject::TraceRay(topObject, RAY_FLAG_SKIP_TRIANGLES, 0xFF, 0, 0, 0, ray, payload);
110+
dx::MaybeReorderThread(hit2);
111+
#endif
112+
#if HIT3
113+
RayQuery<RAY_FLAG_NONE> rayQuery;
114+
rayQuery.TraceRayInline(topObject, RAY_FLAG_NONE, 0xFF, ray);
115+
dx::HitObject hit3 = dx::HitObject::FromRayQuery(rayQuery);
116+
dx::MaybeReorderThread(hit3);
117+
#endif
118+
#if HIT4
119+
TraceRay(topObject, RAY_FLAG_SKIP_TRIANGLES, 0xFF, 0, 0, 0, ray, payload);
120+
#endif
121+
}

tools/clang/test/DXC/Passes/ScalarReplHLSL/hitobject_make_scalarrepl.ll

+20-10
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,16 @@ entry:
3333
%hit = alloca %dx.types.HitObject, align 4
3434
%tmp = alloca %dx.types.HitObject, align 4
3535
%ray = alloca %struct.RayDesc, align 4
36-
; CHECK-NOT: %{{[^ ]+}} = alloca %struct.RayDesc
36+
; CHECK: %[[RDA:[^ ]+]] = alloca %struct.RayDesc
37+
; CHECK: %[[RDO:[^ ]+]] = alloca <3 x float>
38+
; CHECK: %[[RDMIN:[^ ]+]] = alloca float
39+
; CHECK: %[[RDD:[^ ]+]] = alloca <3 x float>
40+
; CHECK: %[[RDTMAX:[^ ]+]] = alloca float
3741
%tmp2 = alloca %dx.types.HitObject, align 4
3842
; CHECK: %[[HIT0:[^ ]+]] = alloca %dx.types.HitObject, align 4
3943
; CHECK: %[[HIT1:[^ ]+]] = alloca %dx.types.HitObject, align 4
4044
; CHECK: %[[HIT2:[^ ]+]] = alloca %dx.types.HitObject, align 4
45+
; CHECK-NOT: alloca
4146
%0 = bitcast %dx.types.HitObject* %hit to i8*, !dbg !23 ; line:42 col:3
4247
call void @llvm.lifetime.start(i64 4, i8* %0) #0, !dbg !23 ; line:42 col:3
4348
; CHECK: %[[THIS0:[^ ]+]] = call %dx.types.HitObject* @"dx.hl.op..%dx.types.HitObject* (i32, %dx.types.HitObject*)"(i32 358, %dx.types.HitObject* %[[HIT0]])
@@ -61,15 +66,20 @@ entry:
6166
store float 1.000000e+03, float* %8, !dbg !30 ; line:44 col:17
6267
%9 = bitcast %dx.types.HitObject* %tmp2 to i8*, !dbg !31 ; line:45 col:3
6368
call void @llvm.lifetime.start(i64 4, i8* %9) #0, !dbg !31 ; line:45 col:3
64-
; CHECK: store <3 x float> zeroinitializer, <3 x float>* %[[pRDO:[^ ]+]],
65-
; CHECK: store float 0.000000e+00, float* %[[pRDTMIN:[^ ]+]],
66-
; CHECK: store <3 x float> <float 0.000000e+00, float 1.000000e+00, float 0x3FA99999A0000000>, <3 x float>* %[[pRDD:[^ ]+]],
67-
; CHECK: store float 1.000000e+03, float* %[[pRDTMAX:[^ ]+]],
68-
; CHECK-DAG: %[[RDO:[^ ]+]] = load <3 x float>, <3 x float>* %[[pRDO]],
69-
; CHECK-DAG: %[[RDTMIN:[^ ]+]] = load float, float* %[[pRDTMIN]],
70-
; CHECK-DAG: %[[RDD:[^ ]+]] = load <3 x float>, <3 x float>* %[[pRDD]],
71-
; CHECK-DAG: %[[RDTMAX:[^ ]+]] = load float, float* %[[pRDTMAX]],
72-
; CHECK: call void @"dx.hl.op..void (i32, %dx.types.HitObject*, i32, i32, <3 x float>, float, <3 x float>, float)"(i32 387, %dx.types.HitObject* %[[HIT2]], i32 0, i32 1, <3 x float> %[[RDO]], float %[[RDTMIN]], <3 x float> %[[RDD]], float %[[RDTMAX]])
69+
; CHECK: %[[OPTR:[^ ]+]] = getelementptr inbounds %struct.RayDesc, %struct.RayDesc* %[[RDA]], i32 0, i32 0
70+
; CHECK: %[[O:[^ ]+]] = load <3 x float>, <3 x float>* %[[RDO]]
71+
; CHECK: store <3 x float> %[[O]], <3 x float>* %[[OPTR]]
72+
; CHECK: %[[MINPTR:[^ ]+]] = getelementptr inbounds %struct.RayDesc, %struct.RayDesc* %[[RDA]], i32 0, i32 1
73+
; CHECK: %[[MIN:[^ ]+]] = load float, float* %[[RDMIN]]
74+
; CHECK: store float %[[MIN]], float* %[[MINPTR]]
75+
; CHECK: %[[DIRPTR:[^ ]+]] = getelementptr inbounds %struct.RayDesc, %struct.RayDesc* %[[RDA]], i32 0, i32 2
76+
; CHECK: %[[DIR:[^ ]+]] = load <3 x float>, <3 x float>* %[[RDD]]
77+
; CHECK: store <3 x float> %[[DIR]], <3 x float>* %[[DIRPTR]]
78+
; CHECK: %[[MAXPTR:[^ ]+]] = getelementptr inbounds %struct.RayDesc, %struct.RayDesc* %[[RDA]], i32 0, i32 3
79+
; CHECK: %[[MAX:[^ ]+]] = load float, float* %[[RDTMAX]]
80+
; CHECK: store float %[[MAX]], float* %[[MAXPTR]]
81+
; CHECK: call void @"dx.hl.op..void (i32, %dx.types.HitObject*, i32, i32, %struct.RayDesc*)"(i32 387, %dx.types.HitObject* %[[HIT2]], i32 0, i32 1, %struct.RayDesc* %[[RDA]])
82+
7383
call void @"dx.hl.op..void (i32, %dx.types.HitObject*, i32, i32, %struct.RayDesc*)"(i32 387, %dx.types.HitObject* %tmp2, i32 0, i32 1, %struct.RayDesc* %ray), !dbg !31 ; line:45 col:3
7484
%10 = bitcast %dx.types.HitObject* %tmp2 to i8*, !dbg !31 ; line:45 col:3
7585
call void @llvm.lifetime.end(i64 4, i8* %10) #0, !dbg !31 ; line:45 col:3

0 commit comments

Comments
 (0)