1
- ; FIXME: FastISel currently returns false if it hits code that uses VSX
2
- ; registers and with -fast-isel-abort=1 turned on the test case will then fail.
3
- ; When fastisel better supports VSX fix up this test case.
4
- ;
5
1
; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort=1 -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck %s --check-prefix=ELF64
2
+ ; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort=1 -mtriple=powerpc64le-unknown-linux-gnu -mattr=+vsx | FileCheck %s --check-prefix=VSX
6
3
; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort=1 -mtriple=powerpc-unknown-linux-gnu -mcpu=e500 -mattr=spe | FileCheck %s --check-prefix=SPE
4
+
5
+ declare void @foo ()
6
+
7
7
define void @t1a (float %a ) nounwind {
8
8
entry:
9
- ; ELF64: t1a
10
- ; SPE: t1a
9
+ ; ELF64-LABEL: @t1a
10
+ ; SPE-LABEL: @t1a
11
+ ; VSX-LABEL: @t1a
11
12
%cmp = fcmp oeq float %a , 0 .000000e+00
12
13
; ELF64: addis
13
14
; ELF64: lfs
14
15
; ELF64: fcmpu
16
+ ; VSX: addis
17
+ ; VSX: lfs
18
+ ; VSX: fcmpu
15
19
; SPE: efscmpeq
16
20
br i1 %cmp , label %if.then , label %if.end
17
21
@@ -23,16 +27,41 @@ if.end: ; preds = %if.then, %entry
23
27
ret void
24
28
}
25
29
26
- declare void @foo ()
27
-
28
30
define void @t1b (float %a ) nounwind {
29
31
entry:
30
- ; ELF64: t1b
31
- ; SPE: t1b
32
+ ; ELF64-LABEL: @t1b
33
+ ; SPE-LABEL: @t1b
34
+ ; VSX-LABEL: @t1b
32
35
%cmp = fcmp oeq float %a , -0 .000000e+00
33
36
; ELF64: addis
34
37
; ELF64: lfs
35
38
; ELF64: fcmpu
39
+ ; VSX: addis
40
+ ; VSX: lfs
41
+ ; VSX: fcmpu
42
+ ; SPE: efscmpeq
43
+ br i1 %cmp , label %if.then , label %if.end
44
+
45
+ if.then: ; preds = %entry
46
+ call void @foo ()
47
+ br label %if.end
48
+
49
+ if.end: ; preds = %if.then, %entry
50
+ ret void
51
+ }
52
+
53
+ define void @t1c (float %a ) nounwind {
54
+ entry:
55
+ ; ELF64-LABEL: @t1c
56
+ ; SPE-LABEL: @t1c
57
+ ; VSX-LABEL: @t1c
58
+ %cmp = fcmp oeq float -0 .000000e+00 , %a
59
+ ; ELF64: addis
60
+ ; ELF64: lfs
61
+ ; ELF64: fcmpu
62
+ ; VSX: addis
63
+ ; VSX: lfs
64
+ ; VSX: fcmpu
36
65
; SPE: efscmpeq
37
66
br i1 %cmp , label %if.then , label %if.end
38
67
@@ -46,12 +75,16 @@ if.end: ; preds = %if.then, %entry
46
75
47
76
define void @t2a (double %a ) nounwind {
48
77
entry:
49
- ; ELF64: t2a
50
- ; SPE: t2a
78
+ ; ELF64-LABEL: @t2a
79
+ ; SPE-LABEL: @t2a
80
+ ; VSX-LABEL: @t2a
51
81
%cmp = fcmp oeq double %a , 0 .000000e+00
52
82
; ELF64: addis
53
83
; ELF64: lfd
54
84
; ELF64: fcmpu
85
+ ; VSX: addis
86
+ ; VSX: lfd
87
+ ; VSX: xscmpudp
55
88
; SPE: efdcmpeq
56
89
br i1 %cmp , label %if.then , label %if.end
57
90
@@ -65,12 +98,39 @@ if.end: ; preds = %if.then, %entry
65
98
66
99
define void @t2b (double %a ) nounwind {
67
100
entry:
68
- ; ELF64: t2b
69
- ; SPE: t2b
101
+ ; ELF64-LABEL: @t2b
102
+ ; SPE-LABEL: @t2b
103
+ ; VSX-LABEL: @t2b
70
104
%cmp = fcmp oeq double %a , -0 .000000e+00
71
105
; ELF64: addis
72
106
; ELF64: lfd
73
107
; ELF64: fcmpu
108
+ ; VSX: addis
109
+ ; VSX: lfd
110
+ ; VSX: xscmpudp
111
+ ; SPE: efdcmpeq
112
+ br i1 %cmp , label %if.then , label %if.end
113
+
114
+ if.then: ; preds = %entry
115
+ call void @foo ()
116
+ br label %if.end
117
+
118
+ if.end: ; preds = %if.then, %entry
119
+ ret void
120
+ }
121
+
122
+ define void @t2c (double %a ) nounwind {
123
+ entry:
124
+ ; ELF64-LABEL: @t2c
125
+ ; SPE-LABEL: @t2c
126
+ ; VSX-LABEL: @t2c
127
+ %cmp = fcmp oeq double -0 .000000e+00 , %a
128
+ ; ELF64: addis
129
+ ; ELF64: lfd
130
+ ; ELF64: fcmpu
131
+ ; VSX: addis
132
+ ; VSX: lfd
133
+ ; VSX: xscmpudp
74
134
; SPE: efdcmpeq
75
135
br i1 %cmp , label %if.then , label %if.end
76
136
@@ -84,7 +144,7 @@ if.end: ; preds = %if.then, %entry
84
144
85
145
define void @t4 (i8 signext %a ) nounwind {
86
146
entry:
87
- ; ELF64: t4
147
+ ; ELF64-LABEL: @ t4
88
148
%cmp = icmp eq i8 %a , -1
89
149
; ELF64: extsb
90
150
; ELF64: cmpwi
@@ -100,7 +160,7 @@ if.end: ; preds = %if.then, %entry
100
160
101
161
define void @t5 (i8 zeroext %a ) nounwind {
102
162
entry:
103
- ; ELF64: t5
163
+ ; ELF64-LABEL: @ t5
104
164
%cmp = icmp eq i8 %a , 1
105
165
; ELF64: extsb
106
166
; ELF64: cmpwi
@@ -114,9 +174,25 @@ if.end: ; preds = %if.then, %entry
114
174
ret void
115
175
}
116
176
177
+ define void @t5a (i8 zeroext %a ) nounwind {
178
+ entry:
179
+ ; ELF64-LABEL: @t5a
180
+ %cmp = icmp eq i8 1 , %a
181
+ ; ELF64: extsb
182
+ ; ELF64: cmpw
183
+ br i1 %cmp , label %if.then , label %if.end
184
+
185
+ if.then: ; preds = %entry
186
+ call void @foo ()
187
+ br label %if.end
188
+
189
+ if.end: ; preds = %if.then, %entry
190
+ ret void
191
+ }
192
+
117
193
define void @t6 (i16 signext %a ) nounwind {
118
194
entry:
119
- ; ELF64: t6
195
+ ; ELF64-LABEL: @ t6
120
196
%cmp = icmp eq i16 %a , -1
121
197
; ELF64: extsh
122
198
; ELF64: cmpwi
@@ -132,7 +208,7 @@ if.end: ; preds = %if.then, %entry
132
208
133
209
define void @t7 (i16 zeroext %a ) nounwind {
134
210
entry:
135
- ; ELF64: t7
211
+ ; ELF64-LABEL: @ t7
136
212
%cmp = icmp eq i16 %a , 1
137
213
; ELF64: extsh
138
214
; ELF64: cmpwi
@@ -146,9 +222,25 @@ if.end: ; preds = %if.then, %entry
146
222
ret void
147
223
}
148
224
225
+ define void @t7a (i16 zeroext %a ) nounwind {
226
+ entry:
227
+ ; ELF64-LABEL: @t7a
228
+ %cmp = icmp eq i16 1 , %a
229
+ ; ELF64: extsh
230
+ ; ELF64: cmpw
231
+ br i1 %cmp , label %if.then , label %if.end
232
+
233
+ if.then: ; preds = %entry
234
+ call void @foo ()
235
+ br label %if.end
236
+
237
+ if.end: ; preds = %if.then, %entry
238
+ ret void
239
+ }
240
+
149
241
define void @t8 (i32 %a ) nounwind {
150
242
entry:
151
- ; ELF64: t8
243
+ ; ELF64-LABEL: @ t8
152
244
%cmp = icmp eq i32 %a , -1
153
245
; ELF64: cmpwi
154
246
br i1 %cmp , label %if.then , label %if.end
@@ -163,7 +255,7 @@ if.end: ; preds = %if.then, %entry
163
255
164
256
define void @t9 (i32 %a ) nounwind {
165
257
entry:
166
- ; ELF64: t9
258
+ ; ELF64-LABEL: @ t9
167
259
%cmp = icmp eq i32 %a , 1
168
260
; ELF64: cmpwi
169
261
br i1 %cmp , label %if.then , label %if.end
@@ -178,7 +270,7 @@ if.end: ; preds = %if.then, %entry
178
270
179
271
define void @t10 (i32 %a ) nounwind {
180
272
entry:
181
- ; ELF64: t10
273
+ ; ELF64-LABEL: @ t10
182
274
%cmp = icmp eq i32 %a , 384
183
275
; ELF64: cmpwi
184
276
br i1 %cmp , label %if.then , label %if.end
@@ -193,7 +285,7 @@ if.end: ; preds = %if.then, %entry
193
285
194
286
define void @t11 (i32 %a ) nounwind {
195
287
entry:
196
- ; ELF64: t11
288
+ ; ELF64-LABEL: @ t11
197
289
%cmp = icmp eq i32 %a , 4096
198
290
; ELF64: cmpwi
199
291
br i1 %cmp , label %if.then , label %if.end
@@ -206,9 +298,24 @@ if.end: ; preds = %if.then, %entry
206
298
ret void
207
299
}
208
300
301
+ define void @t11a (i32 %a ) nounwind {
302
+ entry:
303
+ ; ELF64-LABEL: @t11a
304
+ %cmp = icmp eq i32 4096 , %a
305
+ ; ELF64: cmpw
306
+ br i1 %cmp , label %if.then , label %if.end
307
+
308
+ if.then: ; preds = %entry
309
+ call void @foo ()
310
+ br label %if.end
311
+
312
+ if.end: ; preds = %if.then, %entry
313
+ ret void
314
+ }
315
+
209
316
define void @t12 (i8 %a ) nounwind {
210
317
entry:
211
- ; ELF64: t12
318
+ ; ELF64-LABEL: @ t12
212
319
%cmp = icmp ugt i8 %a , -113
213
320
; ELF64: clrlwi
214
321
; ELF64: cmplwi
@@ -224,7 +331,7 @@ if.end: ; preds = %if.then, %entry
224
331
225
332
define void @t13 () nounwind ssp {
226
333
entry:
227
- ; ELF64: t13
334
+ ; ELF64-LABEL: @ t13
228
335
%cmp = icmp slt i32 -123 , -2147483648
229
336
; ELF64: li
230
337
; ELF64: lis
@@ -240,7 +347,7 @@ if.end: ; preds = %entry
240
347
241
348
define void @t14 (i64 %a ) nounwind {
242
349
entry:
243
- ; ELF64: t14
350
+ ; ELF64-LABEL: @ t14
244
351
%cmp = icmp eq i64 %a , -1
245
352
; ELF64: cmpdi
246
353
br i1 %cmp , label %if.then , label %if.end
@@ -255,7 +362,7 @@ if.end: ; preds = %if.then, %entry
255
362
256
363
define void @t15 (i64 %a ) nounwind {
257
364
entry:
258
- ; ELF64: t15
365
+ ; ELF64-LABEL: @ t15
259
366
%cmp = icmp eq i64 %a , 1
260
367
; ELF64: cmpdi
261
368
br i1 %cmp , label %if.then , label %if.end
@@ -270,7 +377,7 @@ if.end: ; preds = %if.then, %entry
270
377
271
378
define void @t16 (i64 %a ) nounwind {
272
379
entry:
273
- ; ELF64: t16
380
+ ; ELF64-LABEL: @ t16
274
381
%cmp = icmp eq i64 %a , 384
275
382
; ELF64: cmpdi
276
383
br i1 %cmp , label %if.then , label %if.end
@@ -285,7 +392,7 @@ if.end: ; preds = %if.then, %entry
285
392
286
393
define void @t17 (i64 %a ) nounwind {
287
394
entry:
288
- ; ELF64: t17
395
+ ; ELF64-LABEL: @ t17
289
396
%cmp = icmp eq i64 %a , 32768
290
397
; Extra operand so we don't match on cmpdi.
291
398
; ELF64: cmpd {{[0-9]+}}
@@ -299,3 +406,19 @@ if.end: ; preds = %if.then, %entry
299
406
ret void
300
407
}
301
408
409
+ define void @t17a (i64 %a ) nounwind {
410
+ entry:
411
+ ; ELF64-LABEL: @t17a
412
+ %cmp = icmp eq i64 32768 , %a
413
+ ; Extra operand so we don't match on cmpdi.
414
+ ; ELF64: cmpd {{[0-9]+}}
415
+ br i1 %cmp , label %if.then , label %if.end
416
+
417
+ if.then: ; preds = %entry
418
+ call void @foo ()
419
+ br label %if.end
420
+
421
+ if.end: ; preds = %if.then, %entry
422
+ ret void
423
+ }
424
+
0 commit comments