summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-03-22 17:51:40 +0000
committerNikita Popov <nikita.ppv@gmail.com>2019-03-22 17:51:40 +0000
commit280a6b01c8f6279ba2e7b9a15dfb2c81f5de6088 (patch)
tree06a071818d96c9b6d8400106fcf49e46d10e4d00 /llvm/lib/Analysis
parent564392d752d2b9b2018e401a17145d604c1cb3cc (diff)
downloadbcm5719-llvm-280a6b01c8f6279ba2e7b9a15dfb2c81f5de6088.tar.gz
bcm5719-llvm-280a6b01c8f6279ba2e7b9a15dfb2c81f5de6088.zip
[ValueTracking] Avoid redundant known bits calculation in computeOverflowForSignedAdd()
We're already computing the known bits of the operands here. If the known bits of the operands can determine the sign bit of the result, we'll already catch this in signedAddMayOverflow(). The only other way (and as the comment already indicates) we'll get new information from computing known bits on the whole add, is if there's an assumption on it. As such, we change the code to only compute known bits from assumptions, instead of computing full known bits on the add (which would unnecessarily recompute the known bits of the operands as well). Differential Revision: https://reviews.llvm.org/D59473 llvm-svn: 356785
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index e31ddf0d646..4c2e7f253be 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4146,19 +4146,21 @@ static OverflowResult computeOverflowForSignedAdd(const Value *LHS,
return OverflowResult::MayOverflow;
// If the sign of Add is the same as at least one of the operands, this add
- // CANNOT overflow. This is particularly useful when the sum is
- // @llvm.assume'ed non-negative rather than proved so from analyzing its
- // operands.
+ // CANNOT overflow. If this can be determined from the known bits of the
+ // operands the above signedAddMayOverflow() check will have already done so.
+ // The only other way to improve on the known bits is from an assumption, so
+ // call computeKnownBitsFromAssume() directly.
bool LHSOrRHSKnownNonNegative =
(LHSKnown.isNonNegative() || RHSKnown.isNonNegative());
bool LHSOrRHSKnownNegative =
(LHSKnown.isNegative() || RHSKnown.isNegative());
if (LHSOrRHSKnownNonNegative || LHSOrRHSKnownNegative) {
- KnownBits AddKnown = computeKnownBits(Add, DL, /*Depth=*/0, AC, CxtI, DT);
+ KnownBits AddKnown(LHSKnown.getBitWidth());
+ computeKnownBitsFromAssume(
+ Add, AddKnown, /*Depth=*/0, Query(DL, AC, CxtI, DT, true));
if ((AddKnown.isNonNegative() && LHSOrRHSKnownNonNegative) ||
- (AddKnown.isNegative() && LHSOrRHSKnownNegative)) {
+ (AddKnown.isNegative() && LHSOrRHSKnownNegative))
return OverflowResult::NeverOverflows;
- }
}
return OverflowResult::MayOverflow;
OpenPOWER on IntegriCloud