Skip to content

Commit 3bf6305

Browse files
authored
[SER] Validate %dx.types.HitObject as legal type same as handle (#7390)
Validator did not recognize %dx.types.HitObject as an allowed type. This lead to validation failures in -Od compiles where allocas, loads and stores remain in the generated DXIL: ``` dxc.exe -T lib_6_9 -Od \tools\clang\test\CodeGenDXIL\hlsl\intrinsics\maybereorder.hlsl error: validation errors error: Declaration '%dx.types.HitObject = type { i8* }' uses a reserved prefix. ``` Closes #7387
1 parent 7522097 commit 3bf6305

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

lib/DxilValidation/DxilValidation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,6 +2599,9 @@ static bool ValidateType(Type *Ty, ValidationContext &ValCtx,
25992599
if (ValCtx.HandleTy == Ty)
26002600
return true;
26012601
hlsl::OP *HlslOP = ValCtx.DxilMod.GetOP();
2602+
// Allow HitObject type.
2603+
if (ST == HlslOP->GetHitObjectType())
2604+
return true;
26022605
if (IsDxilBuiltinStructType(ST, HlslOP)) {
26032606
ValCtx.EmitTypeError(Ty, ValidationRule::InstrDxilStructUser);
26042607
Result = false;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %dxc -T lib_6_9 -E main %s -Od | FileCheck %s --check-prefix DXIL
2+
3+
// DXIL: %[[HOA:[^ ]+]] = alloca %dx.types.HitObject, align 4
4+
// DXIL-NEXT: %[[NOP:[^ ]+]] = call %dx.types.HitObject @dx.op.hitObject_MakeNop(i32 266) ; HitObject_MakeNop()
5+
// DXIL-NEXT: store %dx.types.HitObject %[[NOP]], %dx.types.HitObject* %[[HOA]]
6+
// DXIL-NEXT: %[[LD0:[^ ]+]] = load %dx.types.HitObject, %dx.types.HitObject* %[[HOA]]
7+
// DXIL-NEXT: call void @dx.op.maybeReorderThread(i32 268, %dx.types.HitObject %[[LD0]], i32 undef, i32 0) ; MaybeReorderThread(hitObject,coherenceHint,numCoherenceHintBitsFromLSB)
8+
// DXIL-NEXT: %[[LD1:[^ ]+]] = load %dx.types.HitObject, %dx.types.HitObject* %[[HOA]]
9+
// DXIL-NEXT: call void @dx.op.maybeReorderThread(i32 268, %dx.types.HitObject %[[LD1]], i32 241, i32 3) ; MaybeReorderThread(hitObject,coherenceHint,numCoherenceHintBitsFromLSB)
10+
// DXIL-NEXT: %[[NOP2:[^ ]+]] = call %dx.types.HitObject @dx.op.hitObject_MakeNop(i32 266) ; HitObject_MakeNop()
11+
// DXIL-NEXT: call void @dx.op.maybeReorderThread(i32 268, %dx.types.HitObject %[[NOP2]], i32 242, i32 7) ; MaybeReorderThread(hitObject,coherenceHint,numCoherenceHintBitsFromLSB)
12+
13+
[shader("raygeneration")]
14+
void main() {
15+
dx::HitObject hit;
16+
dx::MaybeReorderThread(hit);
17+
dx::MaybeReorderThread(hit, 0xf1, 3);
18+
dx::MaybeReorderThread(0xf2, 7);
19+
}

0 commit comments

Comments
 (0)