xref: /llvm-project/llvm/test/Transforms/SCCP/ip-ranges-binaryops.ll (revision 7d10213317c18e1d24753e5532d2b037db2d2c5c)
1602e1cbcSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
38a36594aSFlorian Hahn
48a36594aSFlorian Hahn; x = [10, 21), y = [100, 201)
58a36594aSFlorian Hahn; x + y = [110, 221)
68a36594aSFlorian Hahndefine internal i1 @f.add(i32 %x, i32 %y) {
7602e1cbcSFlorian Hahn; CHECK-LABEL: @f.add(
872121a20SFlorian Hahn; CHECK-NEXT:    [[A_1:%.*]] = add nuw nsw i32 [[X:%.*]], [[Y:%.*]]
9602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sgt i32 [[A_1]], 219
10602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i32 [[A_1]], 111
11602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[A_1]], 150
12602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp slt i32 [[A_1]], 150
1372121a20SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
1472121a20SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
15602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
16602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
17602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
18602e1cbcSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_5]]
198a36594aSFlorian Hahn;
208a36594aSFlorian Hahn  %a.1 = add i32 %x, %y
218a36594aSFlorian Hahn  %c.1 = icmp sgt i32 %a.1, 220
228a36594aSFlorian Hahn  %c.2 = icmp sgt i32 %a.1, 219
238a36594aSFlorian Hahn  %c.3 = icmp slt i32 %a.1, 110
248a36594aSFlorian Hahn  %c.4 = icmp slt i32 %a.1, 111
258a36594aSFlorian Hahn  %c.5 = icmp eq i32 %a.1, 150
268a36594aSFlorian Hahn  %c.6 = icmp slt i32 %a.1, 150
278a36594aSFlorian Hahn  %res.1 = add i1 %c.1, %c.2
288a36594aSFlorian Hahn  %res.2 = add i1 %res.1, %c.3
298a36594aSFlorian Hahn  %res.3 = add i1 %res.2, %c.4
308a36594aSFlorian Hahn  %res.4 = add i1 %res.3, %c.5
318a36594aSFlorian Hahn  %res.5 = add i1 %res.4, %c.6
328a36594aSFlorian Hahn  ret i1 %res.5
338a36594aSFlorian Hahn}
348a36594aSFlorian Hahn
358a36594aSFlorian Hahndefine i1 @caller.add() {
36602e1cbcSFlorian Hahn; CHECK-LABEL: @caller.add(
37602e1cbcSFlorian Hahn; CHECK-NEXT:    [[CALL_1:%.*]] = tail call i1 @f.add(i32 10, i32 100)
38602e1cbcSFlorian Hahn; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i1 @f.add(i32 20, i32 200)
39602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]]
40602e1cbcSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES]]
418a36594aSFlorian Hahn;
428a36594aSFlorian Hahn  %call.1 = tail call i1 @f.add(i32 10, i32 100)
438a36594aSFlorian Hahn  %call.2 = tail call i1 @f.add(i32 20, i32 200)
448a36594aSFlorian Hahn  %res = and i1 %call.1, %call.2
458a36594aSFlorian Hahn  ret i1 %res
468a36594aSFlorian Hahn}
478a36594aSFlorian Hahn
488a36594aSFlorian Hahn
498a36594aSFlorian Hahn; x = [10, 21), y = [100, 201)
508a36594aSFlorian Hahn; x - y = [-190, -79)
518a36594aSFlorian Hahndefine internal i1 @f.sub(i32 %x, i32 %y) {
52602e1cbcSFlorian Hahn; CHECK-LABEL: @f.sub(
53*7d102133SFlorian Hahn; CHECK-NEXT:    [[A_1:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
54602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sgt i32 [[A_1]], -81
55602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i32 [[A_1]], -189
56602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[A_1]], -150
57602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp slt i32 [[A_1]], -150
5872121a20SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
5972121a20SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
60602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
61602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
62602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
63602e1cbcSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_5]]
648a36594aSFlorian Hahn;
658a36594aSFlorian Hahn  %a.1 = sub i32 %x, %y
668a36594aSFlorian Hahn  %c.1 = icmp sgt i32 %a.1, -80
678a36594aSFlorian Hahn  %c.2 = icmp sgt i32 %a.1, -81
688a36594aSFlorian Hahn  %c.3 = icmp slt i32 %a.1, -190
698a36594aSFlorian Hahn  %c.4 = icmp slt i32 %a.1, -189
708a36594aSFlorian Hahn  %c.5 = icmp eq i32 %a.1, -150
718a36594aSFlorian Hahn  %c.6 = icmp slt i32 %a.1, -150
728a36594aSFlorian Hahn  %res.1 = add i1 %c.1, %c.2
738a36594aSFlorian Hahn  %res.2 = add i1 %res.1, %c.3
748a36594aSFlorian Hahn  %res.3 = add i1 %res.2, %c.4
758a36594aSFlorian Hahn  %res.4 = add i1 %res.3, %c.5
768a36594aSFlorian Hahn  %res.5 = add i1 %res.4, %c.6
778a36594aSFlorian Hahn  ret i1 %res.5
788a36594aSFlorian Hahn}
798a36594aSFlorian Hahn
808a36594aSFlorian Hahndefine i1 @caller.sub() {
81602e1cbcSFlorian Hahn; CHECK-LABEL: @caller.sub(
82602e1cbcSFlorian Hahn; CHECK-NEXT:    [[CALL_1:%.*]] = tail call i1 @f.sub(i32 10, i32 100)
83602e1cbcSFlorian Hahn; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i1 @f.sub(i32 20, i32 200)
84602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]]
85602e1cbcSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES]]
868a36594aSFlorian Hahn;
878a36594aSFlorian Hahn  %call.1 = tail call i1 @f.sub(i32 10, i32 100)
888a36594aSFlorian Hahn  %call.2 = tail call i1 @f.sub(i32 20, i32 200)
898a36594aSFlorian Hahn  %res = and i1 %call.1, %call.2
908a36594aSFlorian Hahn  ret i1 %res
918a36594aSFlorian Hahn}
928a36594aSFlorian Hahn
938a36594aSFlorian Hahn; x = [10, 21), y = [100, 201)
948a36594aSFlorian Hahn; x * y = [1000, 4001)
958a36594aSFlorian Hahndefine internal i1 @f.mul(i32 %x, i32 %y) {
96602e1cbcSFlorian Hahn; CHECK-LABEL: @f.mul(
97*7d102133SFlorian Hahn; CHECK-NEXT:    [[A_1:%.*]] = mul nuw nsw i32 [[X:%.*]], [[Y:%.*]]
98602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sgt i32 [[A_1]], 3999
99602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i32 [[A_1]], 1001
100602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[A_1]], 1500
101602e1cbcSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp slt i32 [[A_1]], 1500
10272121a20SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
10372121a20SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
104602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
105602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
106602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
107602e1cbcSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_5]]
1088a36594aSFlorian Hahn;
1098a36594aSFlorian Hahn  %a.1 = mul i32 %x, %y
1108a36594aSFlorian Hahn  %c.1 = icmp sgt i32 %a.1, 4000
1118a36594aSFlorian Hahn  %c.2 = icmp sgt i32 %a.1, 3999
1128a36594aSFlorian Hahn  %c.3 = icmp slt i32 %a.1, 1000
1138a36594aSFlorian Hahn  %c.4 = icmp slt i32 %a.1, 1001
1148a36594aSFlorian Hahn  %c.5 = icmp eq i32 %a.1, 1500
1158a36594aSFlorian Hahn  %c.6 = icmp slt i32 %a.1, 1500
1168a36594aSFlorian Hahn  %res.1 = add i1 %c.1, %c.2
1178a36594aSFlorian Hahn  %res.2 = add i1 %res.1, %c.3
1188a36594aSFlorian Hahn  %res.3 = add i1 %res.2, %c.4
1198a36594aSFlorian Hahn  %res.4 = add i1 %res.3, %c.5
1208a36594aSFlorian Hahn  %res.5 = add i1 %res.4, %c.6
1218a36594aSFlorian Hahn  ret i1 %res.5
1228a36594aSFlorian Hahn}
1238a36594aSFlorian Hahn
1248a36594aSFlorian Hahndefine i1 @caller.mul() {
125602e1cbcSFlorian Hahn; CHECK-LABEL: @caller.mul(
126602e1cbcSFlorian Hahn; CHECK-NEXT:    [[CALL_1:%.*]] = tail call i1 @f.mul(i32 10, i32 100)
127602e1cbcSFlorian Hahn; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i1 @f.mul(i32 20, i32 200)
128602e1cbcSFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]]
129602e1cbcSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES]]
1308a36594aSFlorian Hahn;
1318a36594aSFlorian Hahn  %call.1 = tail call i1 @f.mul(i32 10, i32 100)
1328a36594aSFlorian Hahn  %call.2 = tail call i1 @f.mul(i32 20, i32 200)
1338a36594aSFlorian Hahn  %res = and i1 %call.1, %call.2
1348a36594aSFlorian Hahn  ret i1 %res
1358a36594aSFlorian Hahn}
136