259 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s3 4define i8 @test0(i8 %a) {5; CHECK-LABEL: @test0(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 38; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]9; CHECK: bb:10; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i8 [[A]], 5011; CHECK-NEXT: ret i8 [[MUL]]12; CHECK: exit:13; CHECK-NEXT: ret i8 014;15entry:16 %cmp = icmp ult i8 %a, 317 br i1 %cmp, label %bb, label %exit18 19bb:20 %mul = mul i8 %a, 5021 ret i8 %mul22 23exit:24 ret i8 025}26 27define i8 @test1(i8 %a) {28; CHECK-LABEL: @test1(29; CHECK-NEXT: entry:30; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 431; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]32; CHECK: bb:33; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 5034; CHECK-NEXT: ret i8 [[MUL]]35; CHECK: exit:36; CHECK-NEXT: ret i8 037;38entry:39 %cmp = icmp ult i8 %a, 440 br i1 %cmp, label %bb, label %exit41 42bb:43 %mul = mul i8 %a, 5044 ret i8 %mul45 46exit:47 ret i8 048}49 50define i8 @test2(i8 %a) {51; CHECK-LABEL: @test2(52; CHECK-NEXT: entry:53; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 654; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]55; CHECK: bb:56; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 5057; CHECK-NEXT: ret i8 [[MUL]]58; CHECK: exit:59; CHECK-NEXT: ret i8 060;61entry:62 %cmp = icmp ult i8 %a, 663 br i1 %cmp, label %bb, label %exit64 65bb:66 %mul = mul i8 %a, 5067 ret i8 %mul68 69exit:70 ret i8 071}72 73define i8 @test3(i8 %a) {74; CHECK-LABEL: @test3(75; CHECK-NEXT: entry:76; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 777; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]78; CHECK: bb:79; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 5080; CHECK-NEXT: ret i8 [[MUL]]81; CHECK: exit:82; CHECK-NEXT: ret i8 083;84entry:85 %cmp = icmp ult i8 %a, 786 br i1 %cmp, label %bb, label %exit87 88bb:89 %mul = mul i8 %a, 5090 ret i8 %mul91 92exit:93 ret i8 094}95 96define i8 @test4(i8 %a) {97; CHECK-LABEL: @test4(98; CHECK-NEXT: entry:99; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 3100; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -3101; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP1]], [[CMP2]]102; CHECK-NEXT: br i1 [[COND]], label [[BB:%.*]], label [[EXIT:%.*]]103; CHECK: bb:104; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[A]], 50105; CHECK-NEXT: ret i8 [[MUL]]106; CHECK: exit:107; CHECK-NEXT: ret i8 0108;109entry:110 %cmp1 = icmp slt i8 %a, 3111 %cmp2 = icmp sgt i8 %a, -3112 %cond = and i1 %cmp1, %cmp2113 br i1 %cond, label %bb, label %exit114 115bb:116 %mul = mul i8 %a, 50117 ret i8 %mul118 119exit:120 ret i8 0121}122 123define i8 @test5(i8 %a) {124; CHECK-LABEL: @test5(125; CHECK-NEXT: entry:126; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 3127; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -4128; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP1]], [[CMP2]]129; CHECK-NEXT: br i1 [[COND]], label [[BB:%.*]], label [[EXIT:%.*]]130; CHECK: bb:131; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50132; CHECK-NEXT: ret i8 [[MUL]]133; CHECK: exit:134; CHECK-NEXT: ret i8 0135;136entry:137 %cmp1 = icmp slt i8 %a, 3138 %cmp2 = icmp sgt i8 %a, -4139 %cond = and i1 %cmp1, %cmp2140 br i1 %cond, label %bb, label %exit141 142bb:143 %mul = mul i8 %a, 50144 ret i8 %mul145 146exit:147 ret i8 0148}149 150define i8 @test6(i8 %a) {151; CHECK-LABEL: @test6(152; CHECK-NEXT: entry:153; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 4154; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -3155; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP1]], [[CMP2]]156; CHECK-NEXT: br i1 [[COND]], label [[BB:%.*]], label [[EXIT:%.*]]157; CHECK: bb:158; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50159; CHECK-NEXT: ret i8 [[MUL]]160; CHECK: exit:161; CHECK-NEXT: ret i8 0162;163entry:164 %cmp1 = icmp slt i8 %a, 4165 %cmp2 = icmp sgt i8 %a, -3166 %cond = and i1 %cmp1, %cmp2167 br i1 %cond, label %bb, label %exit168 169bb:170 %mul = mul i8 %a, 50171 ret i8 %mul172 173exit:174 ret i8 0175}176 177define i1 @nuw_range1(i8 %b) {178; CHECK-LABEL: @nuw_range1(179; CHECK-NEXT: entry:180; CHECK-NEXT: [[C:%.*]] = add nuw nsw i8 [[B:%.*]], 1181; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[C]], 4182; CHECK-NEXT: ret i1 false183;184entry:185 %c = add nuw nsw i8 %b, 1186 %mul = mul nuw i8 %c, 4187 %cmp = icmp eq i8 %mul, 0188 ret i1 %cmp189}190 191define i1 @nuw_range2(i8 %b) {192; CHECK-LABEL: @nuw_range2(193; CHECK-NEXT: entry:194; CHECK-NEXT: [[C:%.*]] = add nuw nsw i8 [[B:%.*]], 3195; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[C]], 4196; CHECK-NEXT: ret i1 false197;198entry:199 %c = add nuw nsw i8 %b, 3200 %mul = mul nuw i8 %c, 4201 %cmp = icmp ult i8 %mul, 2202 ret i1 %cmp203}204 205define i1 @nsw_range1(i8 %b) {206; CHECK-LABEL: @nsw_range1(207; CHECK-NEXT: entry:208; CHECK-NEXT: [[C:%.*]] = add nuw nsw i8 [[B:%.*]], -3209; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[C]], 4210; CHECK-NEXT: ret i1 false211;212entry:213 %c = add nuw nsw i8 %b, -3214 %mul = mul nsw i8 %c, 4215 %cmp = icmp slt i8 %c, %mul216 ret i1 %cmp217}218 219define i1 @one_bit(i1 %a, i1 %b) {220; CHECK-LABEL: @one_bit(221; CHECK-NEXT: [[MUL:%.*]] = mul nuw i1 [[A:%.*]], [[B:%.*]]222; CHECK-NEXT: ret i1 [[MUL]]223;224 %mul = mul i1 %a, %b225 ret i1 %mul226}227 228define i1 @test_mul_nuw_nsw_nneg(i32 %x, i32 range(i32 3, 2147483648) %y) {229; CHECK-LABEL: @test_mul_nuw_nsw_nneg(230; CHECK-NEXT: entry:231; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[X:%.*]], [[Y:%.*]]232; CHECK-NEXT: ret i1 true233;234entry:235 %mul = mul nuw nsw i32 %x, %y236 %cmp = icmp sgt i32 %mul, -1237 ret i1 %cmp238}239 240define i1 @test_mul_nuw_nsw_nneg_complex(i32 %x, i32 noundef %y, i32 %z) {241; CHECK-LABEL: @test_mul_nuw_nsw_nneg_complex(242; CHECK-NEXT: entry:243; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[Y:%.*]], 2244; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[X:%.*]], 0245; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i32 3, i32 4246; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[SEL1]]247; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[X]], [[SEL2]]248; CHECK-NEXT: ret i1 true249;250entry:251 %cmp1 = icmp sgt i32 %y, 2252 %cmp2 = icmp eq i32 %x, 0253 %sel1 = select i1 %cmp2, i32 3, i32 4254 %sel2 = select i1 %cmp1, i32 %y, i32 %sel1255 %mul = mul nuw nsw i32 %x, %sel2256 %cmp3 = icmp sgt i32 %mul, -1257 ret i1 %cmp3258}259