Skip to content

Commit 0e14a4f

Browse files
committed
handle (X + A) % Op1 for small X, A
1 parent efa2833 commit 0e14a4f

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed

llvm/test/Transforms/InstCombine/urem-via-cmp-select.ll

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ define i8 @urem_assume(i8 %x, i8 %n) {
1919
ret i8 %out
2020
}
2121

22+
; https://alive2.llvm.org/ce/z/NXHJJD
23+
define i8 @urem_assume_a(i8 %x, i8 %n, i8 %a) {
24+
; CHECK-LABEL: @urem_assume_a(
25+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X_FR:%.*]], [[N:%.*]]
26+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
27+
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ult i8 [[A:%.*]], [[N]]
28+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_A]])
29+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[X_FR]], [[A]]
30+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]
31+
; CHECK-NEXT: ret i8 [[OUT]]
32+
;
33+
%cmp = icmp ult i8 %x, %n
34+
tail call void @llvm.assume(i1 %cmp)
35+
%cmp_a = icmp ult i8 %a, %n
36+
tail call void @llvm.assume(i1 %cmp_a)
37+
%add = add nuw i8 %x, %a
38+
%out = urem i8 %add, %n
39+
ret i8 %out
40+
}
41+
2242
; https://alive2.llvm.org/ce/z/MGgtYN
2343
define i8 @urem_assume_without_nuw(i8 %x, i8 %n) {
2444
; CHECK-LABEL: @urem_assume_without_nuw(
@@ -53,6 +73,48 @@ define i8 @urem_assume_eq(i8 %x, i8 %n) {
5373
ret i8 %out
5474
}
5575

76+
; Negative test: The assume is false
77+
define i8 @urem_assume_eq_x(i8 %x, i8 %n, i8 %a) {
78+
; CHECK-LABEL: @urem_assume_eq_x(
79+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[N:%.*]]
80+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
81+
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ult i8 [[A:%.*]], [[N]]
82+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_A]])
83+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 1
84+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]
85+
; CHECK-NEXT: ret i8 [[OUT]]
86+
;
87+
%cmp = icmp eq i8 %x, %n
88+
tail call void @llvm.assume(i1 %cmp)
89+
%cmp_a = icmp ult i8 %a, %n
90+
tail call void @llvm.assume(i1 %cmp_a)
91+
%add = add i8 %x, 1
92+
%out = urem i8 %add, %n
93+
ret i8 %out
94+
}
95+
96+
; Negative test: The assume is false
97+
define i8 @urem_assume_eq_a(i8 %x, i8 %n, i8 %a) {
98+
; CHECK-LABEL: @urem_assume_eq_a(
99+
; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X:%.*]]
100+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X_FR]], [[N:%.*]]
101+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
102+
; CHECK-NEXT: [[CMP_A:%.*]] = icmp eq i8 [[A:%.*]], [[N]]
103+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_A]])
104+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 1
105+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[ADD]], [[N]]
106+
; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP1]], i8 0, i8 [[ADD]]
107+
; CHECK-NEXT: ret i8 [[OUT]]
108+
;
109+
%cmp = icmp ult i8 %x, %n
110+
tail call void @llvm.assume(i1 %cmp)
111+
%cmp_a = icmp eq i8 %a, %n
112+
tail call void @llvm.assume(i1 %cmp_a)
113+
%add = add i8 %x, 1
114+
%out = urem i8 %add, %n
115+
ret i8 %out
116+
}
117+
56118
; Negative test: The assume is false
57119
define i8 @urem_assume_ne(i8 %x, i8 %n) {
58120
; CHECK-LABEL: @urem_assume_ne(
@@ -71,6 +133,52 @@ start:
71133
ret i8 %out
72134
}
73135

136+
; Negative test: The assume is false
137+
define i8 @urem_assume_ne_x(i8 %x, i8 %n, i8 %a) {
138+
; CHECK-LABEL: @urem_assume_ne_x(
139+
; CHECK-NEXT: start:
140+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], [[N:%.*]]
141+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
142+
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ult i8 [[A:%.*]], [[N]]
143+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_A]])
144+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 1
145+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]
146+
; CHECK-NEXT: ret i8 [[OUT]]
147+
;
148+
start:
149+
%cmp = icmp ne i8 %x, %n
150+
tail call void @llvm.assume(i1 %cmp)
151+
%cmp_a = icmp ult i8 %a, %n
152+
tail call void @llvm.assume(i1 %cmp_a)
153+
%add = add i8 %x, 1
154+
%out = urem i8 %add, %n
155+
ret i8 %out
156+
}
157+
158+
; Negative test: The assume is false
159+
define i8 @urem_assume_ne_a(i8 %x, i8 %n, i8 %a) {
160+
; CHECK-LABEL: @urem_assume_ne_a(
161+
; CHECK-NEXT: start:
162+
; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X:%.*]]
163+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X_FR]], [[N:%.*]]
164+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
165+
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ne i8 [[A:%.*]], [[N]]
166+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_A]])
167+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 1
168+
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i8 [[ADD]], [[N]]
169+
; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP0]], i8 0, i8 [[ADD]]
170+
; CHECK-NEXT: ret i8 [[OUT]]
171+
;
172+
start:
173+
%cmp = icmp ult i8 %x, %n
174+
tail call void @llvm.assume(i1 %cmp)
175+
%cmp_a = icmp ne i8 %a, %n
176+
tail call void @llvm.assume(i1 %cmp_a)
177+
%add = add i8 %x, 1
178+
%out = urem i8 %add, %n
179+
ret i8 %out
180+
}
181+
74182
; Negative test: The add constant is not 1
75183
define i8 @urem_assume_with_unexpected_const(i8 %x, i8 %n) {
76184
; CHECK-LABEL: @urem_assume_with_unexpected_const(
@@ -103,6 +211,36 @@ define i8 @urem_without_assume(i8 %arg, i8 %arg2) {
103211
ret i8 %out
104212
}
105213

214+
; Negative test: The add constant is not less than %arg2
215+
define i8 @urem_without_assume_a_var(i8 %arg, i8 %arg2, i8 %a) {
216+
; CHECK-LABEL: @urem_without_assume_a_var(
217+
; CHECK-NEXT: [[X:%.*]] = urem i8 [[ARG:%.*]], [[ARG2:%.*]]
218+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[A:%.*]]
219+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[ARG2]]
220+
; CHECK-NEXT: ret i8 [[OUT]]
221+
;
222+
%x = urem i8 %arg, %arg2
223+
%add = add i8 %x, %a
224+
%out = urem i8 %add, %arg2
225+
ret i8 %out
226+
}
227+
228+
; https://alive2.llvm.org/ce/z/tcdf4d
229+
define i8 @urem_without_assume_a(i8 %arg, i8 %arg2, i8 %a) {
230+
; CHECK-LABEL: @urem_without_assume_a(
231+
; CHECK-NEXT: [[X_REM:%.*]] = urem i8 [[ARG:%.*]], [[ARG2:%.*]]
232+
; CHECK-NEXT: [[A_REM:%.*]] = urem i8 [[A:%.*]], [[ARG2]]
233+
; CHECK-NEXT: [[ADDD:%.*]] = add i8 [[X_REM]], [[A_REM]]
234+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADDD]], [[ARG2]]
235+
; CHECK-NEXT: ret i8 [[OUT]]
236+
;
237+
%x_rem = urem i8 %arg, %arg2
238+
%a_rem = urem i8 %a, %arg2
239+
%add = add i8 %x_rem, %a_rem
240+
%out = urem i8 %add, %arg2
241+
ret i8 %out
242+
}
243+
106244
; https://alive2.llvm.org/ce/z/eHkgRa
107245
define i8 @urem_with_dominating_condition(i8 %x, i8 %n) {
108246
; CHECK-LABEL: @urem_with_dominating_condition(
@@ -177,4 +315,60 @@ define noundef i8 @urem_with_opposite_condition(i8 %x, i8 %n) {
177315
ret i8 0
178316
}
179317

318+
; Negative test
319+
define noundef i8 @urem_with_opposite_condition_x(i8 %x, i8 %n, i8 %a) {
320+
; CHECK-LABEL: @urem_with_opposite_condition_x(
321+
; CHECK-NEXT: [[COND:%.*]] = icmp ult i8 [[X:%.*]], [[N:%.*]]
322+
; CHECK-NEXT: br i1 [[COND]], label [[DOTBB2:%.*]], label [[DOTBB0:%.*]]
323+
; CHECK: .bb0:
324+
; CHECK-NEXT: [[COND2:%.*]] = icmp ult i8 [[A:%.*]], [[N]]
325+
; CHECK-NEXT: br i1 [[COND2]], label [[DOTBB1:%.*]], label [[DOTBB2]]
326+
; CHECK: .bb1:
327+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[A]]
328+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]
329+
; CHECK-NEXT: ret i8 [[OUT]]
330+
; CHECK: .bb2:
331+
; CHECK-NEXT: ret i8 0
332+
;
333+
%cond = icmp ult i8 %x, %n
334+
br i1 %cond, label %.bb2, label %.bb0 ; Revert the condition
335+
.bb0:
336+
%cond2 = icmp ult i8 %a, %n
337+
br i1 %cond2, label %.bb1, label %.bb2
338+
.bb1:
339+
%add = add i8 %x, %a
340+
%out = urem i8 %add, %n
341+
ret i8 %out
342+
.bb2:
343+
ret i8 0
344+
}
345+
346+
; Negative test
347+
define noundef i8 @urem_with_opposite_condition_a(i8 %x, i8 %n, i8 %a) {
348+
; CHECK-LABEL: @urem_with_opposite_condition_a(
349+
; CHECK-NEXT: [[COND:%.*]] = icmp ult i8 [[X:%.*]], [[N:%.*]]
350+
; CHECK-NEXT: br i1 [[COND]], label [[DOTBB0:%.*]], label [[DOTBB2:%.*]]
351+
; CHECK: .bb0:
352+
; CHECK-NEXT: [[COND2:%.*]] = icmp ult i8 [[A:%.*]], [[N]]
353+
; CHECK-NEXT: br i1 [[COND2]], label [[DOTBB2]], label [[DOTBB1:%.*]]
354+
; CHECK: .bb1:
355+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[A]]
356+
; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]
357+
; CHECK-NEXT: ret i8 [[OUT]]
358+
; CHECK: .bb2:
359+
; CHECK-NEXT: ret i8 0
360+
;
361+
%cond = icmp ult i8 %x, %n
362+
br i1 %cond, label %.bb0, label %.bb2
363+
.bb0:
364+
%cond2 = icmp ult i8 %a, %n
365+
br i1 %cond2, label %.bb2, label %.bb1 ; Revert the condition
366+
.bb1:
367+
%add = add i8 %x, %a
368+
%out = urem i8 %add, %n
369+
ret i8 %out
370+
.bb2:
371+
ret i8 0
372+
}
373+
180374
declare void @llvm.assume(i1 noundef)

0 commit comments

Comments
 (0)