svn commit: r255076 - head/contrib/llvm/lib/Transforms/InstCombine
Dimitry Andric
dim at FreeBSD.org
Fri Aug 30 18:29:26 UTC 2013
Author: dim
Date: Fri Aug 30 18:29:25 2013
New Revision: 255076
URL: http://svnweb.freebsd.org/changeset/base/255076
Log:
Pull in r189672 from upstream llvm trunk:
InstCombine: Check for zero shift amounts before subtracting one
causing integer overflow.
PR17026. Also avoid undefined shifts and shift amounts larger than 64
bits (those are always undef because we can't represent integer types
that large).
This should fix assertion failures when building the emulators/xmame
port.
Reported by: bapt
Modified:
head/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
Modified: head/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
==============================================================================
--- head/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Fri Aug 30 17:47:53 2013 (r255075)
+++ head/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Fri Aug 30 18:29:25 2013 (r255076)
@@ -845,21 +845,26 @@ Value *InstCombiner::SimplifyDemandedUse
Value *InstCombiner::SimplifyShrShlDemandedBits(Instruction *Shr,
Instruction *Shl, APInt DemandedMask, APInt &KnownZero, APInt &KnownOne) {
- unsigned ShlAmt = cast<ConstantInt>(Shl->getOperand(1))->getZExtValue();
- unsigned ShrAmt = cast<ConstantInt>(Shr->getOperand(1))->getZExtValue();
+ const APInt &ShlOp1 = cast<ConstantInt>(Shl->getOperand(1))->getValue();
+ const APInt &ShrOp1 = cast<ConstantInt>(Shr->getOperand(1))->getValue();
+ if (!ShlOp1 || !ShrOp1)
+ return 0; // Noop.
+
+ Value *VarX = Shr->getOperand(0);
+ Type *Ty = VarX->getType();
+ unsigned BitWidth = Ty->getIntegerBitWidth();
+ if (ShlOp1.uge(BitWidth) || ShrOp1.uge(BitWidth))
+ return 0; // Undef.
+
+ unsigned ShlAmt = ShlOp1.getZExtValue();
+ unsigned ShrAmt = ShrOp1.getZExtValue();
KnownOne.clearAllBits();
KnownZero = APInt::getBitsSet(KnownZero.getBitWidth(), 0, ShlAmt-1);
KnownZero &= DemandedMask;
- if (ShlAmt == 0 || ShrAmt == 0)
- return 0;
-
- Value *VarX = Shr->getOperand(0);
- Type *Ty = VarX->getType();
-
- APInt BitMask1(APInt::getAllOnesValue(Ty->getIntegerBitWidth()));
- APInt BitMask2(APInt::getAllOnesValue(Ty->getIntegerBitWidth()));
+ APInt BitMask1(APInt::getAllOnesValue(BitWidth));
+ APInt BitMask2(APInt::getAllOnesValue(BitWidth));
bool isLshr = (Shr->getOpcode() == Instruction::LShr);
BitMask1 = isLshr ? (BitMask1.lshr(ShrAmt) << ShlAmt) :
More information about the svn-src-all
mailing list