When user code intentionally dereferences null, the alignment of the

dereference is theoretically infinite. Put a cap on the computed
alignment to avoid overflow, noticed by John Regehr.

llvm-svn: 109596
This commit is contained in:
Dan Gohman 2010-07-28 17:14:23 +00:00
parent 32f889e552
commit 9cd20bf792
1 changed files with 7 additions and 2 deletions

View File

@ -96,12 +96,17 @@ static unsigned EnforceKnownAlignment(Value *V,
/// increase the alignment of the ultimate object, making this check succeed.
unsigned InstCombiner::GetOrEnforceKnownAlignment(Value *V,
unsigned PrefAlign) {
unsigned BitWidth = TD ? TD->getTypeSizeInBits(V->getType()) :
sizeof(PrefAlign) * CHAR_BIT;
assert(V->getType()->isPointerTy() &&
"GetOrEnforceKnownAlignment expects a pointer!");
unsigned BitWidth = TD ? TD->getPointerSizeInBits() : 64;
APInt Mask = APInt::getAllOnesValue(BitWidth);
APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
ComputeMaskedBits(V, Mask, KnownZero, KnownOne);
unsigned TrailZ = KnownZero.countTrailingOnes();
// LLVM doesn't support alignments larger than this currently.
TrailZ = std::min(TrailZ, unsigned(sizeof(unsigned) * CHAR_BIT - 1));
unsigned Align = 1u << std::min(BitWidth - 1, TrailZ);
if (PrefAlign > Align)