1; RUN: opt -S -dxil-op-lower -dxil-translate-metadata -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s 2 3; This test make sure LLVM metadata is being translated into DXIL. 4 5 6; CHECK: define i32 @test_branch(i32 %X) 7; CHECK-NOT: hlsl.controlflow.hint 8; CHECK: br i1 %cmp, label %if.then, label %if.else, !dx.controlflow.hints [[HINT_BRANCH:![0-9]+]] 9define i32 @test_branch(i32 %X) { 10entry: 11 %X.addr = alloca i32, align 4 12 %resp = alloca i32, align 4 13 store i32 %X, ptr %X.addr, align 4 14 %0 = load i32, ptr %X.addr, align 4 15 %cmp = icmp sgt i32 %0, 0 16 br i1 %cmp, label %if.then, label %if.else, !hlsl.controlflow.hint !0 17 18if.then: ; preds = %entry 19 %1 = load i32, ptr %X.addr, align 4 20 %sub = sub nsw i32 0, %1 21 store i32 %sub, ptr %resp, align 4 22 br label %if.end 23 24if.else: ; preds = %entry 25 %2 = load i32, ptr %X.addr, align 4 26 %mul = mul nsw i32 %2, 2 27 store i32 %mul, ptr %resp, align 4 28 br label %if.end 29 30if.end: ; preds = %if.else, %if.then 31 %3 = load i32, ptr %resp, align 4 32 ret i32 %3 33} 34 35 36; CHECK: define i32 @test_flatten(i32 %X) 37; CHECK-NOT: hlsl.controlflow.hint 38; CHECK: br i1 %cmp, label %if.then, label %if.else, !dx.controlflow.hints [[HINT_FLATTEN:![0-9]+]] 39define i32 @test_flatten(i32 %X) { 40entry: 41 %X.addr = alloca i32, align 4 42 %resp = alloca i32, align 4 43 store i32 %X, ptr %X.addr, align 4 44 %0 = load i32, ptr %X.addr, align 4 45 %cmp = icmp sgt i32 %0, 0 46 br i1 %cmp, label %if.then, label %if.else, !hlsl.controlflow.hint !1 47 48if.then: ; preds = %entry 49 %1 = load i32, ptr %X.addr, align 4 50 %sub = sub nsw i32 0, %1 51 store i32 %sub, ptr %resp, align 4 52 br label %if.end 53 54if.else: ; preds = %entry 55 %2 = load i32, ptr %X.addr, align 4 56 %mul = mul nsw i32 %2, 2 57 store i32 %mul, ptr %resp, align 4 58 br label %if.end 59 60if.end: ; preds = %if.else, %if.then 61 %3 = load i32, ptr %resp, align 4 62 ret i32 %3 63} 64 65 66; CHECK: define i32 @test_no_attr(i32 %X) 67; CHECK-NOT: hlsl.controlflow.hint 68; CHECK-NOT: !dx.controlflow.hints 69define i32 @test_no_attr(i32 %X) { 70entry: 71 %X.addr = alloca i32, align 4 72 %resp = alloca i32, align 4 73 store i32 %X, ptr %X.addr, align 4 74 %0 = load i32, ptr %X.addr, align 4 75 %cmp = icmp sgt i32 %0, 0 76 br i1 %cmp, label %if.then, label %if.else 77 78if.then: ; preds = %entry 79 %1 = load i32, ptr %X.addr, align 4 80 %sub = sub nsw i32 0, %1 81 store i32 %sub, ptr %resp, align 4 82 br label %if.end 83 84if.else: ; preds = %entry 85 %2 = load i32, ptr %X.addr, align 4 86 %mul = mul nsw i32 %2, 2 87 store i32 %mul, ptr %resp, align 4 88 br label %if.end 89 90if.end: ; preds = %if.else, %if.then 91 %3 = load i32, ptr %resp, align 4 92 ret i32 %3 93} 94; CHECK-NOT: hlsl.controlflow.hint 95; CHECK: [[HINT_BRANCH]] = !{!"dx.controlflow.hints", i32 1} 96; CHECK: [[HINT_FLATTEN]] = !{!"dx.controlflow.hints", i32 2} 97!0 = !{!"hlsl.controlflow.hint", i32 1} 98!1 = !{!"hlsl.controlflow.hint", i32 2} 99