Skip to content

Commit 7d10213

Browse files
committed
Recommit "[SCCP] Support NUW/NSW inference for all overflowing binary operators."
This reverts commit 43acb61. Recommit the patch after fixing the issue causing the revert in 4e607ec. Extra tests have been added in 5c6cb61. Original commit message: Extend the NUW/NSW inference logic add in 72121a2 and cdeaf5f to all overflowing binary operators. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D142721
1 parent 022d0c6 commit 7d10213

File tree

6 files changed

+17
-16
lines changed

6 files changed

+17
-16
lines changed

llvm/lib/Transforms/Utils/SCCPSolver.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ bool SCCPSolver::tryToReplaceWithConstant(Value *V) {
127127
static bool refineInstruction(SCCPSolver &Solver,
128128
const SmallPtrSetImpl<Value *> &InsertedValues,
129129
Instruction &Inst) {
130-
if (Inst.getOpcode() != Instruction::Add)
130+
if (!isa<OverflowingBinaryOperator>(Inst))
131131
return false;
132132

133133
auto GetRange = [&Solver, &InsertedValues](Value *Op) {
@@ -145,15 +145,16 @@ static bool refineInstruction(SCCPSolver &Solver,
145145
bool Changed = false;
146146
if (!Inst.hasNoUnsignedWrap()) {
147147
auto NUWRange = ConstantRange::makeGuaranteedNoWrapRegion(
148-
Instruction::Add, RangeB, OverflowingBinaryOperator::NoUnsignedWrap);
148+
Instruction::BinaryOps(Inst.getOpcode()), RangeB,
149+
OverflowingBinaryOperator::NoUnsignedWrap);
149150
if (NUWRange.contains(RangeA)) {
150151
Inst.setHasNoUnsignedWrap();
151152
Changed = true;
152153
}
153154
}
154155
if (!Inst.hasNoSignedWrap()) {
155156
auto NSWRange = ConstantRange::makeGuaranteedNoWrapRegion(
156-
Instruction::Add, RangeB, OverflowingBinaryOperator::NoSignedWrap);
157+
Instruction::BinaryOps(Inst.getOpcode()), RangeB, OverflowingBinaryOperator::NoSignedWrap);
157158
if (NSWRange.contains(RangeA)) {
158159
Inst.setHasNoSignedWrap();
159160
Changed = true;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ define internal i32 @recursive_f(i32 %i) {
243243
; CHECK: if.then:
244244
; CHECK-NEXT: br label [[RETURN:%.*]]
245245
; CHECK: if.else:
246-
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[I]], 1
246+
; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[I]], 1
247247
; CHECK-NEXT: [[CALL:%.*]] = call i32 @recursive_f(i32 [[SUB]])
248248
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[I]], [[CALL]]
249249
; CHECK-NEXT: br label [[RETURN]]

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ define i1 @caller.add() {
5050
; x - y = [-190, -79)
5151
define internal i1 @f.sub(i32 %x, i32 %y) {
5252
; CHECK-LABEL: @f.sub(
53-
; CHECK-NEXT: [[A_1:%.*]] = sub i32 [[X:%.*]], [[Y:%.*]]
53+
; CHECK-NEXT: [[A_1:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
5454
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], -81
5555
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], -189
5656
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], -150
@@ -94,7 +94,7 @@ define i1 @caller.sub() {
9494
; x * y = [1000, 4001)
9595
define internal i1 @f.mul(i32 %x, i32 %y) {
9696
; CHECK-LABEL: @f.mul(
97-
; CHECK-NEXT: [[A_1:%.*]] = mul i32 [[X:%.*]], [[Y:%.*]]
97+
; CHECK-NEXT: [[A_1:%.*]] = mul nuw nsw i32 [[X:%.*]], [[Y:%.*]]
9898
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], 3999
9999
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 1001
100100
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 1500

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ define i8 @range_from_lshr(i8 %a) {
55
; CHECK-LABEL: @range_from_lshr(
66
; CHECK-NEXT: entry:
77
; CHECK-NEXT: [[A_SHR:%.*]] = lshr i8 [[A:%.*]], 1
8-
; CHECK-NEXT: [[SUB_1:%.*]] = sub i8 [[A_SHR]], 1
8+
; CHECK-NEXT: [[SUB_1:%.*]] = sub nsw i8 [[A_SHR]], 1
99
; CHECK-NEXT: [[SUB_2:%.*]] = sub i8 [[A_SHR]], -128
1010
; CHECK-NEXT: [[SUB_3:%.*]] = sub i8 [[A_SHR]], -127
1111
; CHECK-NEXT: [[SUB_4:%.*]] = sub i8 [[A_SHR]], -1
@@ -31,7 +31,7 @@ define i8 @sub_zero(i8 %a) {
3131
; CHECK-LABEL: @sub_zero(
3232
; CHECK-NEXT: entry:
3333
; CHECK-NEXT: [[SUB_1:%.*]] = sub i8 0, [[A:%.*]]
34-
; CHECK-NEXT: [[SUB_2:%.*]] = sub i8 -1, [[A]]
34+
; CHECK-NEXT: [[SUB_2:%.*]] = sub nuw nsw i8 -1, [[A]]
3535
; CHECK-NEXT: [[SUB_3:%.*]] = sub i8 1, [[A]]
3636
; CHECK-NEXT: [[SUB_4:%.*]] = sub i8 [[A]], -1
3737
; CHECK-NEXT: [[RES_1:%.*]] = xor i8 [[SUB_1]], [[SUB_2]]

llvm/test/Transforms/SCCP/ub-shift.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ define void @shift_undef_64(ptr %p) {
55
; CHECK-LABEL: @shift_undef_64(
66
; CHECK-NEXT: store i64 0, ptr [[P:%.*]], align 4
77
; CHECK-NEXT: store i64 -1, ptr [[P]], align 4
8-
; CHECK-NEXT: [[R3:%.*]] = shl i64 -1, 4294967298
8+
; CHECK-NEXT: [[R3:%.*]] = shl nuw nsw i64 -1, 4294967298
99
; CHECK-NEXT: store i64 [[R3]], ptr [[P]], align 4
1010
; CHECK-NEXT: ret void
1111
;
@@ -25,7 +25,7 @@ define void @shift_undef_65(ptr %p) {
2525
; CHECK-LABEL: @shift_undef_65(
2626
; CHECK-NEXT: store i65 0, ptr [[P:%.*]], align 4
2727
; CHECK-NEXT: store i65 0, ptr [[P]], align 4
28-
; CHECK-NEXT: [[R3:%.*]] = shl i65 1, -18446744073709551615
28+
; CHECK-NEXT: [[R3:%.*]] = shl nuw nsw i65 1, -18446744073709551615
2929
; CHECK-NEXT: store i65 [[R3]], ptr [[P]], align 4
3030
; CHECK-NEXT: ret void
3131
;
@@ -45,7 +45,7 @@ define void @shift_undef_256(ptr %p) {
4545
; CHECK-LABEL: @shift_undef_256(
4646
; CHECK-NEXT: store i256 0, ptr [[P:%.*]], align 4
4747
; CHECK-NEXT: store i256 0, ptr [[P]], align 4
48-
; CHECK-NEXT: [[R3:%.*]] = shl i256 1, 18446744073709551619
48+
; CHECK-NEXT: [[R3:%.*]] = shl nuw nsw i256 1, 18446744073709551619
4949
; CHECK-NEXT: store i256 [[R3]], ptr [[P]], align 4
5050
; CHECK-NEXT: ret void
5151
;
@@ -65,7 +65,7 @@ define void @shift_undef_511(ptr %p) {
6565
; CHECK-LABEL: @shift_undef_511(
6666
; CHECK-NEXT: store i511 0, ptr [[P:%.*]], align 4
6767
; CHECK-NEXT: store i511 -1, ptr [[P]], align 4
68-
; CHECK-NEXT: [[R3:%.*]] = shl i511 -3, 1208925819614629174706180
68+
; CHECK-NEXT: [[R3:%.*]] = shl nuw nsw i511 -3, 1208925819614629174706180
6969
; CHECK-NEXT: store i511 [[R3]], ptr [[P]], align 4
7070
; CHECK-NEXT: ret void
7171
;

llvm/test/Transforms/SCCP/widening.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -447,8 +447,8 @@ define void @foo(ptr %arg) {
447447
; SCCP: bb4:
448448
; SCCP-NEXT: [[TMP5:%.*]] = add i64 [[TMP2]], 3
449449
; SCCP-NEXT: [[TMP6:%.*]] = and i64 [[TMP5]], 3
450-
; SCCP-NEXT: [[TMP7:%.*]] = sub i64 3, [[TMP6]]
451-
; SCCP-NEXT: [[TMP8:%.*]] = shl i64 [[TMP7]], 1
450+
; SCCP-NEXT: [[TMP7:%.*]] = sub nuw nsw i64 3, [[TMP6]]
451+
; SCCP-NEXT: [[TMP8:%.*]] = shl nuw nsw i64 [[TMP7]], 1
452452
; SCCP-NEXT: [[TMP9:%.*]] = trunc i64 [[TMP8]] to i32
453453
; SCCP-NEXT: [[TMP10:%.*]] = zext i32 [[TMP9]] to i64
454454
; SCCP-NEXT: br label [[BB11:%.*]]
@@ -484,8 +484,8 @@ define void @foo(ptr %arg) {
484484
; IPSCCP: bb4:
485485
; IPSCCP-NEXT: [[TMP5:%.*]] = add i64 [[TMP2]], 3
486486
; IPSCCP-NEXT: [[TMP6:%.*]] = and i64 [[TMP5]], 3
487-
; IPSCCP-NEXT: [[TMP7:%.*]] = sub i64 3, [[TMP6]]
488-
; IPSCCP-NEXT: [[TMP8:%.*]] = shl i64 [[TMP7]], 1
487+
; IPSCCP-NEXT: [[TMP7:%.*]] = sub nuw nsw i64 3, [[TMP6]]
488+
; IPSCCP-NEXT: [[TMP8:%.*]] = shl nuw nsw i64 [[TMP7]], 1
489489
; IPSCCP-NEXT: [[TMP9:%.*]] = trunc i64 [[TMP8]] to i32
490490
; IPSCCP-NEXT: [[TMP10:%.*]] = zext i32 [[TMP9]] to i64
491491
; IPSCCP-NEXT: br label [[BB11:%.*]]

0 commit comments

Comments
 (0)