@@ -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
2343define 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
57119define 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
75183define 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
107245define 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+
180374declare void @llvm.assume (i1 noundef)
0 commit comments