20
20
define i32 @ctlz_and_other (i32 %n , ptr nocapture %a ) {
21
21
; ALL-LABEL: @ctlz_and_other(
22
22
; ALL-NEXT: entry:
23
- ; ALL-NEXT: [[C:%.*]] = icmp sgt i32 [[N:%.*]], 0
24
- ; ALL-NEXT: [[NEGN:%.*]] = sub nsw i32 0, [[N]]
25
- ; ALL-NEXT: [[ABS_N:%.*]] = select i1 [[C]], i32 [[N]], i32 [[NEGN]]
23
+ ; ALL-NEXT: [[ABS_N:%.*]] = call i32 @llvm.abs.i32(i32 [[N:%.*]], i1 true)
26
24
; ALL-NEXT: [[SHR8:%.*]] = lshr i32 [[ABS_N]], 1
27
25
; ALL-NEXT: [[TOBOOL9:%.*]] = icmp eq i32 [[SHR8]], 0
28
26
; ALL-NEXT: br i1 [[TOBOOL9]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]
@@ -56,9 +54,7 @@ define i32 @ctlz_and_other(i32 %n, ptr nocapture %a) {
56
54
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
57
55
;
58
56
entry:
59
- %c = icmp sgt i32 %n , 0
60
- %negn = sub nsw i32 0 , %n
61
- %abs_n = select i1 %c , i32 %n , i32 %negn
57
+ %abs_n = call i32 @llvm.abs.i32 (i32 %n , i1 true )
62
58
%shr8 = lshr i32 %abs_n , 1
63
59
%tobool9 = icmp eq i32 %shr8 , 0
64
60
br i1 %tobool9 , label %while.end , label %while.body.preheader
@@ -108,9 +104,7 @@ while.end: ; preds = %while.end.loopexit,
108
104
define i32 @ctlz_zero_check (i32 %n ) {
109
105
; ALL-LABEL: @ctlz_zero_check(
110
106
; ALL-NEXT: entry:
111
- ; ALL-NEXT: [[C:%.*]] = icmp sgt i32 [[N:%.*]], 0
112
- ; ALL-NEXT: [[NEGN:%.*]] = sub nsw i32 0, [[N]]
113
- ; ALL-NEXT: [[ABS_N:%.*]] = select i1 [[C]], i32 [[N]], i32 [[NEGN]]
107
+ ; ALL-NEXT: [[ABS_N:%.*]] = call i32 @llvm.abs.i32(i32 [[N:%.*]], i1 true)
114
108
; ALL-NEXT: [[TOBOOL4:%.*]] = icmp eq i32 [[ABS_N]], 0
115
109
; ALL-NEXT: br i1 [[TOBOOL4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]
116
110
; ALL: while.body.preheader:
@@ -134,9 +128,7 @@ define i32 @ctlz_zero_check(i32 %n) {
134
128
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
135
129
;
136
130
entry:
137
- %c = icmp sgt i32 %n , 0
138
- %negn = sub nsw i32 0 , %n
139
- %abs_n = select i1 %c , i32 %n , i32 %negn
131
+ %abs_n = call i32 @llvm.abs.i32 (i32 %n , i1 true )
140
132
%tobool4 = icmp eq i32 %abs_n , 0
141
133
br i1 %tobool4 , label %while.end , label %while.body.preheader
142
134
@@ -238,9 +230,7 @@ while.end: ; preds = %while.end.loopexit,
238
230
define i32 @ctlz (i32 %n ) {
239
231
; ALL-LABEL: @ctlz(
240
232
; ALL-NEXT: entry:
241
- ; ALL-NEXT: [[C:%.*]] = icmp sgt i32 [[N:%.*]], 0
242
- ; ALL-NEXT: [[NEGN:%.*]] = sub nsw i32 0, [[N]]
243
- ; ALL-NEXT: [[ABS_N:%.*]] = select i1 [[C]], i32 [[N]], i32 [[NEGN]]
233
+ ; ALL-NEXT: [[ABS_N:%.*]] = call i32 @llvm.abs.i32(i32 [[N:%.*]], i1 true)
244
234
; ALL-NEXT: [[TMP0:%.*]] = ashr i32 [[ABS_N]], 1
245
235
; ALL-NEXT: [[TMP1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP0]], i1 false)
246
236
; ALL-NEXT: [[TMP2:%.*]] = sub i32 32, [[TMP1]]
@@ -260,9 +250,7 @@ define i32 @ctlz(i32 %n) {
260
250
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
261
251
;
262
252
entry:
263
- %c = icmp sgt i32 %n , 0
264
- %negn = sub nsw i32 0 , %n
265
- %abs_n = select i1 %c , i32 %n , i32 %negn
253
+ %abs_n = call i32 @llvm.abs.i32 (i32 %n , i1 true )
266
254
br label %while.cond
267
255
268
256
while.cond: ; preds = %while.cond, %entry
@@ -343,9 +331,7 @@ while.end: ; preds = %while.cond
343
331
define i32 @ctlz_add (i32 %n , i32 %i0 ) {
344
332
; ALL-LABEL: @ctlz_add(
345
333
; ALL-NEXT: entry:
346
- ; ALL-NEXT: [[C:%.*]] = icmp sgt i32 [[N:%.*]], 0
347
- ; ALL-NEXT: [[NEGN:%.*]] = sub nsw i32 0, [[N]]
348
- ; ALL-NEXT: [[ABS_N:%.*]] = select i1 [[C]], i32 [[N]], i32 [[NEGN]]
334
+ ; ALL-NEXT: [[ABS_N:%.*]] = call i32 @llvm.abs.i32(i32 [[N:%.*]], i1 true)
349
335
; ALL-NEXT: [[TMP0:%.*]] = ashr i32 [[ABS_N]], 1
350
336
; ALL-NEXT: [[TMP1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP0]], i1 false)
351
337
; ALL-NEXT: [[TMP2:%.*]] = sub i32 32, [[TMP1]]
@@ -366,9 +352,7 @@ define i32 @ctlz_add(i32 %n, i32 %i0) {
366
352
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
367
353
;
368
354
entry:
369
- %c = icmp sgt i32 %n , 0
370
- %negn = sub nsw i32 0 , %n
371
- %abs_n = select i1 %c , i32 %n , i32 %negn
355
+ %abs_n = call i32 @llvm.abs.i32 (i32 %n , i1 true )
372
356
br label %while.cond
373
357
374
358
while.cond: ; preds = %while.cond, %entry
@@ -452,10 +436,8 @@ while.end: ; preds = %while.cond
452
436
define i32 @ctlz_sext (i16 %in ) {
453
437
; ALL-LABEL: @ctlz_sext(
454
438
; ALL-NEXT: entry:
455
- ; ALL-NEXT: [[N:%.*]] = sext i16 [[IN:%.*]] to i32
456
- ; ALL-NEXT: [[C:%.*]] = icmp sgt i16 [[IN]], 0
457
- ; ALL-NEXT: [[NEGN:%.*]] = sub nsw i32 0, [[N]]
458
- ; ALL-NEXT: [[ABS_N:%.*]] = select i1 [[C]], i32 [[N]], i32 [[NEGN]]
439
+ ; ALL-NEXT: [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[IN:%.*]], i1 false)
440
+ ; ALL-NEXT: [[ABS_N:%.*]] = zext i16 [[ABS]] to i32
459
441
; ALL-NEXT: [[TMP0:%.*]] = ashr i32 [[ABS_N]], 1
460
442
; ALL-NEXT: [[TMP1:%.*]] = call i32 @llvm.ctlz.i32(i32 [[TMP0]], i1 false)
461
443
; ALL-NEXT: [[TMP2:%.*]] = sub i32 32, [[TMP1]]
@@ -475,10 +457,8 @@ define i32 @ctlz_sext(i16 %in) {
475
457
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
476
458
;
477
459
entry:
478
- %n = sext i16 %in to i32
479
- %c = icmp sgt i16 %in , 0
480
- %negn = sub nsw i32 0 , %n
481
- %abs_n = select i1 %c , i32 %n , i32 %negn
460
+ %abs = call i16 @llvm.abs.i16 (i16 %in , i1 false )
461
+ %abs_n = zext i16 %abs to i32
482
462
br label %while.cond
483
463
484
464
while.cond: ; preds = %while.cond, %entry
@@ -753,3 +733,6 @@ while.cond: ; preds = %while.cond, %entry
753
733
while.end: ; preds = %while.cond
754
734
ret i32 %i.0
755
735
}
736
+
737
+ declare i32 @llvm.abs.i32 (i32 , i1 )
738
+ declare i16 @llvm.abs.i16 (i16 , i1 )
0 commit comments