Skip to content

Commit 0399c6f

Browse files
committed
add dxil prepare pass
1 parent c1a89d6 commit 0399c6f

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
; RUN: opt -S --dxil-prepare %s | FileCheck %s
2+
3+
source_filename = "C:\\Users\\jbatista\\Desktop\\particle_life.hlsl"
4+
target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64"
5+
target triple = "dxilv1.0-unknown-shadermodel6.0-compute"
6+
7+
%StructuredBuffer = type { <4 x i32> }
8+
%StructuredBuffer.1 = type { <4 x float> }
9+
%RWStructuredBuffer = type { <4 x float> }
10+
%dx.types.Handle = type { ptr }
11+
%dx.types.ResRet.i32 = type { i32, i32, i32, i32, i32 }
12+
%dx.types.ResRet.f32 = type { float, float, float, float, i32 }
13+
14+
@0 = external constant %StructuredBuffer
15+
@1 = external constant %StructuredBuffer.1
16+
@2 = external constant %RWStructuredBuffer
17+
18+
; Function Attrs: noinline nounwind memory(readwrite, inaccessiblemem: none)
19+
define void @main() local_unnamed_addr #0 {
20+
entry:
21+
%_ZL1X_h.i.i3 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false) #1
22+
%0 = call i32 @dx.op.threadId.i32(i32 93, i32 0) #2
23+
%1 = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle %_ZL1X_h.i.i3, i32 %0, i32 0) #1
24+
%2 = extractvalue %dx.types.ResRet.i32 %1, 0
25+
%cmp.i1.not = icmp eq i32 %2, 0
26+
br i1 %cmp.i1.not, label %_Z4mainDv3_j.exit, label %for.body.i.lr.ph
27+
28+
for.body.i.lr.ph: ; preds = %entry
29+
%_ZL3Out_h.i.i5 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 0, i1 false) #1
30+
%_ZL2In_h.i.i4 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 1, i32 1, i1 false) #1
31+
%3 = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle %_ZL2In_h.i.i4, i32 %0, i32 0) #1
32+
%4 = extractvalue %dx.types.ResRet.f32 %3, 0
33+
%5 = extractvalue %dx.types.ResRet.f32 %3, 1
34+
%6 = extractvalue %dx.types.ResRet.f32 %3, 2
35+
%7 = extractvalue %dx.types.ResRet.f32 %3, 3
36+
br label %for.body.i
37+
38+
for.body.i: ; preds = %for.body.i.lr.ph, %for.body.i
39+
%I.0.i2 = phi i32 [ 0, %for.body.i.lr.ph ], [ %inc.i, %for.body.i ]
40+
call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle %_ZL3Out_h.i.i5, i32 %0, i32 0, float %4, float %5, float %6, float %7, i8 15)
41+
%inc.i = add nuw i32 %I.0.i2, 1
42+
%8 = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle %_ZL1X_h.i.i3, i32 %0, i32 0) #1
43+
%9 = extractvalue %dx.types.ResRet.i32 %8, 0
44+
; CHECK: %cmp.i = icmp ult i32 %inc.i, %9
45+
; CHECK-NEXT: br i1 %cmp.i, label %for.body.i, label %_Z4mainDv3_j.exit
46+
%cmp.i = icmp ult i32 %inc.i, %9
47+
br i1 %cmp.i, label %for.body.i, label %_Z4mainDv3_j.exit, !llvm.loop !16
48+
49+
_Z4mainDv3_j.exit: ; preds = %for.body.i, %entry
50+
ret void
51+
52+
; uselistorder directives
53+
uselistorder %dx.types.Handle %_ZL1X_h.i.i3, { 1, 0 }
54+
uselistorder i32 %0, { 3, 0, 1, 2 }
55+
uselistorder label %for.body.i, { 1, 0 }
56+
}
57+
58+
declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1)
59+
60+
declare i32 @dx.op.threadId.i32(i32, i32)
61+
62+
declare %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32, %dx.types.Handle, i32, i32)
63+
64+
declare %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32, %dx.types.Handle, i32, i32)
65+
66+
declare void @dx.op.bufferStore.f32(i32, %dx.types.Handle, i32, i32, float, float, float, float, i8)
67+
68+
; uselistorder directives
69+
uselistorder i32 57, { 1, 0, 2 }
70+
uselistorder i32 0, { 3, 0, 10, 1, 5, 6, 9, 2, 4, 7, 8 }
71+
uselistorder i1 false, { 1, 0, 2 }
72+
uselistorder i32 68, { 2, 0, 1 }
73+
uselistorder i32 1, { 2, 0, 1 }
74+
uselistorder ptr @dx.op.createHandle, { 2, 0, 1 }
75+
76+
attributes #0 = { noinline nounwind memory(readwrite, inaccessiblemem: none) }
77+
attributes #1 = { memory(read) }
78+
attributes #2 = { memory(none) }
79+
80+
!dx.valver = !{!0}
81+
!llvm.ident = !{!1}
82+
!dx.shaderModel = !{!2}
83+
!dx.version = !{!3}
84+
!dx.resources = !{!4}
85+
!dx.entryPoints = !{!11}
86+
!llvm.module.flags = !{!14, !15}
87+
88+
!0 = !{i32 1, i32 8}
89+
!1 = !{!"clang version 21.0.0git (https://github.com/llvm/llvm-project.git 9ed4c705ac1c5c8797f328694f6cd22fbcdae03b)"}
90+
!2 = !{!"cs", i32 6, i32 0}
91+
!3 = !{i32 1, i32 0}
92+
!4 = !{!5, !9, null, null}
93+
!5 = !{!6, !8}
94+
!6 = !{i32 0, ptr @0, !"", i32 0, i32 0, i32 1, i32 12, i32 0, !7}
95+
!7 = !{i32 1, i32 16}
96+
!8 = !{i32 1, ptr @1, !"", i32 0, i32 1, i32 1, i32 12, i32 0, !7}
97+
!9 = !{!10}
98+
!10 = !{i32 0, ptr @2, !"", i32 0, i32 0, i32 1, i32 12, i1 false, i1 false, i1 false, !7}
99+
!11 = !{ptr @main, !"main", null, !4, !12}
100+
!12 = !{i32 0, i64 16, i32 4, !13}
101+
!13 = !{i32 1, i32 1, i32 1}
102+
!14 = !{i32 1, !"wchar_size", i32 4}
103+
; CHECK: !15 = !{i32 2, !"frame-pointer", i32 2}
104+
; this next line checks that nothing comes after the above check line.
105+
; No more metadata should be necessary after !15, the rest should be removed.
106+
; CHECK-NOT: .
107+
!15 = !{i32 2, !"frame-pointer", i32 2}
108+
!16 = distinct !{!16, !17}
109+
!17 = !{!"llvm.loop.mustprogress"}

0 commit comments

Comments
 (0)