@@ -190,3 +190,50 @@ define i1 @ip_range_attribute_constant() {
190190 %c = call i1 @ip_cmp_with_range_attribute (i32 5 )
191191 ret i1 %c
192192}
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