@@ -134,9 +134,9 @@ define i32 @abs_canonical_5(i8 %x) {
134
134
define i32 @abs_canonical_6 (i32 %a , i32 %b ) {
135
135
; CHECK-LABEL: @abs_canonical_6(
136
136
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
137
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], -1
138
- ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[B]] , [[A ]]
139
- ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP1 ]], i32 [[TMP2 ]]
137
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 0
138
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 0 , [[TMP1 ]]
139
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP2 ]], i32 [[TMP1 ]]
140
140
; CHECK-NEXT: ret i32 [[ABS]]
141
141
;
142
142
%tmp1 = sub i32 %a , %b
@@ -149,9 +149,9 @@ define i32 @abs_canonical_6(i32 %a, i32 %b) {
149
149
define <2 x i8 > @abs_canonical_7 (<2 x i8 > %a , <2 x i8 > %b ) {
150
150
; CHECK-LABEL: @abs_canonical_7(
151
151
; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[A:%.*]], [[B:%.*]]
152
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[TMP1]], <i8 -1, i8 -1>
153
- ; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i8> [[B]] , [[A ]]
154
- ; CHECK-NEXT: [[ABS:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[TMP1 ]], <2 x i8> [[TMP2 ]]
152
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[TMP1]], zeroinitializer
153
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i8> zeroinitializer , [[TMP1 ]]
154
+ ; CHECK-NEXT: [[ABS:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[TMP2 ]], <2 x i8> [[TMP1 ]]
155
155
; CHECK-NEXT: ret <2 x i8> [[ABS]]
156
156
;
157
157
@@ -165,8 +165,8 @@ define <2 x i8> @abs_canonical_7(<2 x i8> %a, <2 x i8 > %b) {
165
165
define i32 @abs_canonical_8 (i32 %a ) {
166
166
; CHECK-LABEL: @abs_canonical_8(
167
167
; CHECK-NEXT: [[TMP:%.*]] = sub i32 0, [[A:%.*]]
168
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP ]], 0
169
- ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[A ]], i32 [[TMP ]]
168
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A ]], 0
169
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP ]], i32 [[A ]]
170
170
; CHECK-NEXT: ret i32 [[ABS]]
171
171
;
172
172
%tmp = sub i32 0 , %a
@@ -175,6 +175,38 @@ define i32 @abs_canonical_8(i32 %a) {
175
175
ret i32 %abs
176
176
}
177
177
178
+ define i32 @abs_canonical_9 (i32 %a , i32 %b ) {
179
+ ; CHECK-LABEL: @abs_canonical_9(
180
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
181
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], -1
182
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[B]], [[A]]
183
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP1]], i32 [[TMP2]]
184
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[ABS]], [[TMP2]]
185
+ ; CHECK-NEXT: ret i32 [[ADD]]
186
+ ;
187
+ %tmp1 = sub i32 %a , %b
188
+ %cmp = icmp sgt i32 %tmp1 , -1
189
+ %tmp2 = sub i32 %b , %a
190
+ %abs = select i1 %cmp , i32 %tmp1 , i32 %tmp2
191
+ %add = add i32 %abs , %tmp2 ; increase use count for %tmp2.
192
+ ret i32 %add
193
+ }
194
+
195
+ define i32 @abs_canonical_10 (i32 %a , i32 %b ) {
196
+ ; CHECK-LABEL: @abs_canonical_10(
197
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
198
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 0
199
+ ; CHECK-NEXT: [[NEGTMP:%.*]] = sub i32 0, [[TMP1]]
200
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[NEGTMP]], i32 [[TMP1]]
201
+ ; CHECK-NEXT: ret i32 [[ABS]]
202
+ ;
203
+ %tmp2 = sub i32 %b , %a
204
+ %tmp1 = sub i32 %a , %b
205
+ %cmp = icmp sgt i32 %tmp1 , -1
206
+ %abs = select i1 %cmp , i32 %tmp1 , i32 %tmp2
207
+ ret i32 %abs
208
+ }
209
+
178
210
; We have a canonical form of nabs to make CSE easier.
179
211
180
212
define i8 @nabs_canonical_1 (i8 %x ) {
@@ -266,9 +298,9 @@ define i32 @nabs_canonical_5(i8 %x) {
266
298
define i32 @nabs_canonical_6 (i32 %a , i32 %b ) {
267
299
; CHECK-LABEL: @nabs_canonical_6(
268
300
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
269
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], -1
270
- ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[B]] , [[A ]]
271
- ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP2 ]], i32 [[TMP1 ]]
301
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 0
302
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 0 , [[TMP1 ]]
303
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP1 ]], i32 [[TMP2 ]]
272
304
; CHECK-NEXT: ret i32 [[ABS]]
273
305
;
274
306
%tmp1 = sub i32 %a , %b
@@ -281,9 +313,9 @@ define i32 @nabs_canonical_6(i32 %a, i32 %b) {
281
313
define <2 x i8 > @nabs_canonical_7 (<2 x i8 > %a , <2 x i8 > %b ) {
282
314
; CHECK-LABEL: @nabs_canonical_7(
283
315
; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[A:%.*]], [[B:%.*]]
284
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[TMP1]], <i8 -1, i8 -1>
285
- ; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i8> [[B]] , [[A ]]
286
- ; CHECK-NEXT: [[ABS:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[TMP2 ]], <2 x i8> [[TMP1 ]]
316
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[TMP1]], zeroinitializer
317
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i8> zeroinitializer , [[TMP1 ]]
318
+ ; CHECK-NEXT: [[ABS:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[TMP1 ]], <2 x i8> [[TMP2 ]]
287
319
; CHECK-NEXT: ret <2 x i8> [[ABS]]
288
320
;
289
321
%tmp1 = sub <2 x i8 > %a , %b
@@ -296,8 +328,8 @@ define <2 x i8> @nabs_canonical_7(<2 x i8> %a, <2 x i8 > %b) {
296
328
define i32 @nabs_canonical_8 (i32 %a ) {
297
329
; CHECK-LABEL: @nabs_canonical_8(
298
330
; CHECK-NEXT: [[TMP:%.*]] = sub i32 0, [[A:%.*]]
299
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP ]], 0
300
- ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP ]], i32 [[A ]]
331
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A ]], 0
332
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[A ]], i32 [[TMP ]]
301
333
; CHECK-NEXT: ret i32 [[ABS]]
302
334
;
303
335
%tmp = sub i32 0 , %a
@@ -306,6 +338,38 @@ define i32 @nabs_canonical_8(i32 %a) {
306
338
ret i32 %abs
307
339
}
308
340
341
+ define i32 @nabs_canonical_9 (i32 %a , i32 %b ) {
342
+ ; CHECK-LABEL: @nabs_canonical_9(
343
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
344
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], -1
345
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[B]], [[A]]
346
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP2]], i32 [[TMP1]]
347
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[ABS]]
348
+ ; CHECK-NEXT: ret i32 [[ADD]]
349
+ ;
350
+ %tmp1 = sub i32 %a , %b
351
+ %cmp = icmp sgt i32 %tmp1 , -1
352
+ %tmp2 = sub i32 %b , %a
353
+ %abs = select i1 %cmp , i32 %tmp2 , i32 %tmp1
354
+ %add = add i32 %tmp2 , %abs ; increase use count for %tmp2
355
+ ret i32 %add
356
+ }
357
+
358
+ define i32 @nabs_canonical_10 (i32 %a , i32 %b ) {
359
+ ; CHECK-LABEL: @nabs_canonical_10(
360
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
361
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 0
362
+ ; CHECK-NEXT: [[NEGTMP:%.*]] = sub i32 0, [[TMP1]]
363
+ ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP1]], i32 [[NEGTMP]]
364
+ ; CHECK-NEXT: ret i32 [[ABS]]
365
+ ;
366
+ %tmp2 = sub i32 %b , %a
367
+ %tmp1 = sub i32 %a , %b
368
+ %cmp = icmp slt i32 %tmp1 , 1
369
+ %abs = select i1 %cmp , i32 %tmp1 , i32 %tmp2
370
+ ret i32 %abs
371
+ }
372
+
309
373
; The following 5 tests use a shift+add+xor to implement abs():
310
374
; B = ashr i8 A, 7 -- smear the sign bit.
311
375
; xor (add A, B), B -- add -1 and flip bits if negative
0 commit comments