@@ -190,3 +190,50 @@ define i1 @ip_range_attribute_constant() {
190
190
%c = call i1 @ip_cmp_with_range_attribute (i32 5 )
191
191
ret i1 %c
192
192
}
193
+
194
+ define internal i1 @ip_cmp_attribute_overdefined_callee (i32 range(i32 0 , 10 ) %x ) {
195
+ ; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_callee(
196
+ ; IPSCCP-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 10
197
+ ; IPSCCP-NEXT: ret i1 [[CMP]]
198
+ ;
199
+ ; SCCP-LABEL: @ip_cmp_attribute_overdefined_callee(
200
+ ; SCCP-NEXT: ret i1 true
201
+ ;
202
+ %cmp = icmp ult i32 %x , 10
203
+ ret i1 %cmp
204
+ }
205
+
206
+ define i1 @ip_cmp_attribute_overdefined_caller (i32 %x ) {
207
+ ; CHECK-LABEL: @ip_cmp_attribute_overdefined_caller(
208
+ ; CHECK-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]])
209
+ ; CHECK-NEXT: ret i1 [[RES]]
210
+ ;
211
+ %res = call i1 @ip_cmp_attribute_overdefined_callee (i32 %x )
212
+ ret i1 %res
213
+ }
214
+
215
+ define internal i1 @ip_cmp_attribute_intersect_callee (i32 range(i32 0 , 10 ) %x ) {
216
+ ; IPSCCP-LABEL: @ip_cmp_attribute_intersect_callee(
217
+ ; IPSCCP-NEXT: [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], 10
218
+ ; IPSCCP-NEXT: [[AND:%.*]] = and i1 [[CMP1]], true
219
+ ; IPSCCP-NEXT: ret i1 [[AND]]
220
+ ;
221
+ ; SCCP-LABEL: @ip_cmp_attribute_intersect_callee(
222
+ ; SCCP-NEXT: [[CMP2:%.*]] = icmp uge i32 [[X:%.*]], 5
223
+ ; SCCP-NEXT: [[AND:%.*]] = and i1 true, [[CMP2]]
224
+ ; SCCP-NEXT: ret i1 [[AND]]
225
+ ;
226
+ %cmp1 = icmp ult i32 %x , 10
227
+ %cmp2 = icmp uge i32 %x , 5
228
+ %and = and i1 %cmp1 , %cmp2
229
+ ret i1 %and
230
+ }
231
+
232
+ define i1 @ip_cmp_attribute_intersect_caller (i32 range(i32 5 , 15 ) %x ) {
233
+ ; CHECK-LABEL: @ip_cmp_attribute_intersect_caller(
234
+ ; CHECK-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]])
235
+ ; CHECK-NEXT: ret i1 [[RES]]
236
+ ;
237
+ %res = call i1 @ip_cmp_attribute_intersect_callee (i32 %x )
238
+ ret i1 %res
239
+ }
0 commit comments