summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2017-10-12 17:31:46 +0000
committerSanjay Patel <spatel@rotateright.com>2017-10-12 17:31:46 +0000
commite272be7c9a1e20c4671451f435c9d8ff16290ccc (patch)
treef2f5830812b0c597823778a63f2cbc75a5e04f7b /llvm/lib/Analysis/ValueTracking.cpp
parent326442c410b67c828bb5bef673873e5ad199512f (diff)
downloadbcm5719-llvm-e272be7c9a1e20c4671451f435c9d8ff16290ccc.tar.gz
bcm5719-llvm-e272be7c9a1e20c4671451f435c9d8ff16290ccc.zip
[ValueTracking] return zero when there's conflict in known bits of a shift (PR34838)
Poison allows us to return a better result than undef. llvm-svn: 315595
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp26
1 files changed, 12 insertions, 14 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index d9e164500c3..afdef2822ac 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -810,19 +810,20 @@ static void computeKnownBitsFromShiftOperator(
computeKnownBits(I->getOperand(0), Known, Depth + 1, Q);
Known.Zero = KZF(Known.Zero, ShiftAmt);
Known.One = KOF(Known.One, ShiftAmt);
- // If there is conflict between Known.Zero and Known.One, this must be an
- // overflowing left shift, so the shift result is undefined. Clear Known
- // bits so that other code could propagate this undef.
- if ((Known.Zero & Known.One) != 0)
- Known.resetAll();
+ // If the known bits conflict, this must be an overflowing left shift, so
+ // the shift result is poison. We can return anything we want. Choose 0 for
+ // the best folding opportunity.
+ if (Known.hasConflict())
+ Known.setAllZero();
return;
}
computeKnownBits(I->getOperand(1), Known, Depth + 1, Q);
- // If the shift amount could be greater than or equal to the bit-width of the LHS, the
- // value could be undef, so we don't know anything about it.
+ // If the shift amount could be greater than or equal to the bit-width of the
+ // LHS, the value could be poison, but bail out because the check below is
+ // expensive. TODO: Should we just carry on?
if ((~Known.Zero).uge(BitWidth)) {
Known.resetAll();
return;
@@ -878,13 +879,10 @@ static void computeKnownBitsFromShiftOperator(
Known.One &= KOF(Known2.One, ShiftAmt);
}
- // If there are no compatible shift amounts, then we've proven that the shift
- // amount must be >= the BitWidth, and the result is undefined. We could
- // return anything we'd like, but we need to make sure the sets of known bits
- // stay disjoint (it should be better for some other code to actually
- // propagate the undef than to pick a value here using known bits).
- if (Known.Zero.intersects(Known.One))
- Known.resetAll();
+ // If the known bits conflict, the result is poison. Return a 0 and hope the
+ // caller can further optimize that.
+ if (Known.hasConflict())
+ Known.setAllZero();
}
static void computeKnownBitsFromOperator(const Operator *I, KnownBits &Known,
OpenPOWER on IntegriCloud