179 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S %s | FileCheck %s3 4define i32 @reassoc_add_nuw(i32 %x) {5; CHECK-LABEL: @reassoc_add_nuw(6; CHECK-NEXT: [[ADD1:%.*]] = add nuw i32 [[X:%.*]], 687; CHECK-NEXT: ret i32 [[ADD1]]8;9 %add0 = add nuw i32 %x, 410 %add1 = add nuw i32 %add0, 6411 ret i32 %add112}13 14; This does the wrong thing because the sub is turned into an add of a15; negative constant first which drops the nuw.16define i32 @reassoc_sub_nuw(i32 %x) {17; CHECK-LABEL: @reassoc_sub_nuw(18; CHECK-NEXT: [[SUB1:%.*]] = add i32 [[X:%.*]], -6819; CHECK-NEXT: ret i32 [[SUB1]]20;21 %sub0 = sub nuw i32 %x, 422 %sub1 = sub nuw i32 %sub0, 6423 ret i32 %sub124}25 26define i32 @reassoc_mul_nuw(i32 %x) {27; CHECK-LABEL: @reassoc_mul_nuw(28; CHECK-NEXT: [[MUL1:%.*]] = mul nuw i32 [[X:%.*]], 26029; CHECK-NEXT: ret i32 [[MUL1]]30;31 %mul0 = mul nuw i32 %x, 432 %mul1 = mul nuw i32 %mul0, 6533 ret i32 %mul134}35 36define i32 @no_reassoc_add_nuw_none(i32 %x) {37; CHECK-LABEL: @no_reassoc_add_nuw_none(38; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[X:%.*]], 6839; CHECK-NEXT: ret i32 [[ADD1]]40;41 %add0 = add i32 %x, 442 %add1 = add nuw i32 %add0, 6443 ret i32 %add144}45 46define i32 @no_reassoc_add_none_nuw(i32 %x) {47; CHECK-LABEL: @no_reassoc_add_none_nuw(48; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[X:%.*]], 6849; CHECK-NEXT: ret i32 [[ADD1]]50;51 %add0 = add nuw i32 %x, 452 %add1 = add i32 %add0, 6453 ret i32 %add154}55 56define i32 @reassoc_x2_add_nuw(i32 %x, i32 %y) {57; CHECK-LABEL: @reassoc_x2_add_nuw(58; CHECK-NEXT: [[ADD1:%.*]] = add nuw i32 [[X:%.*]], [[Y:%.*]]59; CHECK-NEXT: [[ADD2:%.*]] = add nuw i32 [[ADD1]], 1260; CHECK-NEXT: ret i32 [[ADD2]]61;62 %add0 = add nuw i32 %x, 463 %add1 = add nuw i32 %y, 864 %add2 = add nuw i32 %add0, %add165 ret i32 %add266}67 68define i32 @reassoc_x2_mul_nuw(i32 %x, i32 %y) {69; CHECK-LABEL: @reassoc_x2_mul_nuw(70; CHECK-NEXT: [[MUL1:%.*]] = mul i32 [[X:%.*]], [[Y:%.*]]71; CHECK-NEXT: [[MUL2:%.*]] = mul nuw i32 [[MUL1]], 4572; CHECK-NEXT: ret i32 [[MUL2]]73;74 %mul0 = mul nuw i32 %x, 575 %mul1 = mul nuw i32 %y, 976 %mul2 = mul nuw i32 %mul0, %mul177 ret i32 %mul278}79 80define i32 @reassoc_x2_sub_nuw(i32 %x, i32 %y) {81; CHECK-LABEL: @reassoc_x2_sub_nuw(82; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[X:%.*]], [[Y:%.*]]83; CHECK-NEXT: [[SUB2:%.*]] = add i32 [[TMP1]], 484; CHECK-NEXT: ret i32 [[SUB2]]85;86 %sub0 = sub nuw i32 %x, 487 %sub1 = sub nuw i32 %y, 888 %sub2 = sub nuw i32 %sub0, %sub189 ret i32 %sub290}91 92define i32 @tryFactorization_add_nuw_mul_nuw(i32 %x) {93; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw(94; CHECK-NEXT: [[ADD2:%.*]] = shl nuw i32 [[X:%.*]], 295; CHECK-NEXT: ret i32 [[ADD2]]96;97 %mul1 = mul nuw i32 %x, 398 %add2 = add nuw i32 %mul1, %x99 ret i32 %add2100}101 102define i32 @tryFactorization_add_nuw_mul_nuw_int_max(i32 %x) {103; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_int_max(104; CHECK-NEXT: [[ADD2:%.*]] = shl nuw i32 [[X:%.*]], 31105; CHECK-NEXT: ret i32 [[ADD2]]106;107 %mul1 = mul nuw i32 %x, 2147483647108 %add2 = add nuw i32 %mul1, %x109 ret i32 %add2110}111 112define i32 @tryFactorization_add_mul_nuw(i32 %x) {113; CHECK-LABEL: @tryFactorization_add_mul_nuw(114; CHECK-NEXT: [[ADD2:%.*]] = shl i32 [[X:%.*]], 2115; CHECK-NEXT: ret i32 [[ADD2]]116;117 %mul1 = mul i32 %x, 3118 %add2 = add nuw i32 %mul1, %x119 ret i32 %add2120}121 122define i32 @tryFactorization_add_nuw_mul(i32 %x) {123; CHECK-LABEL: @tryFactorization_add_nuw_mul(124; CHECK-NEXT: [[ADD2:%.*]] = shl i32 [[X:%.*]], 2125; CHECK-NEXT: ret i32 [[ADD2]]126;127 %mul1 = mul nuw i32 %x, 3128 %add2 = add i32 %mul1, %x129 ret i32 %add2130}131 132define i32 @tryFactorization_add_nuw_mul_nuw_mul_nuw_var(i32 %x, i32 %y, i32 %z) {133; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_mul_nuw_var(134; CHECK-NEXT: [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]135; CHECK-NEXT: [[ADD1:%.*]] = mul nuw i32 [[X:%.*]], [[MUL21]]136; CHECK-NEXT: ret i32 [[ADD1]]137;138 %mul1 = mul nuw i32 %x, %y139 %mul2 = mul nuw i32 %x, %z140 %add1 = add nuw i32 %mul1, %mul2141 ret i32 %add1142}143 144define i32 @tryFactorization_add_nuw_mul_mul_nuw_var(i32 %x, i32 %y, i32 %z) {145; CHECK-LABEL: @tryFactorization_add_nuw_mul_mul_nuw_var(146; CHECK-NEXT: [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]147; CHECK-NEXT: [[ADD1:%.*]] = mul i32 [[X:%.*]], [[MUL21]]148; CHECK-NEXT: ret i32 [[ADD1]]149;150 %mul1 = mul i32 %x, %y151 %mul2 = mul nuw i32 %x, %z152 %add1 = add nuw i32 %mul1, %mul2153 ret i32 %add1154}155 156define i32 @tryFactorization_add_nuw_mul_nuw_mul_var(i32 %x, i32 %y, i32 %z) {157; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_mul_var(158; CHECK-NEXT: [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]159; CHECK-NEXT: [[ADD1:%.*]] = mul i32 [[X:%.*]], [[MUL21]]160; CHECK-NEXT: ret i32 [[ADD1]]161;162 %mul1 = mul nuw i32 %x, %y163 %mul2 = mul i32 %x, %z164 %add1 = add nuw i32 %mul1, %mul2165 ret i32 %add1166}167 168define i32 @tryFactorization_add_mul_nuw_mul_var(i32 %x, i32 %y, i32 %z) {169; CHECK-LABEL: @tryFactorization_add_mul_nuw_mul_var(170; CHECK-NEXT: [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]171; CHECK-NEXT: [[ADD1:%.*]] = mul i32 [[X:%.*]], [[MUL21]]172; CHECK-NEXT: ret i32 [[ADD1]]173;174 %mul1 = mul nuw i32 %x, %y175 %mul2 = mul nuw i32 %x, %z176 %add1 = add i32 %mul1, %mul2177 ret i32 %add1178}179