Skip to content

Commit 9536291

Browse files
authored
[SER] Validate HitObject::TraceRay|Invoke (microsoft#7384)
Validate: HitObject_Invoke HitObject_TraceRay Rules: No undef params Resource handle must be AS SER implementation tracker: microsoft#7214
1 parent a4f8cf9 commit 9536291

File tree

4 files changed

+295
-0
lines changed

4 files changed

+295
-0
lines changed

lib/DxilValidation/DxilValidation.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2298,6 +2298,21 @@ static void ValidateDxilOperationCallInProfile(CallInst *CI,
22982298
break;
22992299
}
23002300

2301+
case DXIL::OpCode::HitObject_Invoke: {
2302+
if (isa<UndefValue>(CI->getArgOperand(1)))
2303+
ValCtx.EmitInstrError(CI, ValidationRule::InstrUndefHitObject);
2304+
if (isa<UndefValue>(CI->getArgOperand(2)))
2305+
ValCtx.EmitInstrError(CI, ValidationRule::InstrNoReadingUninitialized);
2306+
} break;
2307+
case DXIL::OpCode::HitObject_TraceRay: {
2308+
Value *Hdl = CI->getArgOperand(
2309+
DxilInst_HitObject_TraceRay::arg_accelerationStructure);
2310+
ValidateASHandle(CI, Hdl, ValCtx);
2311+
for (unsigned ArgIdx = 2; ArgIdx < CI->getNumArgOperands(); ++ArgIdx)
2312+
if (isa<UndefValue>(CI->getArgOperand(ArgIdx)))
2313+
ValCtx.EmitInstrError(CI, ValidationRule::InstrNoReadingUninitialized);
2314+
DxilInst_HitObject_TraceRay HOTraceRay(CI);
2315+
} break;
23012316
case DXIL::OpCode::AtomicBinOp:
23022317
case DXIL::OpCode::AtomicCompareExchange: {
23032318
Type *pOverloadType = OP::GetOverloadType(Opcode, CI->getCalledFunction());
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
; REQUIRES: dxil-1-9
2+
; RUN: not %dxv %s 2>&1 | FileCheck %s
3+
4+
target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
5+
target triple = "dxil-ms-dx"
6+
7+
%struct.Payload = type { <3 x float> }
8+
%dx.types.HitObject = type { i8* }
9+
10+
; CHECK: Function: ?main@@YAXXZ: error: Instructions should not read uninitialized value.
11+
; CHECK-NEXT: note: at 'call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject %nop, %struct.Payload* nonnull undef)' in block '#0' of function '?main@@YAXXZ'.
12+
; CHECK-NEXT: Function: ?main@@YAXXZ: error: HitObject is undef.
13+
; CHECK-NEXT: note: at 'call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject undef, %struct.Payload* nonnull %pld)' in block '#0' of function '?main@@YAXXZ'.
14+
15+
; CHECK-NEXT: Validation failed.
16+
17+
; Function Attrs: nounwind
18+
define void @"\01?main@@YAXXZ"() #0 {
19+
%pld = alloca %struct.Payload, align 4
20+
%nop = call %dx.types.HitObject @dx.op.hitObject_MakeNop(i32 266) ; HitObject_MakeNop()
21+
call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject %nop, %struct.Payload* nonnull %pld) ; HitObject_Invoke(hitObject,payload)
22+
call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject undef, %struct.Payload* nonnull %pld) ; HitObject_Invoke(hitObject,payload)
23+
call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject %nop, %struct.Payload* nonnull undef) ; HitObject_Invoke(hitObject,payload)
24+
25+
ret void
26+
}
27+
28+
; Function Attrs: nounwind readnone
29+
declare %dx.types.HitObject @dx.op.hitObject_MakeNop(i32) #1
30+
31+
; Function Attrs: nounwind
32+
declare void @dx.op.hitObject_Invoke.struct.Payload(i32, %dx.types.HitObject, %struct.Payload*) #0
33+
34+
attributes #0 = { nounwind }
35+
attributes #1 = { nounwind readnone }
36+
attributes #2 = { nounwind readonly }
37+
38+
!dx.version = !{!0}
39+
!dx.valver = !{!0}
40+
!dx.shaderModel = !{!1}
41+
!dx.typeAnnotations = !{!2}
42+
!dx.dxrPayloadAnnotations = !{!3}
43+
!dx.entryPoints = !{!4, !6}
44+
45+
!0 = !{i32 1, i32 9}
46+
!1 = !{!"lib", i32 6, i32 9}
47+
!2 = !{i32 1, void ()* @"\01?main@@YAXXZ", !7}
48+
!3 = !{i32 0, %struct.Payload undef, !8}
49+
!4 = !{null, !"", null, null, !5}
50+
!5 = !{i32 0, i64 0}
51+
!6 = !{void ()* @"\01?main@@YAXXZ", !"\01?main@@YAXXZ", null, null, !9}
52+
!7 = !{!10}
53+
!8 = !{!11}
54+
!9 = !{i32 8, i32 7, i32 5, !12}
55+
!10 = !{i32 1, !13, !13}
56+
!11 = !{i32 0, i32 8210}
57+
!12 = !{i32 0}
58+
!13 = !{}

0 commit comments

Comments
 (0)