Skip to content

Commit 72121a2

Browse files
committed
[SCCP] Use range info to prove AddInst has NSW flag.
This patch updates SCCP to use the value ranges of AddInst operands to try to prove the AddInst does not overflow in the signed sense and adds the NSW flag. The reasoning is done with makeGuaranteedNoWrapRegion (thanks @nikic for point it out!). Follow-ups will include extending this to more OverflowingBinaryOperators. Depends on D142387. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D142390
1 parent 977cddb commit 72121a2

14 files changed

+72
-63
lines changed

llvm/lib/Transforms/Utils/SCCPSolver.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,16 +142,25 @@ static bool refineInstruction(SCCPSolver &Solver,
142142
};
143143
auto RangeA = GetRange(Inst.getOperand(0));
144144
auto RangeB = GetRange(Inst.getOperand(1));
145+
bool Changed = false;
145146
if (!Inst.hasNoUnsignedWrap()) {
146147
auto NUWRange = ConstantRange::makeGuaranteedNoWrapRegion(
147148
Instruction::Add, RangeB, OverflowingBinaryOperator::NoUnsignedWrap);
148149
if (NUWRange.contains(RangeA)) {
149150
Inst.setHasNoUnsignedWrap();
150-
return true;
151+
Changed = true;
152+
}
153+
}
154+
if (!Inst.hasNoSignedWrap()) {
155+
auto NSWRange = ConstantRange::makeGuaranteedNoWrapRegion(
156+
Instruction::Add, RangeA, OverflowingBinaryOperator::NoSignedWrap);
157+
if (NSWRange.contains(RangeB)) {
158+
Inst.setHasNoSignedWrap();
159+
Changed = true;
151160
}
152161
}
153162

154-
return false;
163+
return Changed;
155164
}
156165

157166
/// Try to replace signed instructions with their unsigned equivalent.

