1016 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @use(i1)5declare void @llvm.assume(i1)6 7define void @slt_mul_nsw_3_known_positive_1(i8 %start, i8 %high) {8; CHECK-LABEL: @slt_mul_nsw_3_known_positive_1(9; CHECK-NEXT: entry:10; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 311; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]12; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 013; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]14; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]15; CHECK: then:16; CHECK-NEXT: call void @use(i1 true)17; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 118; CHECK-NEXT: call void @use(i1 true)19; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 220; CHECK-NEXT: call void @use(i1 true)21; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 322; CHECK-NEXT: call void @use(i1 true)23; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 424; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]25; CHECK-NEXT: call void @use(i1 [[C_3]])26; CHECK-NEXT: ret void27; CHECK: else:28; CHECK-NEXT: ret void29;30entry:31 %mul.3 = mul nsw i8 %start, 332 %c.1 = icmp slt i8 %mul.3, %high33 %c.2 = icmp sgt i8 %start, 034 %and = and i1 %c.1, %c.235 br i1 %and, label %then, label %else36 37then:38 %t.0 = icmp slt i8 %start, %high39 call void @use(i1 %t.0)40 %start.1 = mul nsw i8 %start, 141 %t.1 = icmp slt i8 %start.1, %high42 call void @use(i1 %t.1)43 %start.2 = mul nsw i8 %start, 244 %t.2 = icmp slt i8 %start.2, %high45 call void @use(i1 %t.2)46 %start.3 = mul nsw i8 %start, 347 %t.3 = icmp slt i8 %start.3, %high48 call void @use(i1 %t.3)49 %start.4 = mul nsw i8 %start, 450 %c.3 = icmp slt i8 %start.4, %high51 call void @use(i1 %c.3)52 ret void53 54else:55 ret void56}57 58define void @slt_mul_nsw_3_known_positive_2(i8 %start, i8 %high) {59; CHECK-LABEL: @slt_mul_nsw_3_known_positive_2(60; CHECK-NEXT: entry:61; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 362; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]63; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 064; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]65; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]66; CHECK: then:67; CHECK-NEXT: ret void68; CHECK: else:69; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]]70; CHECK-NEXT: call void @use(i1 [[C_4]])71; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 172; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]73; CHECK-NEXT: call void @use(i1 [[C_5]])74; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 275; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]76; CHECK-NEXT: call void @use(i1 [[C_6]])77; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 378; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]79; CHECK-NEXT: call void @use(i1 [[C_7]])80; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 481; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]82; CHECK-NEXT: call void @use(i1 [[C_8]])83; CHECK-NEXT: ret void84;85entry:86 %mul.3 = mul nsw i8 %start, 387 %c.1 = icmp slt i8 %mul.3, %high88 %c.2 = icmp sgt i8 %start, 089 %and = and i1 %c.1, %c.290 br i1 %and, label %then, label %else91 92then:93 ret void94 95else:96 %c.4 = icmp slt i8 %start, %high97 call void @use(i1 %c.4)98 %else.start.1 = mul nsw i8 %start, 199 %c.5 = icmp slt i8 %else.start.1, %high100 call void @use(i1 %c.5)101 %else.start.2 = mul nsw i8 %start, 2102 %c.6 = icmp slt i8 %else.start.2, %high103 call void @use(i1 %c.6)104 %else.start.3 = mul nsw i8 %start, 3105 %c.7 = icmp slt i8 %else.start.3, %high106 call void @use(i1 %c.7)107 %else.start.4 = mul nsw i8 %start, 4108 %c.8 = icmp slt i8 %else.start.4, %high109 call void @use(i1 %c.8)110 ret void111}112 113define void @slt_mul_no_nsw_3_known_positive_1(i8 %start, i8 %high) {114; CHECK-LABEL: @slt_mul_no_nsw_3_known_positive_1(115; CHECK-NEXT: entry:116; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3117; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]118; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0119; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]120; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]121; CHECK: then:122; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]]123; CHECK-NEXT: call void @use(i1 [[C_3]])124; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1125; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]126; CHECK-NEXT: call void @use(i1 [[C_4]])127; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2128; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]129; CHECK-NEXT: call void @use(i1 [[C_5]])130; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3131; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START_3]], [[HIGH]]132; CHECK-NEXT: call void @use(i1 [[C_6]])133; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4134; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]135; CHECK-NEXT: call void @use(i1 [[C_7]])136; CHECK-NEXT: ret void137; CHECK: else:138; CHECK-NEXT: ret void139;140entry:141 %mul.3 = mul i8 %start, 3142 %c.1 = icmp slt i8 %mul.3, %high143 %c.2 = icmp sgt i8 %start, 0144 %and = and i1 %c.1, %c.2145 br i1 %and, label %then, label %else146 147then:148 %c.3 = icmp slt i8 %start, %high149 call void @use(i1 %c.3)150 %start.1 = mul nsw i8 %start, 1151 %c.4 = icmp slt i8 %start.1, %high152 call void @use(i1 %c.4)153 %start.2 = mul nsw i8 %start, 2154 %c.5 = icmp slt i8 %start.2, %high155 call void @use(i1 %c.5)156 %start.3 = mul nsw i8 %start, 3157 %c.6 = icmp slt i8 %start.3, %high158 call void @use(i1 %c.6)159 %start.4 = mul nsw i8 %start, 4160 %c.7 = icmp slt i8 %start.4, %high161 call void @use(i1 %c.7)162 ret void163 164else:165 ret void166}167 168define void @slt_mul_no_nsw_3_known_positive_2(i8 %start, i8 %high) {169; CHECK-LABEL: @slt_mul_no_nsw_3_known_positive_2(170; CHECK-NEXT: entry:171; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3172; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]173; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0174; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]175; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]176; CHECK: then:177; CHECK-NEXT: ret void178; CHECK: else:179; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[START]], [[HIGH]]180; CHECK-NEXT: call void @use(i1 [[C_8]])181; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1182; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]183; CHECK-NEXT: call void @use(i1 [[C_9]])184; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2185; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]186; CHECK-NEXT: call void @use(i1 [[C_10]])187; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3188; CHECK-NEXT: [[C_11:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]189; CHECK-NEXT: call void @use(i1 [[C_11]])190; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4191; CHECK-NEXT: [[C_12:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]192; CHECK-NEXT: call void @use(i1 [[C_12]])193; CHECK-NEXT: ret void194;195entry:196 %mul.3 = mul i8 %start, 3197 %c.1 = icmp slt i8 %mul.3, %high198 %c.2 = icmp sgt i8 %start, 0199 %and = and i1 %c.1, %c.2200 br i1 %and, label %then, label %else201 202then:203 ret void204 205else:206 %c.8 = icmp slt i8 %start, %high207 call void @use(i1 %c.8)208 %else.start.1 = mul nsw i8 %start, 1209 %c.9 = icmp slt i8 %else.start.1, %high210 call void @use(i1 %c.9)211 %else.start.2 = mul nsw i8 %start, 2212 %c.10 = icmp slt i8 %else.start.2, %high213 call void @use(i1 %c.10)214 %else.start.3 = mul nsw i8 %start, 3215 %c.11 = icmp slt i8 %else.start.3, %high216 call void @use(i1 %c.11)217 %else.start.4 = mul nsw i8 %start, 4218 %c.12 = icmp slt i8 %else.start.4, %high219 call void @use(i1 %c.12)220 ret void221}222 223define void @slt_mul_nsw_3_not_known_positive_1(i8 %start, i8 %high) {224; CHECK-LABEL: @slt_mul_nsw_3_not_known_positive_1(225; CHECK-NEXT: entry:226; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3227; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]228; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]229; CHECK: then:230; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]]231; CHECK-NEXT: call void @use(i1 [[C_3]])232; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1233; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]234; CHECK-NEXT: call void @use(i1 [[C_4]])235; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2236; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]237; CHECK-NEXT: call void @use(i1 [[C_5]])238; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3239; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START_3]], [[HIGH]]240; CHECK-NEXT: call void @use(i1 [[C_6]])241; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4242; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]243; CHECK-NEXT: call void @use(i1 [[C_7]])244; CHECK-NEXT: ret void245; CHECK: else:246; CHECK-NEXT: ret void247;248entry:249 %mul.3 = mul i8 %start, 3250 %c.1 = icmp slt i8 %mul.3, %high251 br i1 %c.1, label %then, label %else252 253then:254 %c.3 = icmp slt i8 %start, %high255 call void @use(i1 %c.3)256 %start.1 = mul nsw i8 %start, 1257 %c.4 = icmp slt i8 %start.1, %high258 call void @use(i1 %c.4)259 %start.2 = mul nsw i8 %start, 2260 %c.5 = icmp slt i8 %start.2, %high261 call void @use(i1 %c.5)262 %start.3 = mul nsw i8 %start, 3263 %c.6 = icmp slt i8 %start.3, %high264 call void @use(i1 %c.6)265 %start.4 = mul nsw i8 %start, 4266 %c.7 = icmp slt i8 %start.4, %high267 call void @use(i1 %c.7)268 ret void269 270else:271 ret void272}273 274define void @slt_mul_nsw_3_not_known_positive_2(i8 %start, i8 %high) {275; CHECK-LABEL: @slt_mul_nsw_3_not_known_positive_2(276; CHECK-NEXT: entry:277; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3278; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]279; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]280; CHECK: then:281; CHECK-NEXT: ret void282; CHECK: else:283; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[START]], [[HIGH]]284; CHECK-NEXT: call void @use(i1 [[C_8]])285; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1286; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]287; CHECK-NEXT: call void @use(i1 [[C_9]])288; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2289; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]290; CHECK-NEXT: call void @use(i1 [[C_10]])291; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3292; CHECK-NEXT: [[C_11:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]293; CHECK-NEXT: call void @use(i1 [[C_11]])294; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4295; CHECK-NEXT: [[C_12:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]296; CHECK-NEXT: call void @use(i1 [[C_12]])297; CHECK-NEXT: ret void298;299entry:300 %mul.3 = mul i8 %start, 3301 %c.1 = icmp slt i8 %mul.3, %high302 br i1 %c.1, label %then, label %else303 304then:305 ret void306 307else:308 %c.8 = icmp slt i8 %start, %high309 call void @use(i1 %c.8)310 %else.start.1 = mul nsw i8 %start, 1311 %c.9 = icmp slt i8 %else.start.1, %high312 call void @use(i1 %c.9)313 %else.start.2 = mul nsw i8 %start, 2314 %c.10 = icmp slt i8 %else.start.2, %high315 call void @use(i1 %c.10)316 %else.start.3 = mul nsw i8 %start, 3317 %c.11 = icmp slt i8 %else.start.3, %high318 call void @use(i1 %c.11)319 %else.start.4 = mul nsw i8 %start, 4320 %c.12 = icmp slt i8 %else.start.4, %high321 call void @use(i1 %c.12)322 ret void323}324 325define void @slt_mul_nsw_neg_3_known_negative_1(i8 %start, i8 %high) {326; CHECK-LABEL: @slt_mul_nsw_neg_3_known_negative_1(327; CHECK-NEXT: entry:328; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3329; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]330; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0331; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]332; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]333; CHECK: then:334; CHECK-NEXT: call void @use(i1 true)335; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], -1336; CHECK-NEXT: call void @use(i1 true)337; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], -2338; CHECK-NEXT: call void @use(i1 true)339; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], -3340; CHECK-NEXT: call void @use(i1 true)341; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], -4342; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]343; CHECK-NEXT: call void @use(i1 [[C_3]])344; CHECK-NEXT: ret void345; CHECK: else:346; CHECK-NEXT: ret void347;348entry:349 %mul.3 = mul nsw i8 %start, -3350 %c.1 = icmp slt i8 %mul.3, %high351 %c.2 = icmp slt i8 %start, 0352 %and = and i1 %c.1, %c.2353 br i1 %and, label %then, label %else354 355then:356 %t.0 = icmp slt i8 %start, %high357 call void @use(i1 %t.0)358 %start.1 = mul nsw i8 %start, -1359 %t.1 = icmp slt i8 %start.1, %high360 call void @use(i1 %t.1)361 %start.2 = mul nsw i8 %start, -2362 %t.2 = icmp slt i8 %start.2, %high363 call void @use(i1 %t.2)364 %start.3 = mul nsw i8 %start, -3365 %t.3 = icmp slt i8 %start.3, %high366 call void @use(i1 %t.3)367 %start.4 = mul nsw i8 %start, -4368 %c.3 = icmp slt i8 %start.4, %high369 call void @use(i1 %c.3)370 ret void371 372else:373 ret void374}375 376define void @slt_mul_nsw_neg_3_known_negative_2(i8 %start, i8 %high) {377; CHECK-LABEL: @slt_mul_nsw_neg_3_known_negative_2(378; CHECK-NEXT: entry:379; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3380; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]381; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0382; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]383; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]384; CHECK: then:385; CHECK-NEXT: ret void386; CHECK: else:387; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]]388; CHECK-NEXT: call void @use(i1 [[C_4]])389; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], -1390; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]391; CHECK-NEXT: call void @use(i1 [[C_5]])392; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], -2393; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]394; CHECK-NEXT: call void @use(i1 [[C_6]])395; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], -3396; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]397; CHECK-NEXT: call void @use(i1 [[C_7]])398; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], -4399; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]400; CHECK-NEXT: call void @use(i1 [[C_8]])401; CHECK-NEXT: ret void402;403entry:404 %mul.3 = mul nsw i8 %start, -3405 %c.1 = icmp slt i8 %mul.3, %high406 %c.2 = icmp slt i8 %start, 0407 %and = and i1 %c.1, %c.2408 br i1 %and, label %then, label %else409 410then:411 ret void412 413else:414 %c.4 = icmp slt i8 %start, %high415 call void @use(i1 %c.4)416 %else.start.1 = mul nsw i8 %start, -1417 %c.5 = icmp slt i8 %else.start.1, %high418 call void @use(i1 %c.5)419 %else.start.2 = mul nsw i8 %start, -2420 %c.6 = icmp slt i8 %else.start.2, %high421 call void @use(i1 %c.6)422 %else.start.3 = mul nsw i8 %start, -3423 %c.7 = icmp slt i8 %else.start.3, %high424 call void @use(i1 %c.7)425 %else.start.4 = mul nsw i8 %start, -4426 %c.8 = icmp slt i8 %else.start.4, %high427 call void @use(i1 %c.8)428 ret void429}430 431define void @slt_mul_nsw_3_known_negative_1(i8 %start, i8 %high) {432; CHECK-LABEL: @slt_mul_nsw_3_known_negative_1(433; CHECK-NEXT: entry:434; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3435; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]436; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0437; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]438; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]439; CHECK: then:440; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]]441; CHECK-NEXT: call void @use(i1 [[C_3]])442; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1443; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]444; CHECK-NEXT: call void @use(i1 [[C_4]])445; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2446; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]447; CHECK-NEXT: call void @use(i1 [[C_5]])448; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3449; CHECK-NEXT: call void @use(i1 true)450; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4451; CHECK-NEXT: call void @use(i1 true)452; CHECK-NEXT: ret void453; CHECK: else:454; CHECK-NEXT: ret void455;456entry:457 %mul.3 = mul nsw i8 %start, 3458 %c.1 = icmp slt i8 %mul.3, %high459 %c.2 = icmp slt i8 %start, 0460 %and = and i1 %c.1, %c.2461 br i1 %and, label %then, label %else462 463then:464 %c.3 = icmp slt i8 %start, %high465 call void @use(i1 %c.3)466 %start.1 = mul nsw i8 %start, 1467 %c.4 = icmp slt i8 %start.1, %high468 call void @use(i1 %c.4)469 %start.2 = mul nsw i8 %start, 2470 %c.5 = icmp slt i8 %start.2, %high471 call void @use(i1 %c.5)472 %start.3 = mul nsw i8 %start, 3473 %t.0 = icmp slt i8 %start.3, %high474 call void @use(i1 %t.0)475 %start.4 = mul nsw i8 %start, 4476 %t.1 = icmp slt i8 %start.4, %high477 call void @use(i1 %t.1)478 ret void479 480else:481 ret void482}483 484define void @slt_mul_nsw_3_known_negative_2(i8 %start, i8 %high) {485; CHECK-LABEL: @slt_mul_nsw_3_known_negative_2(486; CHECK-NEXT: entry:487; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3488; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]489; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0490; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]491; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]492; CHECK: then:493; CHECK-NEXT: ret void494; CHECK: else:495; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START]], [[HIGH]]496; CHECK-NEXT: call void @use(i1 [[C_6]])497; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1498; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]499; CHECK-NEXT: call void @use(i1 [[C_7]])500; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2501; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]502; CHECK-NEXT: call void @use(i1 [[C_8]])503; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3504; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]505; CHECK-NEXT: call void @use(i1 [[C_9]])506; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4507; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]508; CHECK-NEXT: call void @use(i1 [[C_10]])509; CHECK-NEXT: ret void510;511entry:512 %mul.3 = mul nsw i8 %start, 3513 %c.1 = icmp slt i8 %mul.3, %high514 %c.2 = icmp slt i8 %start, 0515 %and = and i1 %c.1, %c.2516 br i1 %and, label %then, label %else517 518then:519 ret void520 521else:522 %c.6 = icmp slt i8 %start, %high523 call void @use(i1 %c.6)524 %else.start.1 = mul nsw i8 %start, 1525 %c.7 = icmp slt i8 %else.start.1, %high526 call void @use(i1 %c.7)527 %else.start.2 = mul nsw i8 %start, 2528 %c.8 = icmp slt i8 %else.start.2, %high529 call void @use(i1 %c.8)530 %else.start.3 = mul nsw i8 %start, 3531 %c.9 = icmp slt i8 %else.start.3, %high532 call void @use(i1 %c.9)533 %else.start.4 = mul nsw i8 %start, 4534 %c.10 = icmp slt i8 %else.start.4, %high535 call void @use(i1 %c.10)536 ret void537}538 539define void @slt_mul_nsw_neg_3_known_positive_1(i8 %start, i8 %high) {540; CHECK-LABEL: @slt_mul_nsw_neg_3_known_positive_1(541; CHECK-NEXT: entry:542; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3543; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]544; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0545; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]546; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]547; CHECK: then:548; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]]549; CHECK-NEXT: call void @use(i1 [[C_3]])550; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], -1551; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]552; CHECK-NEXT: call void @use(i1 [[C_4]])553; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], -2554; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]555; CHECK-NEXT: call void @use(i1 [[C_5]])556; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], -3557; CHECK-NEXT: call void @use(i1 true)558; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], -4559; CHECK-NEXT: call void @use(i1 true)560; CHECK-NEXT: ret void561; CHECK: else:562; CHECK-NEXT: ret void563;564entry:565 %mul.3 = mul nsw i8 %start, -3566 %c.1 = icmp slt i8 %mul.3, %high567 %c.2 = icmp sgt i8 %start, 0568 %and = and i1 %c.1, %c.2569 br i1 %and, label %then, label %else570 571then:572 %c.3 = icmp slt i8 %start, %high573 call void @use(i1 %c.3)574 %start.1 = mul nsw i8 %start, -1575 %c.4 = icmp slt i8 %start.1, %high576 call void @use(i1 %c.4)577 %start.2 = mul nsw i8 %start, -2578 %c.5 = icmp slt i8 %start.2, %high579 call void @use(i1 %c.5)580 %start.3 = mul nsw i8 %start, -3581 %t.0 = icmp slt i8 %start.3, %high582 call void @use(i1 %t.0)583 %start.4 = mul nsw i8 %start, -4584 %t.1 = icmp slt i8 %start.4, %high585 call void @use(i1 %t.1)586 ret void587 588else:589 ret void590}591 592define void @slt_mul_nsw_neg_3_known_positive_2(i8 %start, i8 %high) {593; CHECK-LABEL: @slt_mul_nsw_neg_3_known_positive_2(594; CHECK-NEXT: entry:595; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3596; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]597; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0598; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]599; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]600; CHECK: then:601; CHECK-NEXT: ret void602; CHECK: else:603; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START]], [[HIGH]]604; CHECK-NEXT: call void @use(i1 [[C_6]])605; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], -1606; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]607; CHECK-NEXT: call void @use(i1 [[C_7]])608; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], -2609; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]610; CHECK-NEXT: call void @use(i1 [[C_8]])611; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], -3612; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]613; CHECK-NEXT: call void @use(i1 [[C_9]])614; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], -4615; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]616; CHECK-NEXT: call void @use(i1 [[C_10]])617; CHECK-NEXT: ret void618;619entry:620 %mul.3 = mul nsw i8 %start, -3621 %c.1 = icmp slt i8 %mul.3, %high622 %c.2 = icmp sgt i8 %start, 0623 %and = and i1 %c.1, %c.2624 br i1 %and, label %then, label %else625 626then:627 ret void628 629else:630 %c.6 = icmp slt i8 %start, %high631 call void @use(i1 %c.6)632 %else.start.1 = mul nsw i8 %start, -1633 %c.7 = icmp slt i8 %else.start.1, %high634 call void @use(i1 %c.7)635 %else.start.2 = mul nsw i8 %start, -2636 %c.8 = icmp slt i8 %else.start.2, %high637 call void @use(i1 %c.8)638 %else.start.3 = mul nsw i8 %start, -3639 %c.9 = icmp slt i8 %else.start.3, %high640 call void @use(i1 %c.9)641 %else.start.4 = mul nsw i8 %start, -4642 %c.10 = icmp slt i8 %else.start.4, %high643 call void @use(i1 %c.10)644 ret void645}646 647define void @slt_mul_nsw_3_known_nonnegative_1(i8 %start, i8 %high) {648; CHECK-LABEL: @slt_mul_nsw_3_known_nonnegative_1(649; CHECK-NEXT: entry:650; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3651; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]652; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[START]], 0653; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]654; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]655; CHECK: then:656; CHECK-NEXT: call void @use(i1 true)657; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1658; CHECK-NEXT: call void @use(i1 true)659; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2660; CHECK-NEXT: call void @use(i1 true)661; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3662; CHECK-NEXT: call void @use(i1 true)663; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4664; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]665; CHECK-NEXT: call void @use(i1 [[C_3]])666; CHECK-NEXT: ret void667; CHECK: else:668; CHECK-NEXT: ret void669;670entry:671 %mul.3 = mul nsw i8 %start, 3672 %c.1 = icmp slt i8 %mul.3, %high673 %c.2 = icmp sge i8 %start, 0674 %and = and i1 %c.1, %c.2675 br i1 %and, label %then, label %else676 677then:678 %t.0 = icmp slt i8 %start, %high679 call void @use(i1 %t.0)680 %start.1 = mul nsw i8 %start, 1681 %t.1 = icmp slt i8 %start.1, %high682 call void @use(i1 %t.1)683 %start.2 = mul nsw i8 %start, 2684 %t.2 = icmp slt i8 %start.2, %high685 call void @use(i1 %t.2)686 %start.3 = mul nsw i8 %start, 3687 %t.3 = icmp slt i8 %start.3, %high688 call void @use(i1 %t.3)689 %start.4 = mul nsw i8 %start, 4690 %c.3 = icmp slt i8 %start.4, %high691 call void @use(i1 %c.3)692 ret void693 694else:695 ret void696}697 698define void @slt_mul_nsw_3_known_nonnegative_2(i8 %start, i8 %high) {699; CHECK-LABEL: @slt_mul_nsw_3_known_nonnegative_2(700; CHECK-NEXT: entry:701; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3702; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]703; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[START]], 0704; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]705; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]706; CHECK: then:707; CHECK-NEXT: ret void708; CHECK: else:709; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]]710; CHECK-NEXT: call void @use(i1 [[C_4]])711; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1712; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]713; CHECK-NEXT: call void @use(i1 [[C_5]])714; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2715; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]716; CHECK-NEXT: call void @use(i1 [[C_6]])717; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3718; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]719; CHECK-NEXT: call void @use(i1 [[C_7]])720; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4721; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]722; CHECK-NEXT: call void @use(i1 [[C_8]])723; CHECK-NEXT: ret void724;725entry:726 %mul.3 = mul nsw i8 %start, 3727 %c.1 = icmp slt i8 %mul.3, %high728 %c.2 = icmp sge i8 %start, 0729 %and = and i1 %c.1, %c.2730 br i1 %and, label %then, label %else731 732then:733 ret void734 735else:736 %c.4 = icmp slt i8 %start, %high737 call void @use(i1 %c.4)738 %else.start.1 = mul nsw i8 %start, 1739 %c.5 = icmp slt i8 %else.start.1, %high740 call void @use(i1 %c.5)741 %else.start.2 = mul nsw i8 %start, 2742 %c.6 = icmp slt i8 %else.start.2, %high743 call void @use(i1 %c.6)744 %else.start.3 = mul nsw i8 %start, 3745 %c.7 = icmp slt i8 %else.start.3, %high746 call void @use(i1 %c.7)747 %else.start.4 = mul nsw i8 %start, 4748 %c.8 = icmp slt i8 %else.start.4, %high749 call void @use(i1 %c.8)750 ret void751}752 753define void @slt_mul_nsw_both_var_non_negative_1(i8 %start, i8 %scale, i8 %high) {754; CHECK-LABEL: @slt_mul_nsw_both_var_non_negative_1(755; CHECK-NEXT: entry:756; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], [[SCALE:%.*]]757; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]758; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0759; CHECK-NEXT: [[C3:%.*]] = icmp sgt i8 [[SCALE]], 0760; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])761; CHECK-NEXT: [[C4:%.*]] = icmp sle i8 [[SCALE]], 3762; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])763; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]764; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]765; CHECK: then:766; CHECK-NEXT: [[T_0:%.*]] = icmp slt i8 [[START]], [[HIGH]]767; CHECK-NEXT: call void @use(i1 [[T_0]])768; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1769; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]770; CHECK-NEXT: call void @use(i1 [[T_1]])771; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2772; CHECK-NEXT: [[T_2:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]773; CHECK-NEXT: call void @use(i1 [[T_2]])774; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3775; CHECK-NEXT: [[T_3:%.*]] = icmp slt i8 [[START_3]], [[HIGH]]776; CHECK-NEXT: call void @use(i1 [[T_3]])777; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4778; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]779; CHECK-NEXT: call void @use(i1 [[C_3]])780; CHECK-NEXT: ret void781; CHECK: else:782; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]]783; CHECK-NEXT: call void @use(i1 [[C_4]])784; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1785; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]786; CHECK-NEXT: call void @use(i1 [[C_5]])787; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2788; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]789; CHECK-NEXT: call void @use(i1 [[C_6]])790; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3791; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]792; CHECK-NEXT: call void @use(i1 [[C_7]])793; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4794; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]795; CHECK-NEXT: call void @use(i1 [[C_8]])796; CHECK-NEXT: ret void797;798entry:799 %mul.3 = mul nsw i8 %start, %scale800 %c.1 = icmp slt i8 %mul.3, %high801 %c.2 = icmp sgt i8 %start, 0802 %c3 = icmp sgt i8 %scale, 0803 call void @llvm.assume(i1 %c3)804 %c4 = icmp sle i8 %scale, 3805 call void @llvm.assume(i1 %c3)806 %and = and i1 %c.1, %c.2807 br i1 %and, label %then, label %else808 809then:810 %t.0 = icmp slt i8 %start, %high811 call void @use(i1 %t.0)812 %start.1 = mul nsw i8 %start, 1813 %t.1 = icmp slt i8 %start.1, %high814 call void @use(i1 %t.1)815 %start.2 = mul nsw i8 %start, 2816 %t.2 = icmp slt i8 %start.2, %high817 call void @use(i1 %t.2)818 %start.3 = mul nsw i8 %start, 3819 %t.3 = icmp slt i8 %start.3, %high820 call void @use(i1 %t.3)821 %start.4 = mul nsw i8 %start, 4822 %c.3 = icmp slt i8 %start.4, %high823 call void @use(i1 %c.3)824 ret void825 826else:827 %c.4 = icmp slt i8 %start, %high828 call void @use(i1 %c.4)829 %else.start.1 = mul nsw i8 %start, 1830 %c.5 = icmp slt i8 %else.start.1, %high831 call void @use(i1 %c.5)832 %else.start.2 = mul nsw i8 %start, 2833 %c.6 = icmp slt i8 %else.start.2, %high834 call void @use(i1 %c.6)835 %else.start.3 = mul nsw i8 %start, 3836 %c.7 = icmp slt i8 %else.start.3, %high837 call void @use(i1 %c.7)838 %else.start.4 = mul nsw i8 %start, 4839 %c.8 = icmp slt i8 %else.start.4, %high840 call void @use(i1 %c.8)841 ret void842}843 844define void @slt_mul_nsw_both_var_non_negative_2(i8 %start, i8 %scale, i8 %high) {845; CHECK-LABEL: @slt_mul_nsw_both_var_non_negative_2(846; CHECK-NEXT: entry:847; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], [[SCALE:%.*]]848; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]]849; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0850; CHECK-NEXT: [[C3:%.*]] = icmp sgt i8 [[SCALE]], 0851; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])852; CHECK-NEXT: [[C4:%.*]] = icmp sle i8 [[SCALE]], 3853; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])854; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]855; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]856; CHECK: then:857; CHECK-NEXT: ret void858; CHECK: else:859; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]]860; CHECK-NEXT: call void @use(i1 [[C_4]])861; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1862; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]863; CHECK-NEXT: call void @use(i1 [[C_5]])864; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2865; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]866; CHECK-NEXT: call void @use(i1 [[C_6]])867; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3868; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]869; CHECK-NEXT: call void @use(i1 [[C_7]])870; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4871; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]872; CHECK-NEXT: call void @use(i1 [[C_8]])873; CHECK-NEXT: ret void874;875entry:876 %mul.3 = mul nsw i8 %start, %scale877 %c.1 = icmp slt i8 %mul.3, %high878 %c.2 = icmp sgt i8 %start, 0879 %c3 = icmp sgt i8 %scale, 0880 call void @llvm.assume(i1 %c3)881 %c4 = icmp sle i8 %scale, 3882 call void @llvm.assume(i1 %c3)883 %and = and i1 %c.1, %c.2884 br i1 %and, label %then, label %else885 886then:887 ret void888 889else:890 %c.4 = icmp slt i8 %start, %high891 call void @use(i1 %c.4)892 %else.start.1 = mul nsw i8 %start, 1893 %c.5 = icmp slt i8 %else.start.1, %high894 call void @use(i1 %c.5)895 %else.start.2 = mul nsw i8 %start, 2896 %c.6 = icmp slt i8 %else.start.2, %high897 call void @use(i1 %c.6)898 %else.start.3 = mul nsw i8 %start, 3899 %c.7 = icmp slt i8 %else.start.3, %high900 call void @use(i1 %c.7)901 %else.start.4 = mul nsw i8 %start, 4902 %c.8 = icmp slt i8 %else.start.4, %high903 call void @use(i1 %c.8)904 ret void905}906 907define void @ult_mul_nsw_3_known_positive_1(i8 %start, i8 %high) {908; CHECK-LABEL: @ult_mul_nsw_3_known_positive_1(909; CHECK-NEXT: entry:910; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3911; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[MUL_3]], [[HIGH:%.*]]912; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[START]], 0913; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]914; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]915; CHECK: then:916; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]917; CHECK-NEXT: call void @use(i1 [[T_0]])918; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1919; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]920; CHECK-NEXT: call void @use(i1 [[T_1]])921; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2922; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]923; CHECK-NEXT: call void @use(i1 [[T_2]])924; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3925; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]]926; CHECK-NEXT: call void @use(i1 [[T_3]])927; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4928; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]929; CHECK-NEXT: call void @use(i1 [[C_3]])930; CHECK-NEXT: ret void931; CHECK: else:932; CHECK-NEXT: ret void933;934entry:935 %mul.3 = mul nsw i8 %start, 3936 %c.1 = icmp ult i8 %mul.3, %high937 %c.2 = icmp ugt i8 %start, 0938 %and = and i1 %c.1, %c.2939 br i1 %and, label %then, label %else940 941then:942 %t.0 = icmp ult i8 %start, %high943 call void @use(i1 %t.0)944 %start.1 = mul nsw i8 %start, 1945 %t.1 = icmp ult i8 %start.1, %high946 call void @use(i1 %t.1)947 %start.2 = mul nsw i8 %start, 2948 %t.2 = icmp ult i8 %start.2, %high949 call void @use(i1 %t.2)950 %start.3 = mul nsw i8 %start, 3951 %t.3 = icmp ult i8 %start.3, %high952 call void @use(i1 %t.3)953 %start.4 = mul nsw i8 %start, 4954 %c.3 = icmp slt i8 %start.4, %high955 call void @use(i1 %c.3)956 ret void957 958else:959 ret void960}961 962define void @ult_mul_nsw_3_known_positive_2(i8 %start, i8 %high) {963; CHECK-LABEL: @ult_mul_nsw_3_known_positive_2(964; CHECK-NEXT: entry:965; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3966; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[MUL_3]], [[HIGH:%.*]]967; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[START]], 0968; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]969; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]970; CHECK: then:971; CHECK-NEXT: ret void972; CHECK: else:973; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]]974; CHECK-NEXT: call void @use(i1 [[C_4]])975; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1976; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]]977; CHECK-NEXT: call void @use(i1 [[C_5]])978; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2979; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]]980; CHECK-NEXT: call void @use(i1 [[C_6]])981; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3982; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]]983; CHECK-NEXT: call void @use(i1 [[C_7]])984; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4985; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]]986; CHECK-NEXT: call void @use(i1 [[C_8]])987; CHECK-NEXT: ret void988;989entry:990 %mul.3 = mul nsw i8 %start, 3991 %c.1 = icmp ult i8 %mul.3, %high992 %c.2 = icmp ugt i8 %start, 0993 %and = and i1 %c.1, %c.2994 br i1 %and, label %then, label %else995 996then:997 ret void998 999else:1000 %c.4 = icmp slt i8 %start, %high1001 call void @use(i1 %c.4)1002 %else.start.1 = mul nsw i8 %start, 11003 %c.5 = icmp slt i8 %else.start.1, %high1004 call void @use(i1 %c.5)1005 %else.start.2 = mul nsw i8 %start, 21006 %c.6 = icmp slt i8 %else.start.2, %high1007 call void @use(i1 %c.6)1008 %else.start.3 = mul nsw i8 %start, 31009 %c.7 = icmp slt i8 %else.start.3, %high1010 call void @use(i1 %c.7)1011 %else.start.4 = mul nsw i8 %start, 41012 %c.8 = icmp slt i8 %else.start.4, %high1013 call void @use(i1 %c.8)1014 ret void1015}1016