@@ -2350,4 +2350,65 @@ define i8 @fold_add_umax_to_usub_multiuse(i8 %a) {
23502350 ret i8 %sel
23512351}
23522352
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 )
23532414declare void @usei8 (i8 )
0 commit comments