llvm/test/Transforms/SCCP/add-nuw-nsw-flags.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ define i8 @range_from_lshr(i8 %a) {
66
; CHECK-NEXT: entry:
77
; CHECK-NEXT: [[A_SHR:%.*]] = lshr i8 [[A:%.*]], 1
88
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A_SHR]], 1
9-
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[A_SHR]], -128
10-
; CHECK-NEXT: [[ADD_3:%.*]] = add i8 [[A_SHR]], -127
11-
; CHECK-NEXT: [[ADD_4:%.*]] = add i8 [[A_SHR]], -1
9+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A_SHR]], -128
10+
; CHECK-NEXT: [[ADD_3:%.*]] = add nsw i8 [[A_SHR]], -127
11+
; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i8 [[A_SHR]], -1
1212
; CHECK-NEXT: [[RES_1:%.*]] = xor i8 [[ADD_1]], [[ADD_2]]
1313
; CHECK-NEXT: [[RES_2:%.*]] = xor i8 [[RES_1]], [[ADD_3]]
1414
; CHECK-NEXT: [[RES_3:%.*]] = xor i8 [[RES_2]], [[ADD_4]]
@@ -30,7 +30,7 @@ define i8 @a_and_15_add_1(i8 %a) {
3030
; CHECK-LABEL: @a_and_15_add_1(
3131
; CHECK-NEXT: entry:
3232
; CHECK-NEXT: [[A_AND:%.*]] = and i8 [[A:%.*]], 15
33-
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A_AND]], 1
33+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A_AND]], 1
3434
; CHECK-NEXT: ret i8 [[ADD_1]]
3535
;
3636
entry:
@@ -73,10 +73,10 @@ define i8 @sge_0_and_sle_90(i8 %a) {
7373
; CHECK-NEXT: [[AND:%.*]] = and i1 [[SGT]], [[SLT]]
7474
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
7575
; CHECK: then:
76-
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], 1
77-
; CHECK-NEXT: [[ADD_2:%.*]] = add i8 [[A]], -1
78-
; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[A]], -91
79-
; CHECK-NEXT: [[ADD_4:%.*]] = add i8 [[A]], -90
76+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A]], 1
77+
; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i8 [[A]], -1
78+
; CHECK-NEXT: [[ADD_3:%.*]] = add nuw nsw i8 [[A]], -91
79+
; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i8 [[A]], -90
8080
; CHECK-NEXT: [[RES_1:%.*]] = xor i8 [[ADD_1]], [[ADD_2]]
8181
; CHECK-NEXT: [[RES_2:%.*]] = xor i8 [[RES_1]], [[ADD_3]]
8282
; CHECK-NEXT: [[RES_3:%.*]] = xor i8 [[RES_2]], [[ADD_4]]
@@ -133,9 +133,9 @@ define i16 @sge_with_sext_to_zext_conversion(i8 %a) {
133133
; CHECK-NEXT: ret i16 [[RES_2]]
134134
; CHECK: else:
135135
; CHECK-NEXT: [[SEXT_2:%.*]] = sext i8 [[A]] to i16
136-
; CHECK-NEXT: [[ADD_4:%.*]] = add i16 [[SEXT_2]], 1
137-
; CHECK-NEXT: [[ADD_5:%.*]] = add i16 [[SEXT_2]], -128
138-
; CHECK-NEXT: [[ADD_6:%.*]] = add i16 [[SEXT_2]], -127
136+
; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i16 [[SEXT_2]], 1
137+
; CHECK-NEXT: [[ADD_5:%.*]] = add nsw i16 [[SEXT_2]], -128
138+
; CHECK-NEXT: [[ADD_6:%.*]] = add nsw i16 [[SEXT_2]], -127
139139
; CHECK-NEXT: [[RES_3:%.*]] = xor i16 [[ADD_4]], [[ADD_5]]
140140
; CHECK-NEXT: [[RES_4:%.*]] = xor i16 [[RES_3]], [[ADD_6]]
141141
; CHECK-NEXT: ret i16 [[RES_4]]

llvm/test/Transforms/SCCP/binaryops-constexprs.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ entry:
3636
define void @add_constexpr(i32 %a) {
3737
; CHECK-LABEL: @add_constexpr(
3838
; CHECK-NEXT: entry:
39-
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i32 0, [[A:%.*]]
39+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i32 0, [[A:%.*]]
4040
; CHECK-NEXT: call void @use.i32(i32 [[ADD_1]])
4141
; CHECK-NEXT: [[ADD_2:%.*]] = add i32 20, [[A]]
4242
; CHECK-NEXT: call void @use.i32(i32 [[ADD_2]])

llvm/test/Transforms/SCCP/conditions-ranges-with-undef.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ declare void @use(i1)
88
define void @val_undef_eq() {
99
; CHECK-LABEL: @val_undef_eq(
1010
; CHECK-NEXT: entry:
11-
; CHECK-NEXT: [[A:%.*]] = add nuw i32 undef, 0
11+
; CHECK-NEXT: [[A:%.*]] = add nuw nsw i32 undef, 0
1212
; CHECK-NEXT: [[BC_1:%.*]] = icmp eq i32 [[A]], 10
1313
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1414
; CHECK: true:
@@ -41,7 +41,7 @@ declare void @use.i32(i32)
4141
define void @val_undef_range() {
4242
; CHECK-LABEL: @val_undef_range(
4343
; CHECK-NEXT: entry:
44-
; CHECK-NEXT: [[A:%.*]] = add nuw i32 undef, 0
44+
; CHECK-NEXT: [[A:%.*]] = add nuw nsw i32 undef, 0
4545
; CHECK-NEXT: [[BC_1:%.*]] = icmp ult i32 [[A]], 127
4646
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
4747
; CHECK: true:

llvm/test/Transforms/SCCP/conditions-ranges.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ define void @f1(i32 %a, i32 %b) {
77
; CHECK-LABEL: @f1(
88
; CHECK-NEXT: entry:
99
; CHECK-NEXT: [[A_255:%.*]] = and i32 [[A:%.*]], 255
10-
; CHECK-NEXT: [[A_2:%.*]] = add nuw i32 [[A_255]], 20
10+
; CHECK-NEXT: [[A_2:%.*]] = add nuw nsw i32 [[A_255]], 20
1111
; CHECK-NEXT: [[BC:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
1212
; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1313
; CHECK: true:
@@ -260,7 +260,7 @@ define void @f8_nested_conds(i32 %a, i32 %b) {
260260
; CHECK-LABEL: @f8_nested_conds(
261261
; CHECK-NEXT: entry:
262262
; CHECK-NEXT: [[A_255:%.*]] = and i32 [[A:%.*]], 255
263-
; CHECK-NEXT: [[A_2:%.*]] = add nuw i32 [[A_255]], 20
263+
; CHECK-NEXT: [[A_2:%.*]] = add nuw nsw i32 [[A_255]], 20
264264
; CHECK-NEXT: [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
265265
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
266266
; CHECK: true:

llvm/test/Transforms/SCCP/ip-add-range-to-call.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ define i32 @caller1() {
1515
; CHECK-LABEL: @caller1(
1616
; CHECK-NEXT: [[C1:%.*]] = call i32 @callee(i32 10), !range [[RNG0:![0-9]+]]
1717
; CHECK-NEXT: [[C2:%.*]] = call i32 @callee(i32 20), !range [[RNG0]]
18-
; CHECK-NEXT: [[A:%.*]] = add nuw i32 [[C1]], [[C2]]
18+
; CHECK-NEXT: [[A:%.*]] = add nuw nsw i32 [[C1]], [[C2]]
1919
; CHECK-NEXT: ret i32 [[A]]
2020
;
2121
%c1 = call i32 @callee(i32 10)

llvm/test/Transforms/SCCP/ip-constant-ranges.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ define internal i32 @f2(i32 %x) {
3333
; CHECK-NEXT: [[CMP4:%.*]] = icmp ugt i32 [[X]], 300
3434
; CHECK-NEXT: [[RES1:%.*]] = select i1 [[CMP]], i32 1, i32 2
3535
; CHECK-NEXT: [[RES4:%.*]] = select i1 [[CMP4]], i32 3, i32 4
36-
; CHECK-NEXT: [[RES6:%.*]] = add nuw i32 [[RES1]], 3
37-
; CHECK-NEXT: [[RES7:%.*]] = add nuw i32 5, [[RES4]]
38-
; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[RES6]], 5
36+
; CHECK-NEXT: [[RES6:%.*]] = add nuw nsw i32 [[RES1]], 3
37+
; CHECK-NEXT: [[RES7:%.*]] = add nuw nsw i32 5, [[RES4]]
38+
; CHECK-NEXT: [[RES:%.*]] = add nuw nsw i32 [[RES6]], 5
3939
; CHECK-NEXT: ret i32 [[RES]]
4040
;
4141
entry:

llvm/test/Transforms/SCCP/ip-ranges-binaryops.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
; x + y = [110, 221)
66
define internal i1 @f.add(i32 %x, i32 %y) {
77
; CHECK-LABEL: @f.add(
8-
; CHECK-NEXT: [[A_1:%.*]] = add nuw i32 [[X:%.*]], [[Y:%.*]]
8+
; CHECK-NEXT: [[A_1:%.*]] = add nuw nsw i32 [[X:%.*]], [[Y:%.*]]
99
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], 219
1010
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 111
1111
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 150
1212
; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], 150
13-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
14-
; CHECK-NEXT: [[RES_2:%.*]] = add nuw i1 [[RES_1]], false
13+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
14+
; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
1515
; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
1616
; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
1717
; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
@@ -55,8 +55,8 @@ define internal i1 @f.sub(i32 %x, i32 %y) {
5555
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], -189
5656
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], -150
5757
; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], -150
58-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
59-
; CHECK-NEXT: [[RES_2:%.*]] = add nuw i1 [[RES_1]], false
58+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
59+
; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
6060
; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
6161
; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
6262
; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
@@ -99,8 +99,8 @@ define internal i1 @f.mul(i32 %x, i32 %y) {
9999
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 1001
100100
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 1500
101101
; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], 1500
102-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
103-
; CHECK-NEXT: [[RES_2:%.*]] = add nuw i1 [[RES_1]], false
102+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
103+
; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
104104
; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
105105
; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
106106
; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]

llvm/test/Transforms/SCCP/ip-ranges-casts.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ define internal i1 @f.trunc(i32 %x) {
77
; CHECK-NEXT: [[T_1:%.*]] = trunc i32 [[X:%.*]] to i16
88
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i16 [[T_1]], 299
99
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i16 [[T_1]], 101
10-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
11-
; CHECK-NEXT: [[RES_2:%.*]] = add nuw i1 [[RES_1]], false
10+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
11+
; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
1212
; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
1313
; CHECK-NEXT: [[T_2:%.*]] = trunc i32 [[X]] to i8
1414
; CHECK-NEXT: [[C_5:%.*]] = icmp sgt i8 [[T_2]], 44
@@ -62,16 +62,16 @@ define internal i1 @f.zext(i32 %x, i32 %y) {
6262
; CHECK-NEXT: [[T_1:%.*]] = zext i32 [[X:%.*]] to i64
6363
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[T_1]], 299
6464
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i64 [[T_1]], 101
65-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
66-
; CHECK-NEXT: [[RES_2:%.*]] = add nuw i1 [[RES_1]], false
65+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
66+
; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
6767
; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
6868
; CHECK-NEXT: [[T_2:%.*]] = zext i32 [[Y:%.*]] to i64
6969
; CHECK-NEXT: [[C_5:%.*]] = icmp sgt i64 [[T_2]], 300
7070
; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i64 [[T_2]], 299
7171
; CHECK-NEXT: [[C_8:%.*]] = icmp slt i64 [[T_2]], 1
7272
; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]
7373
; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
74-
; CHECK-NEXT: [[RES_6:%.*]] = add nuw i1 [[RES_5]], false
74+
; CHECK-NEXT: [[RES_6:%.*]] = add nuw nsw i1 [[RES_5]], false
7575
; CHECK-NEXT: [[RES_7:%.*]] = add i1 [[RES_6]], [[C_8]]
7676
; CHECK-NEXT: ret i1 [[RES_7]]
7777
;
@@ -115,15 +115,15 @@ define internal i1 @f.sext(i32 %x, i32 %y) {
115115
; CHECK-NEXT: [[T_1:%.*]] = zext i32 [[X:%.*]] to i64
116116
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[T_1]], 299
117117
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i64 [[T_1]], 101
118-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
119-
; CHECK-NEXT: [[RES_2:%.*]] = add nuw i1 [[RES_1]], false
118+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
119+
; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false
120120
; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]
121121
; CHECK-NEXT: [[T_2:%.*]] = sext i32 [[Y:%.*]] to i64
122122
; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i64 [[T_2]], 899
123123
; CHECK-NEXT: [[C_8:%.*]] = icmp slt i64 [[T_2]], -119
124-
; CHECK-NEXT: [[RES_4:%.*]] = add nuw i1 [[RES_3]], false
124+
; CHECK-NEXT: [[RES_4:%.*]] = add nuw nsw i1 [[RES_3]], false
125125
; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]
126-
; CHECK-NEXT: [[RES_6:%.*]] = add nuw i1 [[RES_5]], false
126+
; CHECK-NEXT: [[RES_6:%.*]] = add nuw nsw i1 [[RES_5]], false
127127
; CHECK-NEXT: [[RES_7:%.*]] = add i1 [[RES_6]], [[C_8]]
128128
; CHECK-NEXT: ret i1 [[RES_7]]
129129
;

llvm/test/Transforms/SCCP/ip-ranges-phis.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ define internal i32 @f2(i32 %x, i32 %y, i32 %z, i1 %cmp.1, i1 %cmp.2) {
5555
; CHECK-NEXT: [[V_1:%.*]] = select i1 [[C_1]], i32 10, i32 100
5656
; CHECK-NEXT: [[V_2:%.*]] = select i1 [[C_2]], i32 20, i32 200
5757
; CHECK-NEXT: [[V_3:%.*]] = select i1 [[C_3]], i32 30, i32 300
58-
; CHECK-NEXT: [[R_1:%.*]] = add nuw i32 [[V_1]], [[V_2]]
59-
; CHECK-NEXT: [[R_2:%.*]] = add nuw i32 [[R_1]], [[V_3]]
60-
; CHECK-NEXT: [[R_3:%.*]] = add nuw i32 [[R_2]], 400
61-
; CHECK-NEXT: [[R_4:%.*]] = add nuw i32 [[R_3]], 50
62-
; CHECK-NEXT: [[R_5:%.*]] = add nuw i32 [[R_4]], 60
63-
; CHECK-NEXT: [[R_6:%.*]] = add nuw i32 [[R_4]], 700
58+
; CHECK-NEXT: [[R_1:%.*]] = add nuw nsw i32 [[V_1]], [[V_2]]
59+
; CHECK-NEXT: [[R_2:%.*]] = add nuw nsw i32 [[R_1]], [[V_3]]
60+
; CHECK-NEXT: [[R_3:%.*]] = add nuw nsw i32 [[R_2]], 400
61+
; CHECK-NEXT: [[R_4:%.*]] = add nuw nsw i32 [[R_3]], 50
62+
; CHECK-NEXT: [[R_5:%.*]] = add nuw nsw i32 [[R_4]], 60
63+
; CHECK-NEXT: [[R_6:%.*]] = add nuw nsw i32 [[R_4]], 700
6464
; CHECK-NEXT: ret i32 [[R_6]]
6565
;
6666

@@ -154,12 +154,12 @@ define internal i32 @f3(i32 %x, i32 %y, i1 %cmp.1) {
154154
; CHECK-NEXT: [[V_5:%.*]] = select i1 [[C_5]], i32 50, i32 500
155155
; CHECK-NEXT: [[V_6:%.*]] = select i1 [[C_6]], i32 60, i32 600
156156
; CHECK-NEXT: [[V_7:%.*]] = select i1 [[C_7]], i32 70, i32 700
157-
; CHECK-NEXT: [[R_1:%.*]] = add nuw i32 [[V_1]], [[V_2]]
158-
; CHECK-NEXT: [[R_2:%.*]] = add nuw i32 [[R_1]], [[V_3]]
159-
; CHECK-NEXT: [[R_3:%.*]] = add nuw i32 [[R_2]], [[V_4]]
160-
; CHECK-NEXT: [[R_4:%.*]] = add nuw i32 [[R_3]], [[V_5]]
161-
; CHECK-NEXT: [[R_5:%.*]] = add nuw i32 [[R_4]], [[V_6]]
162-
; CHECK-NEXT: [[R_6:%.*]] = add nuw i32 [[R_4]], [[V_7]]
157+
; CHECK-NEXT: [[R_1:%.*]] = add nuw nsw i32 [[V_1]], [[V_2]]
158+
; CHECK-NEXT: [[R_2:%.*]] = add nuw nsw i32 [[R_1]], [[V_3]]
159+
; CHECK-NEXT: [[R_3:%.*]] = add nuw nsw i32 [[R_2]], [[V_4]]
160+
; CHECK-NEXT: [[R_4:%.*]] = add nuw nsw i32 [[R_3]], [[V_5]]
161+
; CHECK-NEXT: [[R_5:%.*]] = add nuw nsw i32 [[R_4]], [[V_6]]
162+
; CHECK-NEXT: [[R_6:%.*]] = add nuw nsw i32 [[R_4]], [[V_7]]
163163
; CHECK-NEXT: ret i32 [[R_6]]
164164
;
165165

llvm/test/Transforms/SCCP/ip-ranges-select.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ define internal i1 @f1(i32 %x, i32 %y, i1 %cmp) {
4444
; CHECK-NEXT: [[SEL_1:%.*]] = select i1 [[CMP]], i32 [[X]], i32 [[Y]]
4545
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[SEL_1]], 100
4646
; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[SEL_1]], 50
47-
; CHECK-NEXT: [[RES_1:%.*]] = add nuw i1 false, [[C_2]]
47+
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
4848
; CHECK-NEXT: [[RES_2:%.*]] = add i1 [[RES_1]], [[C_3]]
49-
; CHECK-NEXT: [[RES_3:%.*]] = add nuw i1 [[RES_2]], false
49+
; CHECK-NEXT: [[RES_3:%.*]] = add nuw nsw i1 [[RES_2]], false
5050
; CHECK-NEXT: ret i1 [[RES_3]]
5151
;
5252
%sel.1 = select i1 %cmp, i32 %x, i32 %y

llvm/test/Transforms/SCCP/return-argument.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ F: ; preds = %0
3333
;; value
3434
define internal { i32, i32 } @foo(i32 %A, i32 %B) {
3535
; CHECK-LABEL: @foo(
36-
; CHECK-NEXT: [[X:%.*]] = add nuw i32 [[A:%.*]], [[B:%.*]]
36+
; CHECK-NEXT: [[X:%.*]] = add nuw nsw i32 [[A:%.*]], [[B:%.*]]
3737
; CHECK-NEXT: [[Y:%.*]] = insertvalue { i32, i32 } undef, i32 [[A]], 0
3838
; CHECK-NEXT: [[Z:%.*]] = insertvalue { i32, i32 } [[Y]], i32 [[X]], 1
3939
; CHECK-NEXT: ret { i32, i32 } [[Z]]
@@ -54,7 +54,7 @@ define void @caller(i1 %C) personality ptr @__gxx_personality_v0 {
5454
; CHECK-NEXT: to label [[OK:%.*]] unwind label [[LPAD:%.*]]
5555
; CHECK: OK:
5656
; CHECK-NEXT: [[X2:%.*]] = extractvalue { i32, i32 } [[S2]], 0
57-
; CHECK-NEXT: [[Z:%.*]] = add nuw i32 [[X1]], [[X2]]
57+
; CHECK-NEXT: [[Z:%.*]] = add nuw nsw i32 [[X1]], [[X2]]
5858
; CHECK-NEXT: store i32 [[Z]], ptr [[W]], align 4
5959
; CHECK-NEXT: br label [[RET:%.*]]
6060
; CHECK: LPAD:

llvm/test/Transforms/SCCP/return-constants.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ define %0 @caller(i1 %Q) {
5050
; CHECK-NEXT: [[B:%.*]] = extractvalue [[TMP0]] [[X]], 1
5151
; CHECK-NEXT: [[Y:%.*]] = call [[TMP0]] @bar(i1 [[Q]])
5252
; CHECK-NEXT: [[D:%.*]] = extractvalue [[TMP0]] [[Y]], 1
53-
; CHECK-NEXT: [[N:%.*]] = add nuw i32 [[B]], [[D]]
53+
; CHECK-NEXT: [[N:%.*]] = add nuw nsw i32 [[B]], [[D]]
5454
; CHECK-NEXT: ret [[TMP0]] [[X]]
5555
;
5656
%X = call %0 @foo(i1 %Q)

llvm/test/Transforms/SCCP/widening.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ define void @test_2_incoming_constants(i32 %x) {
1616
; SCCP-NEXT: br label [[EXIT]]
1717
; SCCP: exit:
1818
; SCCP-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB1]] ]
19-
; SCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
19+
; SCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
2020
; SCCP-NEXT: call void @use(i1 true)
2121
; SCCP-NEXT: call void @use(i1 false)
2222
; SCCP-NEXT: ret void
@@ -29,7 +29,7 @@ define void @test_2_incoming_constants(i32 %x) {
2929
; IPSCCP-NEXT: br label [[EXIT]]
3030
; IPSCCP: exit:
3131
; IPSCCP-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB1]] ]
32-
; IPSCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
32+
; IPSCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
3333
; IPSCCP-NEXT: call void @use(i1 true)
3434
; IPSCCP-NEXT: call void @use(i1 false)
3535
; IPSCCP-NEXT: ret void
@@ -63,7 +63,7 @@ define void @test_3_incoming_constants(i32 %x) {
6363
; SCCP-NEXT: br label [[EXIT]]
6464
; SCCP: exit:
6565
; SCCP-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ]
66-
; SCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
66+
; SCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
6767
; SCCP-NEXT: call void @use(i1 true)
6868
; SCCP-NEXT: call void @use(i1 false)
6969
; SCCP-NEXT: ret void
@@ -79,7 +79,7 @@ define void @test_3_incoming_constants(i32 %x) {
7979
; IPSCCP-NEXT: br label [[EXIT]]
8080
; IPSCCP: exit:
8181
; IPSCCP-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ]
82-
; IPSCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
82+
; IPSCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
8383
; IPSCCP-NEXT: call void @use(i1 true)
8484
; IPSCCP-NEXT: call void @use(i1 false)
8585
; IPSCCP-NEXT: ret void
@@ -123,7 +123,7 @@ define void @test_5_incoming_constants(i32 %x) {
123123
; SCCP-NEXT: br label [[EXIT]]
124124
; SCCP: exit:
125125
; SCCP-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ], [ 3, [[BB3]] ], [ 4, [[BB4]] ]
126-
; SCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
126+
; SCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
127127
; SCCP-NEXT: call void @use(i1 true)
128128
; SCCP-NEXT: call void @use(i1 false)
129129
; SCCP-NEXT: ret void
@@ -145,7 +145,7 @@ define void @test_5_incoming_constants(i32 %x) {
145145
; IPSCCP-NEXT: br label [[EXIT]]
146146
; IPSCCP: exit:
147147
; IPSCCP-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ], [ 3, [[BB3]] ], [ 4, [[BB4]] ]
148-
; IPSCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
148+
; IPSCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
149149
; IPSCCP-NEXT: call void @use(i1 true)
150150
; IPSCCP-NEXT: call void @use(i1 false)
151151
; IPSCCP-NEXT: ret void
@@ -196,7 +196,7 @@ define void @rotated_loop_2(i32 %x) {
196196
; SCCP-NEXT: br label [[EXIT]]
197197
; SCCP: exit:
198198
; SCCP-NEXT: [[P:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ 3, [[BB1]] ], [ 2, [[BB2]] ], [ 5, [[BB3]] ]
199-
; SCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
199+
; SCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
200200
; SCCP-NEXT: call void @use(i1 true)
201201
; SCCP-NEXT: call void @use(i1 false)
202202
; SCCP-NEXT: br label [[EXIT_1:%.*]]
@@ -217,7 +217,7 @@ define void @rotated_loop_2(i32 %x) {
217217
; IPSCCP-NEXT: br label [[EXIT]]
218218
; IPSCCP: exit:
219219
; IPSCCP-NEXT: [[P:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ 3, [[BB1]] ], [ 2, [[BB2]] ], [ 5, [[BB3]] ]
220-
; IPSCCP-NEXT: [[A:%.*]] = add nuw i32 [[P]], 1
220+
; IPSCCP-NEXT: [[A:%.*]] = add nuw nsw i32 [[P]], 1
221221
; IPSCCP-NEXT: call void @use(i1 true)
222222
; IPSCCP-NEXT: call void @use(i1 false)
223223
; IPSCCP-NEXT: br label [[EXIT_1:%.*]]

0 commit comments

Comments
 (0)