|
| 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