30
30
; int x = i;
31
31
; } while(i--> 0);
32
32
; }
33
+ ;
34
+ ; for_count_unusual() is a synthetically written function
35
+ ;
33
36
; Command:
34
37
; clang -cc1 -triple spir64 -O0 LoopUnroll.cl -emit-llvm -o /test/SPIRV/transcoding/LoopUnroll.ll
35
38
36
39
; RUN: llvm-as < %s > %t.bc
37
- ; RUN: llvm-spirv %t.bc -o - -spirv-text | FileCheck %s --check-prefix=CHECK-SPIRV
40
+ ; RUN: llvm-spirv %t.bc -o %t.spv
41
+ ; RUN: llvm-spirv -to-text %t.spv -o %t.spt
42
+ ; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
43
+ ; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
44
+ ; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM
38
45
39
46
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
40
47
target triple = "spir64"
@@ -50,12 +57,12 @@ entry:
50
57
br label %for.cond
51
58
52
59
for.cond: ; preds = %for.inc, %entry
53
- ; CHECK-SPIRV: Label [[Header:[0-9]+ ]]
60
+ ; CHECK-SPIRV: Label [[#HEADER: ]]
54
61
%0 = load i32 , i32* %i , align 4
55
62
%cmp = icmp slt i32 %0 , 1024
56
63
; Per SPIRV spec p3.23 "DontUnroll" loop control = 0x2
57
- ; CHECK-SPIRV: 4 LoopMerge [[MergeBlock:[0-9]+]] [[ContinueTarget:[0-9]+ ]] 2
58
- ; CHECK-SPIRV: BranchConditional {{[0-9]+}} {{[0-9]+}} [[MergeBlock ]]
64
+ ; CHECK-SPIRV: LoopMerge [[#MERGEBLOCK:]] [[#CONTINUE: ]] 2
65
+ ; CHECK-SPIRV: BranchConditional [[#]] [[#]] [[#MERGEBLOCK ]]
59
66
br i1 %cmp , label %for.body , label %for.end
60
67
61
68
for.body: ; preds = %for.cond
@@ -76,15 +83,16 @@ if.end: ; preds = %for.body
76
83
br label %for.inc
77
84
78
85
for.inc: ; preds = %if.end, %if.then
79
- ; CHECK-SPIRV: Label [[ContinueTarget ]]
86
+ ; CHECK-SPIRV: Label [[#CONTINUE ]]
80
87
%3 = load i32 , i32* %i , align 4
81
88
%inc = add nsw i32 %3 , 1
82
89
store i32 %inc , i32* %i , align 4
83
90
br label %for.cond , !llvm.loop !5
84
- ; CHECK-SPIRV: Branch [[Header]]
91
+ ; CHECK-LLVM: br label %for.cond, !llvm.loop ![[#UNROLLDISABLE:]]
92
+ ; CHECK-SPIRV: Branch [[#HEADER]]
85
93
86
94
for.end: ; preds = %for.cond
87
- ; CHECK-SPIRV: Label [[MergeBlock ]]
95
+ ; CHECK-SPIRV: Label [[#MERGEBLOCK ]]
88
96
ret void
89
97
}
90
98
@@ -99,14 +107,14 @@ entry:
99
107
br label %while.cond
100
108
101
109
while.cond: ; preds = %if.end, %if.then, %entry
102
- ; CHECK-SPIRV: Label [[Header:[0-9]+ ]]
110
+ ; CHECK-SPIRV: Label [[#HEADER: ]]
103
111
%0 = load i32 , i32* %i , align 4
104
112
%dec = add nsw i32 %0 , -1
105
113
store i32 %dec , i32* %i , align 4
106
114
%cmp = icmp sgt i32 %0 , 0
107
115
; Per SPIRV spec p3.23 "Unroll" loop control = 0x1
108
- ; CHECK-SPIRV: 5 LoopMerge [[MergeBlock:[0-9]+]] [[ContinueTarget:[0-9]+ ]] 256 8
109
- ; CHECK-SPIRV: BranchConditional {{[0-9]+}} {{[0-9]+}} [[MergeBlock ]]
116
+ ; CHECK-SPIRV: LoopMerge [[#MERGEBLOCK:]] [[#CONTINUE: ]] 256 8
117
+ ; CHECK-SPIRV: BranchConditional [[#]] [[#]] [[#MERGEBLOCK ]]
110
118
br i1 %cmp , label %while.body , label %while.end
111
119
112
120
while.body: ; preds = %while.cond
@@ -118,12 +126,13 @@ while.body: ; preds = %while.cond
118
126
119
127
if.then: ; preds = %while.body
120
128
; CHECK-SPIRV: Label
129
+ ; CHECK-LLVM: br label %while.cond, !llvm.loop ![[#UNROLLCOUNT:]]
121
130
br label %while.cond , !llvm.loop !7
122
131
123
132
; loop-simplify pass will create extra basic block which is the only one in
124
133
; loop having a back-edge to the header
125
- ; CHECK-SPIRV: [[ContinueTarget ]]
126
- ; CHECK-SPIRV: Branch [[Header ]]
134
+ ; CHECK-SPIRV: [[#CONTINUE ]]
135
+ ; CHECK-SPIRV: Branch [[#HEADER ]]
127
136
128
137
if.end: ; preds = %while.body
129
138
; CHECK-SPIRV: Label
@@ -132,7 +141,7 @@ if.end: ; preds = %while.body
132
141
br label %while.cond , !llvm.loop !7
133
142
134
143
while.end: ; preds = %while.cond
135
- ; CHECK-SPIRV: [[MergeBlock ]]
144
+ ; CHECK-SPIRV: [[#MERGEBLOCK ]]
136
145
ret void
137
146
}
138
147
@@ -144,15 +153,15 @@ entry:
144
153
%i = alloca i32 , align 4
145
154
%x = alloca i32 , align 4
146
155
store i32 1024 , i32* %i , align 4
147
- br label %do.body , !llvm.loop !9
156
+ br label %do.body
148
157
149
158
do.body: ; preds = %do.cond, %entry
150
- ; CHECK-SPIRV: Label [[Header:[0-9]+ ]]
159
+ ; CHECK-SPIRV: Label [[#HEADER: ]]
151
160
%0 = load i32 , i32* %i , align 4
152
161
%rem = srem i32 %0 , 2
153
162
%tobool = icmp ne i32 %rem , 0
154
163
; Per SPIRV spec p3.23 "Unroll" loop control = 0x1
155
- ; CHECK-SPIRV: 4 LoopMerge [[MergeBlock:[0-9]+]] [[ContinueTarget:[0-9]+ ]] 1
164
+ ; CHECK-SPIRV: LoopMerge [[#MERGEBLOCK:]] [[#CONTINUE: ]] 1
156
165
; CHECK-SPIRV: BranchConditional
157
166
br i1 %tobool , label %if.then , label %if.end
158
167
@@ -167,16 +176,62 @@ if.end: ; preds = %do.body
167
176
br label %do.cond
168
177
169
178
do.cond: ; preds = %if.end, %if.then
170
- ; CHECK-SPIRV: Label [[ContinueTarget ]]
179
+ ; CHECK-SPIRV: Label [[#CONTINUE ]]
171
180
%2 = load i32 , i32* %i , align 4
172
181
%dec = add nsw i32 %2 , -1
173
182
store i32 %dec , i32* %i , align 4
174
183
%cmp = icmp sgt i32 %2 , 0
175
- ; CHECK-SPIRV: BranchConditional {{[0-9]+}} [[Header]] [[MergeBlock]]
184
+ ; CHECK-SPIRV: BranchConditional [[#]] [[#HEADER]] [[#MERGEBLOCK]]
185
+ ; CHECK-LLVM: br i1 %cmp, label %do.body, label %do.end, !llvm.loop ![[#UNROLLENABLE1:]]
176
186
br i1 %cmp , label %do.body , label %do.end , !llvm.loop !9
177
187
178
188
do.end: ; preds = %do.cond
179
- ; CHECK-SPIRV: Label [[MergeBlock]]
189
+ ; CHECK-SPIRV: Label [[#MERGEBLOCK]]
190
+ ret void
191
+ }
192
+
193
+ ; CHECK-SPIRV: Function
194
+ ; Function Attrs: noinline nounwind optnone
195
+ define spir_func void @for_count_unusual () #0 {
196
+ entry:
197
+ ; CHECK-SPIRV: Label
198
+ %i = alloca i32 , align 4
199
+ %x = alloca i32 , align 4
200
+ store i32 1024 , i32* %i , align 4
201
+ br label %for.body
202
+
203
+ for.body: ; preds = %for.cond, %entry
204
+ ; CHECK-SPIRV: Label [[#HEADER:]]
205
+ %0 = load i32 , i32* %i , align 4
206
+ %rem = srem i32 %0 , 2
207
+ %tobool = icmp ne i32 %rem , 0
208
+ ; Per SPIRV spec p3.23 "Unroll" loop control = 0x1
209
+ ; CHECK-SPIRV: LoopMerge [[#MERGEBLOCK:]] [[#CONTINUE:]] 1
210
+ ; CHECK-SPIRV: BranchConditional
211
+ br i1 %tobool , label %if.then , label %if.end
212
+
213
+ if.then: ; preds = %for.body
214
+ ; CHECK-SPIRV: Label
215
+ br label %for.cond
216
+
217
+ if.end: ; preds = %for.body
218
+ ; CHECK-SPIRV: Label
219
+ %1 = load i32 , i32* %i , align 4
220
+ store i32 %1 , i32* %x , align 4
221
+ br label %for.cond
222
+
223
+ for.cond: ; preds = %if.end, %if.then
224
+ ; CHECK-SPIRV: Label [[#CONTINUE]]
225
+ %2 = load i32 , i32* %i , align 4
226
+ %dec = add nsw i32 %2 , -1
227
+ store i32 %dec , i32* %i , align 4
228
+ %cmp = icmp sgt i32 %2 , 0
229
+ ; CHECK-SPIRV: BranchConditional [[#]] [[#MERGEBLOCK]] [[#HEADER]]
230
+ ; CHECK-LLVM: br i1 %cmp, label %for.end, label %for.body, !llvm.loop ![[#UNROLLENABLE2:]]
231
+ br i1 %cmp , label %for.end , label %for.body , !llvm.loop !9
232
+
233
+ for.end: ; preds = %for.cond
234
+ ; CHECK-SPIRV: Label [[#MERGEBLOCK]]
180
235
ret void
181
236
}
182
237
@@ -202,3 +257,11 @@ attributes #0 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-ma
202
257
!8 = !{!"llvm.loop.unroll.count" , i32 8 }
203
258
!9 = distinct !{!9 , !10 }
204
259
!10 = !{!"llvm.loop.unroll.enable" }
260
+
261
+ ; CHECK-LLVM: ![[#UNROLLDISABLE]] = distinct !{![[#UNROLLDISABLE]], ![[#DISABLE:]]}
262
+ ; CHECK-LLVM: ![[#DISABLE]] = !{!"llvm.loop.unroll.disable"}
263
+ ; CHECK-LLVM: ![[#UNROLLCOUNT]] = distinct !{![[#UNROLLCOUNT]], ![[#COUNT:]]}
264
+ ; CHECK-LLVM: ![[#COUNT]] = !{!"llvm.loop.unroll.count", i32 8}
265
+ ; CHECK-LLVM: ![[#UNROLLENABLE1]] = distinct !{![[#UNROLLENABLE1]], ![[#ENABLE:]]}
266
+ ; CHECK-LLVM: ![[#ENABLE]] = !{!"llvm.loop.unroll.enable"}
267
+ ; CHECK-LLVM: ![[#UNROLLENABLE2]] = distinct !{![[#UNROLLENABLE2]], ![[#ENABLE]]}
0 commit comments