xref: /llvm-project/llvm/test/CodeGen/SPIRV/structurizer/HLSLControlFlowHint.ll (revision 380bb51b70b6d9f3da07a87f56fc3fe44bc78691)
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