brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.5 KiB · f2f6a91 Raw
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