@@ -19,6 +19,26 @@ define i8 @urem_assume(i8 %x, i8 %n) {
19
19
ret i8 %out
20
20
}
21
21
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
+
22
42
; https://alive2.llvm.org/ce/z/MGgtYN
23
43
define i8 @urem_assume_without_nuw (i8 %x , i8 %n ) {
24
44
; CHECK-LABEL: @urem_assume_without_nuw(
@@ -53,6 +73,48 @@ define i8 @urem_assume_eq(i8 %x, i8 %n) {
53
73
ret i8 %out
54
74
}
55
75
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
+
56
118
; Negative test: The assume is false
57
119
define i8 @urem_assume_ne (i8 %x , i8 %n ) {
58
120
; CHECK-LABEL: @urem_assume_ne(
@@ -71,6 +133,52 @@ start:
71
133
ret i8 %out
72
134
}
73
135
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
+
74
182
; Negative test: The add constant is not 1
75
183
define i8 @urem_assume_with_unexpected_const (i8 %x , i8 %n ) {
76
184
; CHECK-LABEL: @urem_assume_with_unexpected_const(
@@ -103,6 +211,36 @@ define i8 @urem_without_assume(i8 %arg, i8 %arg2) {
103
211
ret i8 %out
104
212
}
105
213
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
+
106
244
; https://alive2.llvm.org/ce/z/eHkgRa
107
245
define i8 @urem_with_dominating_condition (i8 %x , i8 %n ) {
108
246
; CHECK-LABEL: @urem_with_dominating_condition(
@@ -177,4 +315,60 @@ define noundef i8 @urem_with_opposite_condition(i8 %x, i8 %n) {
177
315
ret i8 0
178
316
}
179
317
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
+
180
374
declare void @llvm.assume (i1 noundef)
0 commit comments