@@ -2350,4 +2350,65 @@ define i8 @fold_add_umax_to_usub_multiuse(i8 %a) {
2350
2350
ret i8 %sel
2351
2351
}
2352
2352
2353
+ define i32 @uadd_with_zext (i32 %x , i32 %y ) {
2354
+ ; CHECK-LABEL: @uadd_with_zext(
2355
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
2356
+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
2357
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
2358
+ ; CHECK-NEXT: [[COND1:%.*]] = call i64 @llvm.umin.i64(i64 [[ADD]], i64 4294967295)
2359
+ ; CHECK-NEXT: [[COND:%.*]] = trunc nuw i64 [[COND1]] to i32
2360
+ ; CHECK-NEXT: ret i32 [[COND]]
2361
+ ;
2362
+ %conv = zext i32 %x to i64
2363
+ %conv1 = zext i32 %y to i64
2364
+ %add = add i64 %conv , %conv1
2365
+ %cmp = icmp ugt i64 %add , 4294967295
2366
+ %conv4 = trunc i64 %add to i32
2367
+ %cond = select i1 %cmp , i32 -1 , i32 %conv4
2368
+ ret i32 %cond
2369
+ }
2370
+
2371
+ define i32 @uadd_with_zext_multi_use (i32 %x , i32 %y ) {
2372
+ ; CHECK-LABEL: @uadd_with_zext_multi_use(
2373
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
2374
+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
2375
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
2376
+ ; CHECK-NEXT: [[TRUNCADD:%.*]] = trunc i64 [[ADD]] to i32
2377
+ ; CHECK-NEXT: call void @usei32(i32 [[TRUNCADD]])
2378
+ ; CHECK-NEXT: [[COND1:%.*]] = call i64 @llvm.umin.i64(i64 [[ADD]], i64 4294967295)
2379
+ ; CHECK-NEXT: [[COND:%.*]] = trunc nuw i64 [[COND1]] to i32
2380
+ ; CHECK-NEXT: ret i32 [[COND]]
2381
+ ;
2382
+ %conv = zext i32 %x to i64
2383
+ %conv1 = zext i32 %y to i64
2384
+ %add = add i64 %conv , %conv1
2385
+ %truncAdd = trunc i64 %add to i32
2386
+ call void @usei32 (i32 %truncAdd )
2387
+ %cmp = icmp ugt i64 %add , 4294967295
2388
+ %cond = select i1 %cmp , i32 -1 , i32 %truncAdd
2389
+ ret i32 %cond
2390
+ }
2391
+
2392
+ define i32 @uadd_with_zext_neg_use (i32 %x , i32 %y ) {
2393
+ ; CHECK-LABEL: @uadd_with_zext_neg_use(
2394
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
2395
+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
2396
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
2397
+ ; CHECK-NEXT: call void @usei64(i64 [[ADD]])
2398
+ ; CHECK-NEXT: [[COND1:%.*]] = call i64 @llvm.umin.i64(i64 [[ADD]], i64 4294967295)
2399
+ ; CHECK-NEXT: [[COND:%.*]] = trunc nuw i64 [[COND1]] to i32
2400
+ ; CHECK-NEXT: ret i32 [[COND]]
2401
+ ;
2402
+ %conv = zext i32 %x to i64
2403
+ %conv1 = zext i32 %y to i64
2404
+ %add = add i64 %conv , %conv1
2405
+ call void @usei64 (i64 %add )
2406
+ %cmp = icmp ugt i64 %add , 4294967295
2407
+ %conv4 = trunc i64 %add to i32
2408
+ %cond = select i1 %cmp , i32 -1 , i32 %conv4
2409
+ ret i32 %cond
2410
+ }
2411
+
2412
+ declare void @usei64 (i64 )
2413
+ declare void @usei32 (i32 )
2353
2414
declare void @usei8 (i8 )
0 commit comments