5
5
define spir_func noundef i32 @test_branch (i32 noundef %X ) {
6
6
entry:
7
7
; CHECK-LABEL: ; -- Begin function test_branch
8
- ; OpSelectionMerge %[[#]] DontFlatten
8
+ ; CHECK: OpSelectionMerge %[[#]] DontFlatten
9
9
%X.addr = alloca i32 , align 4
10
10
%resp = alloca i32 , align 4
11
11
store i32 %X , ptr %X.addr , align 4
@@ -34,7 +34,7 @@ if.end: ; preds = %if.else, %if.then
34
34
define spir_func noundef i32 @test_flatten (i32 noundef %X ) {
35
35
entry:
36
36
; CHECK-LABEL: ; -- Begin function test_flatten
37
- ; OpSelectionMerge %[[#]] Flatten
37
+ ; CHECK: OpSelectionMerge %[[#]] Flatten
38
38
%X.addr = alloca i32 , align 4
39
39
%resp = alloca i32 , align 4
40
40
store i32 %X , ptr %X.addr , align 4
@@ -62,7 +62,7 @@ if.end: ; preds = %if.else, %if.then
62
62
define spir_func noundef i32 @test_no_attr (i32 noundef %X ) {
63
63
entry:
64
64
; CHECK-LABEL: ; -- Begin function test_no_attr
65
- ; OpSelectionMerge %[[#]] None
65
+ ; CHECK: OpSelectionMerge %[[#]] None
66
66
%X.addr = alloca i32 , align 4
67
67
%resp = alloca i32 , align 4
68
68
store i32 %X , ptr %X.addr , align 4
@@ -87,5 +87,124 @@ if.end: ; preds = %if.else, %if.then
87
87
ret i32 %3
88
88
}
89
89
90
+ define spir_func noundef i32 @flatten_switch (i32 noundef %X ) {
91
+ entry:
92
+ ; CHECK-LABEL: ; -- Begin function flatten_switch
93
+ ; CHECK: OpSelectionMerge %[[#]] Flatten
94
+ %X.addr = alloca i32 , align 4
95
+ %resp = alloca i32 , align 4
96
+ store i32 %X , ptr %X.addr , align 4
97
+ %0 = load i32 , ptr %X.addr , align 4
98
+ switch i32 %0 , label %sw.epilog [
99
+ i32 0 , label %sw.bb
100
+ i32 1 , label %sw.bb1
101
+ i32 2 , label %sw.bb2
102
+ ], !hlsl.controlflow.hint !1
103
+
104
+ sw.bb: ; preds = %entry
105
+ %1 = load i32 , ptr %X.addr , align 4
106
+ %sub = sub nsw i32 0 , %1
107
+ store i32 %sub , ptr %resp , align 4
108
+ br label %sw.epilog
109
+
110
+ sw.bb1: ; preds = %entry
111
+ %2 = load i32 , ptr %X.addr , align 4
112
+ %3 = load i32 , ptr %X.addr , align 4
113
+ %add = add nsw i32 %2 , %3
114
+ store i32 %add , ptr %resp , align 4
115
+ br label %sw.epilog
116
+
117
+ sw.bb2: ; preds = %entry
118
+ %4 = load i32 , ptr %X.addr , align 4
119
+ %5 = load i32 , ptr %X.addr , align 4
120
+ %mul = mul nsw i32 %4 , %5
121
+ store i32 %mul , ptr %resp , align 4
122
+ br label %sw.epilog
123
+
124
+ sw.epilog: ; preds = %entry, %sw.bb2, %sw.bb1, %sw.bb
125
+ %6 = load i32 , ptr %resp , align 4
126
+ ret i32 %6
127
+ }
128
+
129
+
130
+ define spir_func noundef i32 @branch_switch (i32 noundef %X ) {
131
+ entry:
132
+ ; CHECK-LABEL: ; -- Begin function branch_switch
133
+ ; CHECK: OpSelectionMerge %[[#]] DontFlatten
134
+ %X.addr = alloca i32 , align 4
135
+ %resp = alloca i32 , align 4
136
+ store i32 %X , ptr %X.addr , align 4
137
+ %0 = load i32 , ptr %X.addr , align 4
138
+ switch i32 %0 , label %sw.epilog [
139
+ i32 0 , label %sw.bb
140
+ i32 1 , label %sw.bb1
141
+ i32 2 , label %sw.bb2
142
+ ], !hlsl.controlflow.hint !0
143
+
144
+ sw.bb: ; preds = %entry
145
+ %1 = load i32 , ptr %X.addr , align 4
146
+ %sub = sub nsw i32 0 , %1
147
+ store i32 %sub , ptr %resp , align 4
148
+ br label %sw.epilog
149
+
150
+ sw.bb1: ; preds = %entry
151
+ %2 = load i32 , ptr %X.addr , align 4
152
+ %3 = load i32 , ptr %X.addr , align 4
153
+ %add = add nsw i32 %2 , %3
154
+ store i32 %add , ptr %resp , align 4
155
+ br label %sw.epilog
156
+
157
+ sw.bb2: ; preds = %entry
158
+ %4 = load i32 , ptr %X.addr , align 4
159
+ %5 = load i32 , ptr %X.addr , align 4
160
+ %mul = mul nsw i32 %4 , %5
161
+ store i32 %mul , ptr %resp , align 4
162
+ br label %sw.epilog
163
+
164
+ sw.epilog: ; preds = %entry, %sw.bb2, %sw.bb1, %sw.bb
165
+ %6 = load i32 , ptr %resp , align 4
166
+ ret i32 %6
167
+ }
168
+
169
+
170
+ define spir_func noundef i32 @no_attr_switch (i32 noundef %X ) {
171
+ ; CHECK-LABEL: ; -- Begin function no_attr_switch
172
+ ; CHECK: OpSelectionMerge %[[#]] None
173
+ entry:
174
+ %X.addr = alloca i32 , align 4
175
+ %resp = alloca i32 , align 4
176
+ store i32 %X , ptr %X.addr , align 4
177
+ %0 = load i32 , ptr %X.addr , align 4
178
+ switch i32 %0 , label %sw.epilog [
179
+ i32 0 , label %sw.bb
180
+ i32 1 , label %sw.bb1
181
+ i32 2 , label %sw.bb2
182
+ ]
183
+
184
+ sw.bb: ; preds = %entry
185
+ %1 = load i32 , ptr %X.addr , align 4
186
+ %sub = sub nsw i32 0 , %1
187
+ store i32 %sub , ptr %resp , align 4
188
+ br label %sw.epilog
189
+
190
+ sw.bb1: ; preds = %entry
191
+ %2 = load i32 , ptr %X.addr , align 4
192
+ %3 = load i32 , ptr %X.addr , align 4
193
+ %add = add nsw i32 %2 , %3
194
+ store i32 %add , ptr %resp , align 4
195
+ br label %sw.epilog
196
+
197
+ sw.bb2: ; preds = %entry
198
+ %4 = load i32 , ptr %X.addr , align 4
199
+ %5 = load i32 , ptr %X.addr , align 4
200
+ %mul = mul nsw i32 %4 , %5
201
+ store i32 %mul , ptr %resp , align 4
202
+ br label %sw.epilog
203
+
204
+ sw.epilog: ; preds = %entry, %sw.bb2, %sw.bb1, %sw.bb
205
+ %6 = load i32 , ptr %resp , align 4
206
+ ret i32 %6
207
+ }
208
+
90
209
!0 = !{!"hlsl.controlflow.hint" , i32 1 }
91
210
!1 = !{!"hlsl.controlflow.hint" , i32 2 }
0 commit comments