@@ -100,6 +100,74 @@ define i8 @constant.divisor.v7(i8 %x) {
100
100
ret i8 %rem
101
101
}
102
102
103
+ define i8 @constant.divisor.v6to8 (i8 %x ) {
104
+ ; CHECK-LABEL: @constant.divisor.v6to8(
105
+ ; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
106
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
107
+ ; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 9
108
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
109
+ ; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
110
+ ; CHECK-NEXT: ret i8 [[REM]]
111
+ ;
112
+ %cmp.x.lower = icmp uge i8 %x , 6
113
+ call void @llvm.assume (i1 %cmp.x.lower )
114
+ %cmp.x.upper = icmp ult i8 %x , 9
115
+ call void @llvm.assume (i1 %cmp.x.upper )
116
+ %rem = urem i8 %x , 3
117
+ ret i8 %rem
118
+ }
119
+
120
+ define i8 @constant.divisor.v9to11 (i8 %x ) {
121
+ ; CHECK-LABEL: @constant.divisor.v9to11(
122
+ ; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 9
123
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
124
+ ; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
125
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
126
+ ; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
127
+ ; CHECK-NEXT: ret i8 [[REM]]
128
+ ;
129
+ %cmp.x.lower = icmp uge i8 %x , 9
130
+ call void @llvm.assume (i1 %cmp.x.lower )
131
+ %cmp.x.upper = icmp ult i8 %x , 12
132
+ call void @llvm.assume (i1 %cmp.x.upper )
133
+ %rem = urem i8 %x , 3
134
+ ret i8 %rem
135
+ }
136
+
137
+ define i8 @constant.divisor.v12to14 (i8 %x ) {
138
+ ; CHECK-LABEL: @constant.divisor.v12to14(
139
+ ; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 12
140
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
141
+ ; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 15
142
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
143
+ ; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
144
+ ; CHECK-NEXT: ret i8 [[REM]]
145
+ ;
146
+ %cmp.x.lower = icmp uge i8 %x , 12
147
+ call void @llvm.assume (i1 %cmp.x.lower )
148
+ %cmp.x.upper = icmp ult i8 %x , 15
149
+ call void @llvm.assume (i1 %cmp.x.upper )
150
+ %rem = urem i8 %x , 3
151
+ ret i8 %rem
152
+ }
153
+
154
+ define i8 @constant.divisor.v6to11 (i8 %x ) {
155
+ ; CHECK-LABEL: @constant.divisor.v6to11(
156
+ ; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
157
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
158
+ ; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
159
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
160
+ ; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
161
+ ; CHECK-NEXT: ret i8 [[REM]]
162
+ ;
163
+ %cmp.x.lower = icmp uge i8 %x , 6
164
+ call void @llvm.assume (i1 %cmp.x.lower )
165
+ %cmp.x.upper = icmp ult i8 %x , 12
166
+ call void @llvm.assume (i1 %cmp.x.upper )
167
+ %rem = urem i8 %x , 3
168
+ ret i8 %rem
169
+ }
170
+
103
171
; Both are variable. Bounds are known
104
172
105
173
define i8 @variable.v3 (i8 %x , i8 %y ) {
@@ -226,6 +294,31 @@ define i8 @variable.v7(i8 %x, i8 %y) {
226
294
ret i8 %rem
227
295
}
228
296
297
+ define i8 @variable.v6to8.v3to4 (i8 %x , i8 %y ) {
298
+ ; CHECK-LABEL: @variable.v6to8.v3to4(
299
+ ; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
300
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
301
+ ; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 8
302
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
303
+ ; CHECK-NEXT: [[CMP_Y_LOWER:%.*]] = icmp uge i8 [[Y:%.*]], 3
304
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_Y_LOWER]])
305
+ ; CHECK-NEXT: [[CMP_Y_UPPER:%.*]] = icmp ule i8 [[Y]], 4
306
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_Y_UPPER]])
307
+ ; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]]
308
+ ; CHECK-NEXT: ret i8 [[REM]]
309
+ ;
310
+ %cmp.x.lower = icmp uge i8 %x , 6
311
+ call void @llvm.assume (i1 %cmp.x.lower )
312
+ %cmp.x.upper = icmp ult i8 %x , 8
313
+ call void @llvm.assume (i1 %cmp.x.upper )
314
+ %cmp.y.lower = icmp uge i8 %y , 3
315
+ call void @llvm.assume (i1 %cmp.y.lower )
316
+ %cmp.y.upper = icmp ule i8 %y , 4
317
+ call void @llvm.assume (i1 %cmp.y.upper )
318
+ %rem = urem i8 %x , %y
319
+ ret i8 %rem
320
+ }
321
+
229
322
; Constant divisor
230
323
231
324
define i8 @large.divisor.v0 (i8 %x ) {
0 commit comments