xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/mul-nsw.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
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