14
14
define i64 @test_shl_by_2 (i64 %x ) {
15
15
; CHECK-LABEL: define i64 @test_shl_by_2(
16
16
; CHECK-SAME: i64 [[X:%.*]]) {
17
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
18
17
; CHECK-NEXT: [[TMP2:%.*]] = shl nuw i64 [[X]], 2
19
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP2]], i64 [[X1]])
18
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
19
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[TMP2]]
20
20
; CHECK-NEXT: ret i64 [[MAX]]
21
21
;
22
22
%x1 = add i64 %x , 1
@@ -28,9 +28,9 @@ define i64 @test_shl_by_2(i64 %x) {
28
28
define i64 @test_shl_by_5 (i64 %x ) {
29
29
; CHECK-LABEL: define i64 @test_shl_by_5(
30
30
; CHECK-SAME: i64 [[X:%.*]]) {
31
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
32
31
; CHECK-NEXT: [[TMP2:%.*]] = shl nuw i64 [[X]], 5
33
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP2]], i64 [[X1]])
32
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
33
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[TMP2]]
34
34
; CHECK-NEXT: ret i64 [[MAX]]
35
35
;
36
36
%x1 = add i64 %x , 1
@@ -42,9 +42,9 @@ define i64 @test_shl_by_5(i64 %x) {
42
42
define i64 @test_shl_with_nsw (i64 %x ) {
43
43
; CHECK-LABEL: define i64 @test_shl_with_nsw(
44
44
; CHECK-SAME: i64 [[X:%.*]]) {
45
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
46
45
; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i64 [[X]], 2
47
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[SHL]], i64 [[X1]])
46
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
47
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[SHL]]
48
48
; CHECK-NEXT: ret i64 [[MAX]]
49
49
;
50
50
%x1 = add i64 %x , 1
@@ -56,9 +56,9 @@ define i64 @test_shl_with_nsw(i64 %x) {
56
56
define <2 x i64 > @test_shl_vector_by_2 (<2 x i64 > %x ) {
57
57
; CHECK-LABEL: define <2 x i64> @test_shl_vector_by_2(
58
58
; CHECK-SAME: <2 x i64> [[X:%.*]]) {
59
- ; CHECK-NEXT: [[X1:%.*]] = add <2 x i64> [[X]], splat (i64 1)
60
59
; CHECK-NEXT: [[SHL:%.*]] = shl nuw <2 x i64> [[X]], splat (i64 2)
61
- ; CHECK-NEXT: [[MAX:%.*]] = call <2 x i64> @llvm.umax.v2i64(<2 x i64> [[SHL]], <2 x i64> [[X1]])
60
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <2 x i64> [[X]], zeroinitializer
61
+ ; CHECK-NEXT: [[MAX:%.*]] = select <2 x i1> [[TMP1]], <2 x i64> splat (i64 1), <2 x i64> [[SHL]]
62
62
; CHECK-NEXT: ret <2 x i64> [[MAX]]
63
63
;
64
64
%x1 = add <2 x i64 > %x , <i64 1 , i64 1 >
@@ -72,9 +72,9 @@ define <2 x i64> @test_shl_vector_by_2(<2 x i64> %x) {
72
72
define i64 @test_shl_umax_commuted (i64 %x ) {
73
73
; CHECK-LABEL: define i64 @test_shl_umax_commuted(
74
74
; CHECK-SAME: i64 [[X:%.*]]) {
75
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
76
75
; CHECK-NEXT: [[SHL:%.*]] = shl nuw i64 [[X]], 2
77
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[X1]], i64 [[SHL]])
76
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
77
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[SHL]]
78
78
; CHECK-NEXT: ret i64 [[MAX]]
79
79
;
80
80
%x1 = add i64 %x , 1
@@ -162,10 +162,10 @@ define i64 @test_shl_multi_use_add(i64 %x) {
162
162
define i64 @test_shl_multi_use_shl (i64 %x ) {
163
163
; CHECK-LABEL: define i64 @test_shl_multi_use_shl(
164
164
; CHECK-SAME: i64 [[X:%.*]]) {
165
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
166
165
; CHECK-NEXT: [[SHL:%.*]] = shl nuw i64 [[X]], 2
167
166
; CHECK-NEXT: call void @use(i64 [[SHL]])
168
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[SHL]], i64 [[X1]])
167
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
168
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[SHL]]
169
169
; CHECK-NEXT: ret i64 [[MAX]]
170
170
;
171
171
%x1 = add i64 %x , 1
@@ -180,9 +180,9 @@ define i64 @test_shl_multi_use_shl(i64 %x) {
180
180
define i64 @test_mul_by_3 (i64 %x ) {
181
181
; CHECK-LABEL: define i64 @test_mul_by_3(
182
182
; CHECK-SAME: i64 [[X:%.*]]) {
183
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
184
183
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i64 [[X]], 3
185
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[MUL]], i64 [[X1]])
184
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
185
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[MUL]]
186
186
; CHECK-NEXT: ret i64 [[MAX]]
187
187
;
188
188
%x1 = add i64 %x , 1
@@ -194,9 +194,9 @@ define i64 @test_mul_by_3(i64 %x) {
194
194
define i64 @test_mul_by_5 (i64 %x ) {
195
195
; CHECK-LABEL: define i64 @test_mul_by_5(
196
196
; CHECK-SAME: i64 [[X:%.*]]) {
197
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
198
197
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i64 [[X]], 5
199
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[MUL]], i64 [[X1]])
198
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
199
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[MUL]]
200
200
; CHECK-NEXT: ret i64 [[MAX]]
201
201
;
202
202
%x1 = add i64 %x , 1
@@ -208,9 +208,9 @@ define i64 @test_mul_by_5(i64 %x) {
208
208
define i64 @test_mul_with_nsw (i64 %x ) {
209
209
; CHECK-LABEL: define i64 @test_mul_with_nsw(
210
210
; CHECK-SAME: i64 [[X:%.*]]) {
211
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
212
211
; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i64 [[X]], 3
213
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[MUL]], i64 [[X1]])
212
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
213
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[MUL]]
214
214
; CHECK-NEXT: ret i64 [[MAX]]
215
215
;
216
216
%x1 = add i64 %x , 1
@@ -222,9 +222,9 @@ define i64 @test_mul_with_nsw(i64 %x) {
222
222
define <2 x i64 > @test_mul_vector_by_3 (<2 x i64 > %x ) {
223
223
; CHECK-LABEL: define <2 x i64> @test_mul_vector_by_3(
224
224
; CHECK-SAME: <2 x i64> [[X:%.*]]) {
225
- ; CHECK-NEXT: [[X1:%.*]] = add <2 x i64> [[X]], splat (i64 1)
226
225
; CHECK-NEXT: [[MUL:%.*]] = mul nuw <2 x i64> [[X]], splat (i64 3)
227
- ; CHECK-NEXT: [[MAX:%.*]] = call <2 x i64> @llvm.umax.v2i64(<2 x i64> [[MUL]], <2 x i64> [[X1]])
226
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <2 x i64> [[X]], zeroinitializer
227
+ ; CHECK-NEXT: [[MAX:%.*]] = select <2 x i1> [[TMP1]], <2 x i64> splat (i64 1), <2 x i64> [[MUL]]
228
228
; CHECK-NEXT: ret <2 x i64> [[MAX]]
229
229
;
230
230
%x1 = add <2 x i64 > %x , <i64 1 , i64 1 >
@@ -238,9 +238,9 @@ define <2 x i64> @test_mul_vector_by_3(<2 x i64> %x) {
238
238
define i64 @test_mul_max_commuted (i64 %x ) {
239
239
; CHECK-LABEL: define i64 @test_mul_max_commuted(
240
240
; CHECK-SAME: i64 [[X:%.*]]) {
241
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
242
241
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i64 [[X]], 3
243
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[X1]], i64 [[MUL]])
242
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
243
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[MUL]]
244
244
; CHECK-NEXT: ret i64 [[MAX]]
245
245
;
246
246
%x1 = add i64 %x , 1
@@ -339,10 +339,10 @@ define i64 @test_mul_multi_use_add(i64 %x) {
339
339
define i64 @test_mul_multi_use_mul (i64 %x ) {
340
340
; CHECK-LABEL: define i64 @test_mul_multi_use_mul(
341
341
; CHECK-SAME: i64 [[X:%.*]]) {
342
- ; CHECK-NEXT: [[X1:%.*]] = add i64 [[X]], 1
343
342
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i64 [[X]], 3
344
343
; CHECK-NEXT: call void @use(i64 [[MUL]])
345
- ; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[MUL]], i64 [[X1]])
344
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X]], 0
345
+ ; CHECK-NEXT: [[MAX:%.*]] = select i1 [[TMP1]], i64 1, i64 [[MUL]]
346
346
; CHECK-NEXT: ret i64 [[MAX]]
347
347
;
348
348
%x1 = add i64 %x , 1
0 commit comments