188c618ccSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 288c618ccSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 388c618ccSFlorian Hahn 488c618ccSFlorian Hahndeclare void @use(i1) 588c618ccSFlorian Hahndeclare void @llvm.assume(i1) 688c618ccSFlorian Hahn 7af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_known_positive_1(i8 %start, i8 %high) { 8af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_known_positive_1( 988c618ccSFlorian Hahn; CHECK-NEXT: entry: 1088c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 1188c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 1288c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 1388c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 1488c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 1588c618ccSFlorian Hahn; CHECK: then: 16*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1788c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 18*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1988c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 20*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 2188c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 22*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 2388c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 2488c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 2588c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 2688c618ccSFlorian Hahn; CHECK-NEXT: ret void 2788c618ccSFlorian Hahn; CHECK: else: 2888c618ccSFlorian Hahn; CHECK-NEXT: ret void 2988c618ccSFlorian Hahn; 3088c618ccSFlorian Hahnentry: 3188c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, 3 3288c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 3388c618ccSFlorian Hahn %c.2 = icmp sgt i8 %start, 0 3488c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 3588c618ccSFlorian Hahn br i1 %and, label %then, label %else 3688c618ccSFlorian Hahn 3788c618ccSFlorian Hahnthen: 3888c618ccSFlorian Hahn %t.0 = icmp slt i8 %start, %high 3988c618ccSFlorian Hahn call void @use(i1 %t.0) 4088c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 4188c618ccSFlorian Hahn %t.1 = icmp slt i8 %start.1, %high 4288c618ccSFlorian Hahn call void @use(i1 %t.1) 4388c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 4488c618ccSFlorian Hahn %t.2 = icmp slt i8 %start.2, %high 4588c618ccSFlorian Hahn call void @use(i1 %t.2) 4688c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 4788c618ccSFlorian Hahn %t.3 = icmp slt i8 %start.3, %high 4888c618ccSFlorian Hahn call void @use(i1 %t.3) 4988c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 5088c618ccSFlorian Hahn %c.3 = icmp slt i8 %start.4, %high 5188c618ccSFlorian Hahn call void @use(i1 %c.3) 5288c618ccSFlorian Hahn ret void 5388c618ccSFlorian Hahn 5488c618ccSFlorian Hahnelse: 55af6d1385SFlorian Hahn ret void 56af6d1385SFlorian Hahn} 57af6d1385SFlorian Hahn 58af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_known_positive_2(i8 %start, i8 %high) { 59af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_known_positive_2( 60af6d1385SFlorian Hahn; CHECK-NEXT: entry: 61af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 62af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 63af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 64af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 65af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 66af6d1385SFlorian Hahn; CHECK: then: 67af6d1385SFlorian Hahn; CHECK-NEXT: ret void 68af6d1385SFlorian Hahn; CHECK: else: 69af6d1385SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]] 70af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 71af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 72af6d1385SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 73af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 74af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 75af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 76af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 77af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 78af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 79af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 80af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 81af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 82af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 83af6d1385SFlorian Hahn; CHECK-NEXT: ret void 84af6d1385SFlorian Hahn; 85af6d1385SFlorian Hahnentry: 86af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, 3 87af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 88af6d1385SFlorian Hahn %c.2 = icmp sgt i8 %start, 0 89af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 90af6d1385SFlorian Hahn br i1 %and, label %then, label %else 91af6d1385SFlorian Hahn 92af6d1385SFlorian Hahnthen: 93af6d1385SFlorian Hahn ret void 94af6d1385SFlorian Hahn 95af6d1385SFlorian Hahnelse: 9688c618ccSFlorian Hahn %c.4 = icmp slt i8 %start, %high 9788c618ccSFlorian Hahn call void @use(i1 %c.4) 9888c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 9988c618ccSFlorian Hahn %c.5 = icmp slt i8 %else.start.1, %high 10088c618ccSFlorian Hahn call void @use(i1 %c.5) 10188c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 10288c618ccSFlorian Hahn %c.6 = icmp slt i8 %else.start.2, %high 10388c618ccSFlorian Hahn call void @use(i1 %c.6) 10488c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 10588c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.3, %high 10688c618ccSFlorian Hahn call void @use(i1 %c.7) 10788c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 10888c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.4, %high 10988c618ccSFlorian Hahn call void @use(i1 %c.8) 11088c618ccSFlorian Hahn ret void 11188c618ccSFlorian Hahn} 11288c618ccSFlorian Hahn 113af6d1385SFlorian Hahndefine void @slt_mul_no_nsw_3_known_positive_1(i8 %start, i8 %high) { 114af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_no_nsw_3_known_positive_1( 11588c618ccSFlorian Hahn; CHECK-NEXT: entry: 11688c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3 11788c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 11888c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 11988c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 12088c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 12188c618ccSFlorian Hahn; CHECK: then: 12288c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]] 12388c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 12488c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 12588c618ccSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]] 12688c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 12788c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 12888c618ccSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]] 12988c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 13088c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 13188c618ccSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START_3]], [[HIGH]] 13288c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 13388c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 13488c618ccSFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 13588c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 13688c618ccSFlorian Hahn; CHECK-NEXT: ret void 13788c618ccSFlorian Hahn; CHECK: else: 13888c618ccSFlorian Hahn; CHECK-NEXT: ret void 13988c618ccSFlorian Hahn; 14088c618ccSFlorian Hahnentry: 14188c618ccSFlorian Hahn %mul.3 = mul i8 %start, 3 14288c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 14388c618ccSFlorian Hahn %c.2 = icmp sgt i8 %start, 0 14488c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 14588c618ccSFlorian Hahn br i1 %and, label %then, label %else 14688c618ccSFlorian Hahn 14788c618ccSFlorian Hahnthen: 14888c618ccSFlorian Hahn %c.3 = icmp slt i8 %start, %high 14988c618ccSFlorian Hahn call void @use(i1 %c.3) 15088c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 15188c618ccSFlorian Hahn %c.4 = icmp slt i8 %start.1, %high 15288c618ccSFlorian Hahn call void @use(i1 %c.4) 15388c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 15488c618ccSFlorian Hahn %c.5 = icmp slt i8 %start.2, %high 15588c618ccSFlorian Hahn call void @use(i1 %c.5) 15688c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 15788c618ccSFlorian Hahn %c.6 = icmp slt i8 %start.3, %high 15888c618ccSFlorian Hahn call void @use(i1 %c.6) 15988c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 16088c618ccSFlorian Hahn %c.7 = icmp slt i8 %start.4, %high 16188c618ccSFlorian Hahn call void @use(i1 %c.7) 16288c618ccSFlorian Hahn ret void 16388c618ccSFlorian Hahn 16488c618ccSFlorian Hahnelse: 165af6d1385SFlorian Hahn ret void 166af6d1385SFlorian Hahn} 167af6d1385SFlorian Hahn 168af6d1385SFlorian Hahndefine void @slt_mul_no_nsw_3_known_positive_2(i8 %start, i8 %high) { 169af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_no_nsw_3_known_positive_2( 170af6d1385SFlorian Hahn; CHECK-NEXT: entry: 171af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3 172af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 173af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 174af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 175af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 176af6d1385SFlorian Hahn; CHECK: then: 177af6d1385SFlorian Hahn; CHECK-NEXT: ret void 178af6d1385SFlorian Hahn; CHECK: else: 179af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[START]], [[HIGH]] 180af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 181af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 182af6d1385SFlorian Hahn; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 183af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_9]]) 184af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 185af6d1385SFlorian Hahn; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 186af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_10]]) 187af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 188af6d1385SFlorian Hahn; CHECK-NEXT: [[C_11:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 189af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_11]]) 190af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 191af6d1385SFlorian Hahn; CHECK-NEXT: [[C_12:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 192af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_12]]) 193af6d1385SFlorian Hahn; CHECK-NEXT: ret void 194af6d1385SFlorian Hahn; 195af6d1385SFlorian Hahnentry: 196af6d1385SFlorian Hahn %mul.3 = mul i8 %start, 3 197af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 198af6d1385SFlorian Hahn %c.2 = icmp sgt i8 %start, 0 199af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 200af6d1385SFlorian Hahn br i1 %and, label %then, label %else 201af6d1385SFlorian Hahn 202af6d1385SFlorian Hahnthen: 203af6d1385SFlorian Hahn ret void 204af6d1385SFlorian Hahn 205af6d1385SFlorian Hahnelse: 20688c618ccSFlorian Hahn %c.8 = icmp slt i8 %start, %high 20788c618ccSFlorian Hahn call void @use(i1 %c.8) 20888c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 20988c618ccSFlorian Hahn %c.9 = icmp slt i8 %else.start.1, %high 21088c618ccSFlorian Hahn call void @use(i1 %c.9) 21188c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 21288c618ccSFlorian Hahn %c.10 = icmp slt i8 %else.start.2, %high 21388c618ccSFlorian Hahn call void @use(i1 %c.10) 21488c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 21588c618ccSFlorian Hahn %c.11 = icmp slt i8 %else.start.3, %high 21688c618ccSFlorian Hahn call void @use(i1 %c.11) 21788c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 21888c618ccSFlorian Hahn %c.12 = icmp slt i8 %else.start.4, %high 21988c618ccSFlorian Hahn call void @use(i1 %c.12) 22088c618ccSFlorian Hahn ret void 22188c618ccSFlorian Hahn} 22288c618ccSFlorian Hahn 223af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_not_known_positive_1(i8 %start, i8 %high) { 224af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_not_known_positive_1( 22588c618ccSFlorian Hahn; CHECK-NEXT: entry: 22688c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3 22788c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 22888c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]] 22988c618ccSFlorian Hahn; CHECK: then: 23088c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]] 23188c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 23288c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 23388c618ccSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]] 23488c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 23588c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 23688c618ccSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]] 23788c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 23888c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 23988c618ccSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START_3]], [[HIGH]] 24088c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 24188c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 24288c618ccSFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 24388c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 24488c618ccSFlorian Hahn; CHECK-NEXT: ret void 24588c618ccSFlorian Hahn; CHECK: else: 24688c618ccSFlorian Hahn; CHECK-NEXT: ret void 24788c618ccSFlorian Hahn; 24888c618ccSFlorian Hahnentry: 24988c618ccSFlorian Hahn %mul.3 = mul i8 %start, 3 25088c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 25188c618ccSFlorian Hahn br i1 %c.1, label %then, label %else 25288c618ccSFlorian Hahn 25388c618ccSFlorian Hahnthen: 25488c618ccSFlorian Hahn %c.3 = icmp slt i8 %start, %high 25588c618ccSFlorian Hahn call void @use(i1 %c.3) 25688c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 25788c618ccSFlorian Hahn %c.4 = icmp slt i8 %start.1, %high 25888c618ccSFlorian Hahn call void @use(i1 %c.4) 25988c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 26088c618ccSFlorian Hahn %c.5 = icmp slt i8 %start.2, %high 26188c618ccSFlorian Hahn call void @use(i1 %c.5) 26288c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 26388c618ccSFlorian Hahn %c.6 = icmp slt i8 %start.3, %high 26488c618ccSFlorian Hahn call void @use(i1 %c.6) 26588c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 26688c618ccSFlorian Hahn %c.7 = icmp slt i8 %start.4, %high 26788c618ccSFlorian Hahn call void @use(i1 %c.7) 26888c618ccSFlorian Hahn ret void 26988c618ccSFlorian Hahn 27088c618ccSFlorian Hahnelse: 271af6d1385SFlorian Hahn ret void 272af6d1385SFlorian Hahn} 273af6d1385SFlorian Hahn 274af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_not_known_positive_2(i8 %start, i8 %high) { 275af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_not_known_positive_2( 276af6d1385SFlorian Hahn; CHECK-NEXT: entry: 277af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul i8 [[START:%.*]], 3 278af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 279af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]] 280af6d1385SFlorian Hahn; CHECK: then: 281af6d1385SFlorian Hahn; CHECK-NEXT: ret void 282af6d1385SFlorian Hahn; CHECK: else: 283af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[START]], [[HIGH]] 284af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 285af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 286af6d1385SFlorian Hahn; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 287af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_9]]) 288af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 289af6d1385SFlorian Hahn; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 290af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_10]]) 291af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 292af6d1385SFlorian Hahn; CHECK-NEXT: [[C_11:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 293af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_11]]) 294af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 295af6d1385SFlorian Hahn; CHECK-NEXT: [[C_12:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 296af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_12]]) 297af6d1385SFlorian Hahn; CHECK-NEXT: ret void 298af6d1385SFlorian Hahn; 299af6d1385SFlorian Hahnentry: 300af6d1385SFlorian Hahn %mul.3 = mul i8 %start, 3 301af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 302af6d1385SFlorian Hahn br i1 %c.1, label %then, label %else 303af6d1385SFlorian Hahn 304af6d1385SFlorian Hahnthen: 305af6d1385SFlorian Hahn ret void 306af6d1385SFlorian Hahn 307af6d1385SFlorian Hahnelse: 30888c618ccSFlorian Hahn %c.8 = icmp slt i8 %start, %high 30988c618ccSFlorian Hahn call void @use(i1 %c.8) 31088c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 31188c618ccSFlorian Hahn %c.9 = icmp slt i8 %else.start.1, %high 31288c618ccSFlorian Hahn call void @use(i1 %c.9) 31388c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 31488c618ccSFlorian Hahn %c.10 = icmp slt i8 %else.start.2, %high 31588c618ccSFlorian Hahn call void @use(i1 %c.10) 31688c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 31788c618ccSFlorian Hahn %c.11 = icmp slt i8 %else.start.3, %high 31888c618ccSFlorian Hahn call void @use(i1 %c.11) 31988c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 32088c618ccSFlorian Hahn %c.12 = icmp slt i8 %else.start.4, %high 32188c618ccSFlorian Hahn call void @use(i1 %c.12) 32288c618ccSFlorian Hahn ret void 32388c618ccSFlorian Hahn} 32488c618ccSFlorian Hahn 325af6d1385SFlorian Hahndefine void @slt_mul_nsw_neg_3_known_negative_1(i8 %start, i8 %high) { 326af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_neg_3_known_negative_1( 32788c618ccSFlorian Hahn; CHECK-NEXT: entry: 32888c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3 32988c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 33088c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0 33188c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 33288c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 33388c618ccSFlorian Hahn; CHECK: then: 334*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 33588c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], -1 336*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 33788c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], -2 338*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 33988c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], -3 340*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 34188c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], -4 34288c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 34388c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 34488c618ccSFlorian Hahn; CHECK-NEXT: ret void 34588c618ccSFlorian Hahn; CHECK: else: 34688c618ccSFlorian Hahn; CHECK-NEXT: ret void 34788c618ccSFlorian Hahn; 34888c618ccSFlorian Hahnentry: 34988c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, -3 35088c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 35188c618ccSFlorian Hahn %c.2 = icmp slt i8 %start, 0 35288c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 35388c618ccSFlorian Hahn br i1 %and, label %then, label %else 35488c618ccSFlorian Hahn 35588c618ccSFlorian Hahnthen: 35688c618ccSFlorian Hahn %t.0 = icmp slt i8 %start, %high 35788c618ccSFlorian Hahn call void @use(i1 %t.0) 35888c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, -1 35988c618ccSFlorian Hahn %t.1 = icmp slt i8 %start.1, %high 36088c618ccSFlorian Hahn call void @use(i1 %t.1) 36188c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, -2 36288c618ccSFlorian Hahn %t.2 = icmp slt i8 %start.2, %high 36388c618ccSFlorian Hahn call void @use(i1 %t.2) 36488c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, -3 36588c618ccSFlorian Hahn %t.3 = icmp slt i8 %start.3, %high 36688c618ccSFlorian Hahn call void @use(i1 %t.3) 36788c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, -4 36888c618ccSFlorian Hahn %c.3 = icmp slt i8 %start.4, %high 36988c618ccSFlorian Hahn call void @use(i1 %c.3) 37088c618ccSFlorian Hahn ret void 37188c618ccSFlorian Hahn 37288c618ccSFlorian Hahnelse: 373af6d1385SFlorian Hahn ret void 374af6d1385SFlorian Hahn} 375af6d1385SFlorian Hahn 376af6d1385SFlorian Hahndefine void @slt_mul_nsw_neg_3_known_negative_2(i8 %start, i8 %high) { 377af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_neg_3_known_negative_2( 378af6d1385SFlorian Hahn; CHECK-NEXT: entry: 379af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3 380af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 381af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0 382af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 383af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 384af6d1385SFlorian Hahn; CHECK: then: 385af6d1385SFlorian Hahn; CHECK-NEXT: ret void 386af6d1385SFlorian Hahn; CHECK: else: 387af6d1385SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]] 388af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 389af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], -1 390af6d1385SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 391af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 392af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], -2 393af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 394af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 395af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], -3 396af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 397af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 398af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], -4 399af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 400af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 401af6d1385SFlorian Hahn; CHECK-NEXT: ret void 402af6d1385SFlorian Hahn; 403af6d1385SFlorian Hahnentry: 404af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, -3 405af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 406af6d1385SFlorian Hahn %c.2 = icmp slt i8 %start, 0 407af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 408af6d1385SFlorian Hahn br i1 %and, label %then, label %else 409af6d1385SFlorian Hahn 410af6d1385SFlorian Hahnthen: 411af6d1385SFlorian Hahn ret void 412af6d1385SFlorian Hahn 413af6d1385SFlorian Hahnelse: 41488c618ccSFlorian Hahn %c.4 = icmp slt i8 %start, %high 41588c618ccSFlorian Hahn call void @use(i1 %c.4) 41688c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, -1 41788c618ccSFlorian Hahn %c.5 = icmp slt i8 %else.start.1, %high 41888c618ccSFlorian Hahn call void @use(i1 %c.5) 41988c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, -2 42088c618ccSFlorian Hahn %c.6 = icmp slt i8 %else.start.2, %high 42188c618ccSFlorian Hahn call void @use(i1 %c.6) 42288c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, -3 42388c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.3, %high 42488c618ccSFlorian Hahn call void @use(i1 %c.7) 42588c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, -4 42688c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.4, %high 42788c618ccSFlorian Hahn call void @use(i1 %c.8) 42888c618ccSFlorian Hahn ret void 42988c618ccSFlorian Hahn} 43088c618ccSFlorian Hahn 431af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_known_negative_1(i8 %start, i8 %high) { 432af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_known_negative_1( 43388c618ccSFlorian Hahn; CHECK-NEXT: entry: 43488c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 43588c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 43688c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0 43788c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 43888c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 43988c618ccSFlorian Hahn; CHECK: then: 44088c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]] 44188c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 44288c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 44388c618ccSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]] 44488c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 44588c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 44688c618ccSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]] 44788c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 44888c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 449*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 45088c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 451*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 45288c618ccSFlorian Hahn; CHECK-NEXT: ret void 45388c618ccSFlorian Hahn; CHECK: else: 45488c618ccSFlorian Hahn; CHECK-NEXT: ret void 45588c618ccSFlorian Hahn; 45688c618ccSFlorian Hahnentry: 45788c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, 3 45888c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 45988c618ccSFlorian Hahn %c.2 = icmp slt i8 %start, 0 46088c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 46188c618ccSFlorian Hahn br i1 %and, label %then, label %else 46288c618ccSFlorian Hahn 46388c618ccSFlorian Hahnthen: 46488c618ccSFlorian Hahn %c.3 = icmp slt i8 %start, %high 46588c618ccSFlorian Hahn call void @use(i1 %c.3) 46688c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 46788c618ccSFlorian Hahn %c.4 = icmp slt i8 %start.1, %high 46888c618ccSFlorian Hahn call void @use(i1 %c.4) 46988c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 47088c618ccSFlorian Hahn %c.5 = icmp slt i8 %start.2, %high 47188c618ccSFlorian Hahn call void @use(i1 %c.5) 47288c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 47388c618ccSFlorian Hahn %t.0 = icmp slt i8 %start.3, %high 47488c618ccSFlorian Hahn call void @use(i1 %t.0) 47588c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 47688c618ccSFlorian Hahn %t.1 = icmp slt i8 %start.4, %high 47788c618ccSFlorian Hahn call void @use(i1 %t.1) 47888c618ccSFlorian Hahn ret void 47988c618ccSFlorian Hahn 48088c618ccSFlorian Hahnelse: 481af6d1385SFlorian Hahn ret void 482af6d1385SFlorian Hahn} 483af6d1385SFlorian Hahn 484af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_known_negative_2(i8 %start, i8 %high) { 485af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_known_negative_2( 486af6d1385SFlorian Hahn; CHECK-NEXT: entry: 487af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 488af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 489af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], 0 490af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 491af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 492af6d1385SFlorian Hahn; CHECK: then: 493af6d1385SFlorian Hahn; CHECK-NEXT: ret void 494af6d1385SFlorian Hahn; CHECK: else: 495af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START]], [[HIGH]] 496af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 497af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 498af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 499af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 500af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 501af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 502af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 503af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 504af6d1385SFlorian Hahn; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 505af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_9]]) 506af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 507af6d1385SFlorian Hahn; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 508af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_10]]) 509af6d1385SFlorian Hahn; CHECK-NEXT: ret void 510af6d1385SFlorian Hahn; 511af6d1385SFlorian Hahnentry: 512af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, 3 513af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 514af6d1385SFlorian Hahn %c.2 = icmp slt i8 %start, 0 515af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 516af6d1385SFlorian Hahn br i1 %and, label %then, label %else 517af6d1385SFlorian Hahn 518af6d1385SFlorian Hahnthen: 519af6d1385SFlorian Hahn ret void 520af6d1385SFlorian Hahn 521af6d1385SFlorian Hahnelse: 52288c618ccSFlorian Hahn %c.6 = icmp slt i8 %start, %high 52388c618ccSFlorian Hahn call void @use(i1 %c.6) 52488c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 52588c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.1, %high 52688c618ccSFlorian Hahn call void @use(i1 %c.7) 52788c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 52888c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.2, %high 52988c618ccSFlorian Hahn call void @use(i1 %c.8) 53088c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 53188c618ccSFlorian Hahn %c.9 = icmp slt i8 %else.start.3, %high 53288c618ccSFlorian Hahn call void @use(i1 %c.9) 53388c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 53488c618ccSFlorian Hahn %c.10 = icmp slt i8 %else.start.4, %high 53588c618ccSFlorian Hahn call void @use(i1 %c.10) 53688c618ccSFlorian Hahn ret void 53788c618ccSFlorian Hahn} 53888c618ccSFlorian Hahn 539af6d1385SFlorian Hahndefine void @slt_mul_nsw_neg_3_known_positive_1(i8 %start, i8 %high) { 540af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_neg_3_known_positive_1( 54188c618ccSFlorian Hahn; CHECK-NEXT: entry: 54288c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3 54388c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 54488c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 54588c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 54688c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 54788c618ccSFlorian Hahn; CHECK: then: 54888c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START]], [[HIGH]] 54988c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 55088c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], -1 55188c618ccSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_1]], [[HIGH]] 55288c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 55388c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], -2 55488c618ccSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[START_2]], [[HIGH]] 55588c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 55688c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], -3 557*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 55888c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], -4 559*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 56088c618ccSFlorian Hahn; CHECK-NEXT: ret void 56188c618ccSFlorian Hahn; CHECK: else: 56288c618ccSFlorian Hahn; CHECK-NEXT: ret void 56388c618ccSFlorian Hahn; 56488c618ccSFlorian Hahnentry: 56588c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, -3 56688c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 56788c618ccSFlorian Hahn %c.2 = icmp sgt i8 %start, 0 56888c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 56988c618ccSFlorian Hahn br i1 %and, label %then, label %else 57088c618ccSFlorian Hahn 57188c618ccSFlorian Hahnthen: 57288c618ccSFlorian Hahn %c.3 = icmp slt i8 %start, %high 57388c618ccSFlorian Hahn call void @use(i1 %c.3) 57488c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, -1 57588c618ccSFlorian Hahn %c.4 = icmp slt i8 %start.1, %high 57688c618ccSFlorian Hahn call void @use(i1 %c.4) 57788c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, -2 57888c618ccSFlorian Hahn %c.5 = icmp slt i8 %start.2, %high 57988c618ccSFlorian Hahn call void @use(i1 %c.5) 58088c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, -3 58188c618ccSFlorian Hahn %t.0 = icmp slt i8 %start.3, %high 58288c618ccSFlorian Hahn call void @use(i1 %t.0) 58388c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, -4 58488c618ccSFlorian Hahn %t.1 = icmp slt i8 %start.4, %high 58588c618ccSFlorian Hahn call void @use(i1 %t.1) 58688c618ccSFlorian Hahn ret void 58788c618ccSFlorian Hahn 58888c618ccSFlorian Hahnelse: 589af6d1385SFlorian Hahn ret void 590af6d1385SFlorian Hahn} 591af6d1385SFlorian Hahn 592af6d1385SFlorian Hahndefine void @slt_mul_nsw_neg_3_known_positive_2(i8 %start, i8 %high) { 593af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_neg_3_known_positive_2( 594af6d1385SFlorian Hahn; CHECK-NEXT: entry: 595af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], -3 596af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 597af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 598af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 599af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 600af6d1385SFlorian Hahn; CHECK: then: 601af6d1385SFlorian Hahn; CHECK-NEXT: ret void 602af6d1385SFlorian Hahn; CHECK: else: 603af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[START]], [[HIGH]] 604af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 605af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], -1 606af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 607af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 608af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], -2 609af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 610af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 611af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], -3 612af6d1385SFlorian Hahn; CHECK-NEXT: [[C_9:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 613af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_9]]) 614af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], -4 615af6d1385SFlorian Hahn; CHECK-NEXT: [[C_10:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 616af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_10]]) 617af6d1385SFlorian Hahn; CHECK-NEXT: ret void 618af6d1385SFlorian Hahn; 619af6d1385SFlorian Hahnentry: 620af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, -3 621af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 622af6d1385SFlorian Hahn %c.2 = icmp sgt i8 %start, 0 623af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 624af6d1385SFlorian Hahn br i1 %and, label %then, label %else 625af6d1385SFlorian Hahn 626af6d1385SFlorian Hahnthen: 627af6d1385SFlorian Hahn ret void 628af6d1385SFlorian Hahn 629af6d1385SFlorian Hahnelse: 63088c618ccSFlorian Hahn %c.6 = icmp slt i8 %start, %high 63188c618ccSFlorian Hahn call void @use(i1 %c.6) 63288c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, -1 63388c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.1, %high 63488c618ccSFlorian Hahn call void @use(i1 %c.7) 63588c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, -2 63688c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.2, %high 63788c618ccSFlorian Hahn call void @use(i1 %c.8) 63888c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, -3 63988c618ccSFlorian Hahn %c.9 = icmp slt i8 %else.start.3, %high 64088c618ccSFlorian Hahn call void @use(i1 %c.9) 64188c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, -4 64288c618ccSFlorian Hahn %c.10 = icmp slt i8 %else.start.4, %high 64388c618ccSFlorian Hahn call void @use(i1 %c.10) 64488c618ccSFlorian Hahn ret void 64588c618ccSFlorian Hahn} 64688c618ccSFlorian Hahn 647af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_known_nonnegative_1(i8 %start, i8 %high) { 648af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_known_nonnegative_1( 64988c618ccSFlorian Hahn; CHECK-NEXT: entry: 65088c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 65188c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 65288c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[START]], 0 65388c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 65488c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 65588c618ccSFlorian Hahn; CHECK: then: 656*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 65788c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 658*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 65988c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 660*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 66188c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 662*78bb06b1SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 66388c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 66488c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 66588c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 66688c618ccSFlorian Hahn; CHECK-NEXT: ret void 66788c618ccSFlorian Hahn; CHECK: else: 66888c618ccSFlorian Hahn; CHECK-NEXT: ret void 66988c618ccSFlorian Hahn; 67088c618ccSFlorian Hahnentry: 67188c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, 3 67288c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 67388c618ccSFlorian Hahn %c.2 = icmp sge i8 %start, 0 67488c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 67588c618ccSFlorian Hahn br i1 %and, label %then, label %else 67688c618ccSFlorian Hahn 67788c618ccSFlorian Hahnthen: 67888c618ccSFlorian Hahn %t.0 = icmp slt i8 %start, %high 67988c618ccSFlorian Hahn call void @use(i1 %t.0) 68088c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 68188c618ccSFlorian Hahn %t.1 = icmp slt i8 %start.1, %high 68288c618ccSFlorian Hahn call void @use(i1 %t.1) 68388c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 68488c618ccSFlorian Hahn %t.2 = icmp slt i8 %start.2, %high 68588c618ccSFlorian Hahn call void @use(i1 %t.2) 68688c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 68788c618ccSFlorian Hahn %t.3 = icmp slt i8 %start.3, %high 68888c618ccSFlorian Hahn call void @use(i1 %t.3) 68988c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 69088c618ccSFlorian Hahn %c.3 = icmp slt i8 %start.4, %high 69188c618ccSFlorian Hahn call void @use(i1 %c.3) 69288c618ccSFlorian Hahn ret void 69388c618ccSFlorian Hahn 69488c618ccSFlorian Hahnelse: 695af6d1385SFlorian Hahn ret void 696af6d1385SFlorian Hahn} 697af6d1385SFlorian Hahn 698af6d1385SFlorian Hahndefine void @slt_mul_nsw_3_known_nonnegative_2(i8 %start, i8 %high) { 699af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_3_known_nonnegative_2( 700af6d1385SFlorian Hahn; CHECK-NEXT: entry: 701af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 702af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 703af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[START]], 0 704af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 705af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 706af6d1385SFlorian Hahn; CHECK: then: 707af6d1385SFlorian Hahn; CHECK-NEXT: ret void 708af6d1385SFlorian Hahn; CHECK: else: 709af6d1385SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]] 710af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 711af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 712af6d1385SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 713af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 714af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 715af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 716af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 717af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 718af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 719af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 720af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 721af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 722af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 723af6d1385SFlorian Hahn; CHECK-NEXT: ret void 724af6d1385SFlorian Hahn; 725af6d1385SFlorian Hahnentry: 726af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, 3 727af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 728af6d1385SFlorian Hahn %c.2 = icmp sge i8 %start, 0 729af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 730af6d1385SFlorian Hahn br i1 %and, label %then, label %else 731af6d1385SFlorian Hahn 732af6d1385SFlorian Hahnthen: 733af6d1385SFlorian Hahn ret void 734af6d1385SFlorian Hahn 735af6d1385SFlorian Hahnelse: 73688c618ccSFlorian Hahn %c.4 = icmp slt i8 %start, %high 73788c618ccSFlorian Hahn call void @use(i1 %c.4) 73888c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 73988c618ccSFlorian Hahn %c.5 = icmp slt i8 %else.start.1, %high 74088c618ccSFlorian Hahn call void @use(i1 %c.5) 74188c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 74288c618ccSFlorian Hahn %c.6 = icmp slt i8 %else.start.2, %high 74388c618ccSFlorian Hahn call void @use(i1 %c.6) 74488c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 74588c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.3, %high 74688c618ccSFlorian Hahn call void @use(i1 %c.7) 74788c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 74888c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.4, %high 74988c618ccSFlorian Hahn call void @use(i1 %c.8) 75088c618ccSFlorian Hahn ret void 75188c618ccSFlorian Hahn} 75288c618ccSFlorian Hahn 753af6d1385SFlorian Hahndefine void @slt_mul_nsw_both_var_non_negative_1(i8 %start, i8 %scale, i8 %high) { 754af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_both_var_non_negative_1( 75588c618ccSFlorian Hahn; CHECK-NEXT: entry: 75688c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], [[SCALE:%.*]] 75788c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 75888c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 75988c618ccSFlorian Hahn; CHECK-NEXT: [[C3:%.*]] = icmp sgt i8 [[SCALE]], 0 76088c618ccSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C3]]) 76188c618ccSFlorian Hahn; CHECK-NEXT: [[C4:%.*]] = icmp sle i8 [[SCALE]], 3 76288c618ccSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C3]]) 76388c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 76488c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 76588c618ccSFlorian Hahn; CHECK: then: 76688c618ccSFlorian Hahn; CHECK-NEXT: [[T_0:%.*]] = icmp slt i8 [[START]], [[HIGH]] 76788c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_0]]) 76888c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 76988c618ccSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[START_1]], [[HIGH]] 77088c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 77188c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 77288c618ccSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp slt i8 [[START_2]], [[HIGH]] 77388c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_2]]) 77488c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 77588c618ccSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp slt i8 [[START_3]], [[HIGH]] 77688c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_3]]) 77788c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 77888c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 77988c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 78088c618ccSFlorian Hahn; CHECK-NEXT: ret void 78188c618ccSFlorian Hahn; CHECK: else: 78288c618ccSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]] 78388c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 78488c618ccSFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 78588c618ccSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 78688c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 78788c618ccSFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 78888c618ccSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 78988c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 79088c618ccSFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 79188c618ccSFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 79288c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 79388c618ccSFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 79488c618ccSFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 79588c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 79688c618ccSFlorian Hahn; CHECK-NEXT: ret void 79788c618ccSFlorian Hahn; 79888c618ccSFlorian Hahnentry: 79988c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, %scale 80088c618ccSFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 80188c618ccSFlorian Hahn %c.2 = icmp sgt i8 %start, 0 80288c618ccSFlorian Hahn %c3 = icmp sgt i8 %scale, 0 80388c618ccSFlorian Hahn call void @llvm.assume(i1 %c3) 80488c618ccSFlorian Hahn %c4 = icmp sle i8 %scale, 3 80588c618ccSFlorian Hahn call void @llvm.assume(i1 %c3) 80688c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 80788c618ccSFlorian Hahn br i1 %and, label %then, label %else 80888c618ccSFlorian Hahn 80988c618ccSFlorian Hahnthen: 81088c618ccSFlorian Hahn %t.0 = icmp slt i8 %start, %high 81188c618ccSFlorian Hahn call void @use(i1 %t.0) 81288c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 81388c618ccSFlorian Hahn %t.1 = icmp slt i8 %start.1, %high 81488c618ccSFlorian Hahn call void @use(i1 %t.1) 81588c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 81688c618ccSFlorian Hahn %t.2 = icmp slt i8 %start.2, %high 81788c618ccSFlorian Hahn call void @use(i1 %t.2) 81888c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 81988c618ccSFlorian Hahn %t.3 = icmp slt i8 %start.3, %high 82088c618ccSFlorian Hahn call void @use(i1 %t.3) 82188c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 82288c618ccSFlorian Hahn %c.3 = icmp slt i8 %start.4, %high 82388c618ccSFlorian Hahn call void @use(i1 %c.3) 82488c618ccSFlorian Hahn ret void 82588c618ccSFlorian Hahn 82688c618ccSFlorian Hahnelse: 82788c618ccSFlorian Hahn %c.4 = icmp slt i8 %start, %high 82888c618ccSFlorian Hahn call void @use(i1 %c.4) 82988c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 83088c618ccSFlorian Hahn %c.5 = icmp slt i8 %else.start.1, %high 83188c618ccSFlorian Hahn call void @use(i1 %c.5) 83288c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 83388c618ccSFlorian Hahn %c.6 = icmp slt i8 %else.start.2, %high 83488c618ccSFlorian Hahn call void @use(i1 %c.6) 83588c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 83688c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.3, %high 83788c618ccSFlorian Hahn call void @use(i1 %c.7) 83888c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 83988c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.4, %high 84088c618ccSFlorian Hahn call void @use(i1 %c.8) 84188c618ccSFlorian Hahn ret void 84288c618ccSFlorian Hahn} 84388c618ccSFlorian Hahn 844af6d1385SFlorian Hahndefine void @slt_mul_nsw_both_var_non_negative_2(i8 %start, i8 %scale, i8 %high) { 845af6d1385SFlorian Hahn; CHECK-LABEL: @slt_mul_nsw_both_var_non_negative_2( 846af6d1385SFlorian Hahn; CHECK-NEXT: entry: 847af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], [[SCALE:%.*]] 848af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[MUL_3]], [[HIGH:%.*]] 849af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i8 [[START]], 0 850af6d1385SFlorian Hahn; CHECK-NEXT: [[C3:%.*]] = icmp sgt i8 [[SCALE]], 0 851af6d1385SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C3]]) 852af6d1385SFlorian Hahn; CHECK-NEXT: [[C4:%.*]] = icmp sle i8 [[SCALE]], 3 853af6d1385SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C3]]) 854af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 855af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 856af6d1385SFlorian Hahn; CHECK: then: 857af6d1385SFlorian Hahn; CHECK-NEXT: ret void 858af6d1385SFlorian Hahn; CHECK: else: 859af6d1385SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]] 860af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 861af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 862af6d1385SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 863af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 864af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 865af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 866af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 867af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 868af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 869af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 870af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 871af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 872af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 873af6d1385SFlorian Hahn; CHECK-NEXT: ret void 874af6d1385SFlorian Hahn; 875af6d1385SFlorian Hahnentry: 876af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, %scale 877af6d1385SFlorian Hahn %c.1 = icmp slt i8 %mul.3, %high 878af6d1385SFlorian Hahn %c.2 = icmp sgt i8 %start, 0 879af6d1385SFlorian Hahn %c3 = icmp sgt i8 %scale, 0 880af6d1385SFlorian Hahn call void @llvm.assume(i1 %c3) 881af6d1385SFlorian Hahn %c4 = icmp sle i8 %scale, 3 882af6d1385SFlorian Hahn call void @llvm.assume(i1 %c3) 883af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 884af6d1385SFlorian Hahn br i1 %and, label %then, label %else 885af6d1385SFlorian Hahn 886af6d1385SFlorian Hahnthen: 887af6d1385SFlorian Hahn ret void 888af6d1385SFlorian Hahn 889af6d1385SFlorian Hahnelse: 890af6d1385SFlorian Hahn %c.4 = icmp slt i8 %start, %high 891af6d1385SFlorian Hahn call void @use(i1 %c.4) 892af6d1385SFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 893af6d1385SFlorian Hahn %c.5 = icmp slt i8 %else.start.1, %high 894af6d1385SFlorian Hahn call void @use(i1 %c.5) 895af6d1385SFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 896af6d1385SFlorian Hahn %c.6 = icmp slt i8 %else.start.2, %high 897af6d1385SFlorian Hahn call void @use(i1 %c.6) 898af6d1385SFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 899af6d1385SFlorian Hahn %c.7 = icmp slt i8 %else.start.3, %high 900af6d1385SFlorian Hahn call void @use(i1 %c.7) 901af6d1385SFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 902af6d1385SFlorian Hahn %c.8 = icmp slt i8 %else.start.4, %high 903af6d1385SFlorian Hahn call void @use(i1 %c.8) 904af6d1385SFlorian Hahn ret void 905af6d1385SFlorian Hahn} 906af6d1385SFlorian Hahn 907af6d1385SFlorian Hahndefine void @ult_mul_nsw_3_known_positive_1(i8 %start, i8 %high) { 908af6d1385SFlorian Hahn; CHECK-LABEL: @ult_mul_nsw_3_known_positive_1( 90988c618ccSFlorian Hahn; CHECK-NEXT: entry: 91088c618ccSFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 91188c618ccSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[MUL_3]], [[HIGH:%.*]] 91288c618ccSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[START]], 0 91388c618ccSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 91488c618ccSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 91588c618ccSFlorian Hahn; CHECK: then: 91688c618ccSFlorian Hahn; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]] 91788c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_0]]) 91888c618ccSFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = mul nsw i8 [[START]], 1 91988c618ccSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]] 92088c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 92188c618ccSFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = mul nsw i8 [[START]], 2 92288c618ccSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]] 92388c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_2]]) 92488c618ccSFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = mul nsw i8 [[START]], 3 92588c618ccSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]] 92688c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_3]]) 92788c618ccSFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = mul nsw i8 [[START]], 4 92888c618ccSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 92988c618ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 93088c618ccSFlorian Hahn; CHECK-NEXT: ret void 93188c618ccSFlorian Hahn; CHECK: else: 93288c618ccSFlorian Hahn; CHECK-NEXT: ret void 93388c618ccSFlorian Hahn; 93488c618ccSFlorian Hahnentry: 93588c618ccSFlorian Hahn %mul.3 = mul nsw i8 %start, 3 93688c618ccSFlorian Hahn %c.1 = icmp ult i8 %mul.3, %high 93788c618ccSFlorian Hahn %c.2 = icmp ugt i8 %start, 0 93888c618ccSFlorian Hahn %and = and i1 %c.1, %c.2 93988c618ccSFlorian Hahn br i1 %and, label %then, label %else 94088c618ccSFlorian Hahn 94188c618ccSFlorian Hahnthen: 94288c618ccSFlorian Hahn %t.0 = icmp ult i8 %start, %high 94388c618ccSFlorian Hahn call void @use(i1 %t.0) 94488c618ccSFlorian Hahn %start.1 = mul nsw i8 %start, 1 94588c618ccSFlorian Hahn %t.1 = icmp ult i8 %start.1, %high 94688c618ccSFlorian Hahn call void @use(i1 %t.1) 94788c618ccSFlorian Hahn %start.2 = mul nsw i8 %start, 2 94888c618ccSFlorian Hahn %t.2 = icmp ult i8 %start.2, %high 94988c618ccSFlorian Hahn call void @use(i1 %t.2) 95088c618ccSFlorian Hahn %start.3 = mul nsw i8 %start, 3 95188c618ccSFlorian Hahn %t.3 = icmp ult i8 %start.3, %high 95288c618ccSFlorian Hahn call void @use(i1 %t.3) 95388c618ccSFlorian Hahn %start.4 = mul nsw i8 %start, 4 95488c618ccSFlorian Hahn %c.3 = icmp slt i8 %start.4, %high 95588c618ccSFlorian Hahn call void @use(i1 %c.3) 95688c618ccSFlorian Hahn ret void 95788c618ccSFlorian Hahn 95888c618ccSFlorian Hahnelse: 959af6d1385SFlorian Hahn ret void 960af6d1385SFlorian Hahn} 961af6d1385SFlorian Hahn 962af6d1385SFlorian Hahndefine void @ult_mul_nsw_3_known_positive_2(i8 %start, i8 %high) { 963af6d1385SFlorian Hahn; CHECK-LABEL: @ult_mul_nsw_3_known_positive_2( 964af6d1385SFlorian Hahn; CHECK-NEXT: entry: 965af6d1385SFlorian Hahn; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i8 [[START:%.*]], 3 966af6d1385SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[MUL_3]], [[HIGH:%.*]] 967af6d1385SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[START]], 0 968af6d1385SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 969af6d1385SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 970af6d1385SFlorian Hahn; CHECK: then: 971af6d1385SFlorian Hahn; CHECK-NEXT: ret void 972af6d1385SFlorian Hahn; CHECK: else: 973af6d1385SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START]], [[HIGH]] 974af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 975af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_1:%.*]] = mul nsw i8 [[START]], 1 976af6d1385SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[ELSE_START_1]], [[HIGH]] 977af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 978af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_2:%.*]] = mul nsw i8 [[START]], 2 979af6d1385SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[ELSE_START_2]], [[HIGH]] 980af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 981af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_3:%.*]] = mul nsw i8 [[START]], 3 982af6d1385SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ELSE_START_3]], [[HIGH]] 983af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 984af6d1385SFlorian Hahn; CHECK-NEXT: [[ELSE_START_4:%.*]] = mul nsw i8 [[START]], 4 985af6d1385SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp slt i8 [[ELSE_START_4]], [[HIGH]] 986af6d1385SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 987af6d1385SFlorian Hahn; CHECK-NEXT: ret void 988af6d1385SFlorian Hahn; 989af6d1385SFlorian Hahnentry: 990af6d1385SFlorian Hahn %mul.3 = mul nsw i8 %start, 3 991af6d1385SFlorian Hahn %c.1 = icmp ult i8 %mul.3, %high 992af6d1385SFlorian Hahn %c.2 = icmp ugt i8 %start, 0 993af6d1385SFlorian Hahn %and = and i1 %c.1, %c.2 994af6d1385SFlorian Hahn br i1 %and, label %then, label %else 995af6d1385SFlorian Hahn 996af6d1385SFlorian Hahnthen: 997af6d1385SFlorian Hahn ret void 998af6d1385SFlorian Hahn 999af6d1385SFlorian Hahnelse: 100088c618ccSFlorian Hahn %c.4 = icmp slt i8 %start, %high 100188c618ccSFlorian Hahn call void @use(i1 %c.4) 100288c618ccSFlorian Hahn %else.start.1 = mul nsw i8 %start, 1 100388c618ccSFlorian Hahn %c.5 = icmp slt i8 %else.start.1, %high 100488c618ccSFlorian Hahn call void @use(i1 %c.5) 100588c618ccSFlorian Hahn %else.start.2 = mul nsw i8 %start, 2 100688c618ccSFlorian Hahn %c.6 = icmp slt i8 %else.start.2, %high 100788c618ccSFlorian Hahn call void @use(i1 %c.6) 100888c618ccSFlorian Hahn %else.start.3 = mul nsw i8 %start, 3 100988c618ccSFlorian Hahn %c.7 = icmp slt i8 %else.start.3, %high 101088c618ccSFlorian Hahn call void @use(i1 %c.7) 101188c618ccSFlorian Hahn %else.start.4 = mul nsw i8 %start, 4 101288c618ccSFlorian Hahn %c.8 = icmp slt i8 %else.start.4, %high 101388c618ccSFlorian Hahn call void @use(i1 %c.8) 101488c618ccSFlorian Hahn ret void 101588c618ccSFlorian Hahn} 1016