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