1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s 3 4define i8 @test0(i8 %a) { 5; CHECK-LABEL: @test0( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 3 8; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] 9; CHECK: bb: 10; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i8 [[A]], 50 11; CHECK-NEXT: ret i8 [[MUL]] 12; CHECK: exit: 13; CHECK-NEXT: ret i8 0 14; 15entry: 16 %cmp = icmp ult i8 %a, 3 17 br i1 %cmp, label %bb, label %exit 18 19bb: 20 %mul = mul i8 %a, 50 21 ret i8 %mul 22 23exit: 24 ret i8 0 25} 26 27define i8 @test1(i8 %a) { 28; CHECK-LABEL: @test1( 29; CHECK-NEXT: entry: 30; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 4 31; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] 32; CHECK: bb: 33; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50 34; CHECK-NEXT: ret i8 [[MUL]] 35; CHECK: exit: 36; CHECK-NEXT: ret i8 0 37; 38entry: 39 %cmp = icmp ult i8 %a, 4 40 br i1 %cmp, label %bb, label %exit 41 42bb: 43 %mul = mul i8 %a, 50 44 ret i8 %mul 45 46exit: 47 ret i8 0 48} 49 50define i8 @test2(i8 %a) { 51; CHECK-LABEL: @test2( 52; CHECK-NEXT: entry: 53; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 6 54; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] 55; CHECK: bb: 56; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50 57; CHECK-NEXT: ret i8 [[MUL]] 58; CHECK: exit: 59; CHECK-NEXT: ret i8 0 60; 61entry: 62 %cmp = icmp ult i8 %a, 6 63 br i1 %cmp, label %bb, label %exit 64 65bb: 66 %mul = mul i8 %a, 50 67 ret i8 %mul 68 69exit: 70 ret i8 0 71} 72 73define i8 @test3(i8 %a) { 74; CHECK-LABEL: @test3( 75; CHECK-NEXT: entry: 76; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 7 77; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] 78; CHECK: bb: 79; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50 80; CHECK-NEXT: ret i8 [[MUL]] 81; CHECK: exit: 82; CHECK-NEXT: ret i8 0 83; 84entry: 85 %cmp = icmp ult i8 %a, 7 86 br i1 %cmp, label %bb, label %exit 87 88bb: 89 %mul = mul i8 %a, 50 90 ret i8 %mul 91 92exit: 93 ret i8 0 94} 95 96define i8 @test4(i8 %a) { 97; CHECK-LABEL: @test4( 98; CHECK-NEXT: entry: 99; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 3 100; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -3 101; 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]], 50 105; CHECK-NEXT: ret i8 [[MUL]] 106; CHECK: exit: 107; CHECK-NEXT: ret i8 0 108; 109entry: 110 %cmp1 = icmp slt i8 %a, 3 111 %cmp2 = icmp sgt i8 %a, -3 112 %cond = and i1 %cmp1, %cmp2 113 br i1 %cond, label %bb, label %exit 114 115bb: 116 %mul = mul i8 %a, 50 117 ret i8 %mul 118 119exit: 120 ret i8 0 121} 122 123define i8 @test5(i8 %a) { 124; CHECK-LABEL: @test5( 125; CHECK-NEXT: entry: 126; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 3 127; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -4 128; 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]], 50 132; CHECK-NEXT: ret i8 [[MUL]] 133; CHECK: exit: 134; CHECK-NEXT: ret i8 0 135; 136entry: 137 %cmp1 = icmp slt i8 %a, 3 138 %cmp2 = icmp sgt i8 %a, -4 139 %cond = and i1 %cmp1, %cmp2 140 br i1 %cond, label %bb, label %exit 141 142bb: 143 %mul = mul i8 %a, 50 144 ret i8 %mul 145 146exit: 147 ret i8 0 148} 149 150define i8 @test6(i8 %a) { 151; CHECK-LABEL: @test6( 152; CHECK-NEXT: entry: 153; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 4 154; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -3 155; 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]], 50 159; CHECK-NEXT: ret i8 [[MUL]] 160; CHECK: exit: 161; CHECK-NEXT: ret i8 0 162; 163entry: 164 %cmp1 = icmp slt i8 %a, 4 165 %cmp2 = icmp sgt i8 %a, -3 166 %cond = and i1 %cmp1, %cmp2 167 br i1 %cond, label %bb, label %exit 168 169bb: 170 %mul = mul i8 %a, 50 171 ret i8 %mul 172 173exit: 174 ret i8 0 175} 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:%.*]], 1 181; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[C]], 4 182; CHECK-NEXT: ret i1 false 183; 184entry: 185 %c = add nuw nsw i8 %b, 1 186 %mul = mul nuw i8 %c, 4 187 %cmp = icmp eq i8 %mul, 0 188 ret i1 %cmp 189} 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:%.*]], 3 195; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[C]], 4 196; CHECK-NEXT: ret i1 false 197; 198entry: 199 %c = add nuw nsw i8 %b, 3 200 %mul = mul nuw i8 %c, 4 201 %cmp = icmp ult i8 %mul, 2 202 ret i1 %cmp 203} 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:%.*]], -3 209; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[C]], 4 210; CHECK-NEXT: ret i1 false 211; 212entry: 213 %c = add nuw nsw i8 %b, -3 214 %mul = mul nsw i8 %c, 4 215 %cmp = icmp slt i8 %c, %mul 216 ret i1 %cmp 217} 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, %b 225 ret i1 %mul 226} 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 true 233; 234entry: 235 %mul = mul nuw nsw i32 %x, %y 236 %cmp = icmp sgt i32 %mul, -1 237 ret i1 %cmp 238} 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:%.*]], 2 244; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[X:%.*]], 0 245; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i32 3, i32 4 246; 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 true 249; 250entry: 251 %cmp1 = icmp sgt i32 %y, 2 252 %cmp2 = icmp eq i32 %x, 0 253 %sel1 = select i1 %cmp2, i32 3, i32 4 254 %sel2 = select i1 %cmp1, i32 %y, i32 %sel1 255 %mul = mul nuw nsw i32 %x, %sel2 256 %cmp3 = icmp sgt i32 %mul, -1 257 ret i1 %cmp3 258} 259