1; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s 2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} 3 4 5define spir_func noundef i32 @test_branch(i32 noundef %X) { 6entry: 7; CHECK-LABEL: ; -- Begin function test_branch 8; OpSelectionMerge %[[#]] DontFlatten 9 %X.addr = alloca i32, align 4 10 %resp = alloca i32, align 4 11 store i32 %X, ptr %X.addr, align 4 12 %0 = load i32, ptr %X.addr, align 4 13 %cmp = icmp sgt i32 %0, 0 14 br i1 %cmp, label %if.then, label %if.else, !hlsl.controlflow.hint !0 15 16if.then: ; preds = %entry 17 %1 = load i32, ptr %X.addr, align 4 18 %sub = sub nsw i32 0, %1 19 store i32 %sub, ptr %resp, align 4 20 br label %if.end 21 22if.else: ; preds = %entry 23 %2 = load i32, ptr %X.addr, align 4 24 %mul = mul nsw i32 %2, 2 25 store i32 %mul, ptr %resp, align 4 26 br label %if.end 27 28if.end: ; preds = %if.else, %if.then 29 %3 = load i32, ptr %resp, align 4 30 ret i32 %3 31} 32 33 34define spir_func noundef i32 @test_flatten(i32 noundef %X) { 35entry: 36; CHECK-LABEL: ; -- Begin function test_flatten 37; OpSelectionMerge %[[#]] Flatten 38 %X.addr = alloca i32, align 4 39 %resp = alloca i32, align 4 40 store i32 %X, ptr %X.addr, align 4 41 %0 = load i32, ptr %X.addr, align 4 42 %cmp = icmp sgt i32 %0, 0 43 br i1 %cmp, label %if.then, label %if.else, !hlsl.controlflow.hint !1 44 45if.then: ; preds = %entry 46 %1 = load i32, ptr %X.addr, align 4 47 %sub = sub nsw i32 0, %1 48 store i32 %sub, ptr %resp, align 4 49 br label %if.end 50 51if.else: ; preds = %entry 52 %2 = load i32, ptr %X.addr, align 4 53 %mul = mul nsw i32 %2, 2 54 store i32 %mul, ptr %resp, align 4 55 br label %if.end 56 57if.end: ; preds = %if.else, %if.then 58 %3 = load i32, ptr %resp, align 4 59 ret i32 %3 60} 61 62define spir_func noundef i32 @test_no_attr(i32 noundef %X) { 63entry: 64; CHECK-LABEL: ; -- Begin function test_no_attr 65; OpSelectionMerge %[[#]] None 66 %X.addr = alloca i32, align 4 67 %resp = alloca i32, align 4 68 store i32 %X, ptr %X.addr, align 4 69 %0 = load i32, ptr %X.addr, align 4 70 %cmp = icmp sgt i32 %0, 0 71 br i1 %cmp, label %if.then, label %if.else 72 73if.then: ; preds = %entry 74 %1 = load i32, ptr %X.addr, align 4 75 %sub = sub nsw i32 0, %1 76 store i32 %sub, ptr %resp, align 4 77 br label %if.end 78 79if.else: ; preds = %entry 80 %2 = load i32, ptr %X.addr, align 4 81 %mul = mul nsw i32 %2, 2 82 store i32 %mul, ptr %resp, align 4 83 br label %if.end 84 85if.end: ; preds = %if.else, %if.then 86 %3 = load i32, ptr %resp, align 4 87 ret i32 %3 88} 89 90!0 = !{!"hlsl.controlflow.hint", i32 1} 91!1 = !{!"hlsl.controlflow.hint", i32 2} 92