@@ -1435,11 +1435,26 @@ define i32 @and31_add_sexts(i1 %x, i1 %y) {
14351435 ret i32 %r
14361436}
14371437
1438- ; Negative test - extra use
1439-
14401438define i32 @lshr_add_use_sexts (i1 %x , i1 %y , ptr %p ) {
14411439; CHECK-LABEL: @lshr_add_use_sexts(
14421440; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
1441+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1442+ ; CHECK-NEXT: store i32 [[YS]], ptr [[P:%.*]], align 4
1443+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1444+ ; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1445+ ; CHECK-NEXT: ret i32 [[R]]
1446+ ;
1447+ %xs = sext i1 %x to i32
1448+ %ys = sext i1 %y to i32
1449+ store i32 %ys , ptr %p
1450+ %sub = add i32 %xs , %ys
1451+ %r = lshr i32 %sub , 31
1452+ ret i32 %r
1453+ }
1454+
1455+ define i32 @lshr_add_use_sexts_2 (i1 %x , i1 %y , ptr %p ) {
1456+ ; CHECK-LABEL: @lshr_add_use_sexts_2(
1457+ ; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
14431458; CHECK-NEXT: store i32 [[XS]], ptr [[P:%.*]], align 4
14441459; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
14451460; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
@@ -1456,18 +1471,20 @@ define i32 @lshr_add_use_sexts(i1 %x, i1 %y, ptr %p) {
14561471
14571472; Negative test - extra use
14581473
1459- define i32 @lshr_add_use2_sexts (i1 %x , i1 %y , ptr %p ) {
1460- ; CHECK-LABEL: @lshr_add_use2_sexts(
1474+ declare void @use_sexts (i32 , i32 )
1475+
1476+ define i32 @lshr_add_use_sexts_both (i1 %x , i1 %y ) {
1477+ ; CHECK-LABEL: @lshr_add_use_sexts_both(
14611478; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
14621479; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1463- ; CHECK-NEXT: store i32 [[YS ]], ptr [[P:%.*]], align 4
1480+ ; CHECK-NEXT: call void @use_sexts( i32 [[XS ]], i32 [[YS]])
14641481; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
14651482; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
14661483; CHECK-NEXT: ret i32 [[R]]
14671484;
14681485 %xs = sext i1 %x to i32
14691486 %ys = sext i1 %y to i32
1470- store i32 %ys , ptr %p
1487+ call void @use_sexts ( i32 %xs , i32 %ys )
14711488 %sub = add i32 %xs , %ys
14721489 %r = lshr i32 %sub , 31
14731490 ret i32 %r
@@ -4018,8 +4035,8 @@ define i32 @add_reduce_sqr_sum_varC_invalid2(i32 %a, i32 %b) {
40184035
40194036define i32 @fold_sext_addition_or_disjoint (i8 %x ) {
40204037; CHECK-LABEL: @fold_sext_addition_or_disjoint(
4021- ; CHECK-NEXT: [[SE :%.*]] = sext i8 [[XX :%.*]] to i32
4022- ; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE ]], 1246
4038+ ; CHECK-NEXT: [[TMP1 :%.*]] = sext i8 [[X :%.*]] to i32
4039+ ; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[TMP1 ]], 1246
40234040; CHECK-NEXT: ret i32 [[R]]
40244041;
40254042 %xx = or disjoint i8 %x , 12
@@ -4043,8 +4060,8 @@ define i32 @fold_sext_addition_fail(i8 %x) {
40434060
40444061define i32 @fold_zext_addition_or_disjoint (i8 %x ) {
40454062; CHECK-LABEL: @fold_zext_addition_or_disjoint(
4046- ; CHECK-NEXT: [[SE :%.*]] = zext i8 [[XX :%.*]] to i32
4047- ; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[SE ]], 1246
4063+ ; CHECK-NEXT: [[TMP1 :%.*]] = zext i8 [[X :%.*]] to i32
4064+ ; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[TMP1 ]], 1246
40484065; CHECK-NEXT: ret i32 [[R]]
40494066;
40504067 %xx = or disjoint i8 %x , 12
@@ -4055,9 +4072,9 @@ define i32 @fold_zext_addition_or_disjoint(i8 %x) {
40554072
40564073define i32 @fold_zext_addition_or_disjoint2 (i8 %x ) {
40574074; CHECK-LABEL: @fold_zext_addition_or_disjoint2(
4058- ; CHECK-NEXT: [[XX :%.*]] = add nuw i8 [[X:%.*]], 4
4059- ; CHECK-NEXT: [[SE :%.*]] = zext i8 [[XX ]] to i32
4060- ; CHECK-NEXT: ret i32 [[SE ]]
4075+ ; CHECK-NEXT: [[TMP1 :%.*]] = add nuw i8 [[X:%.*]], 4
4076+ ; CHECK-NEXT: [[R :%.*]] = zext i8 [[TMP1 ]] to i32
4077+ ; CHECK-NEXT: ret i32 [[R ]]
40614078;
40624079 %xx = or disjoint i8 %x , 18
40634080 %se = zext i8 %xx to i32
0 commit comments