From d94903c9f80d9dfa2664caed8e35845b46a7b8f2 Mon Sep 17 00:00:00 2001 From: Artur Pilipenko Date: Wed, 7 Oct 2015 16:01:18 +0000 Subject: Teach computeKnownBits to use new align attribute/metadata Reviewed By: reames Differential Revision: http://reviews.llvm.org/D13470 llvm-svn: 249557 --- llvm/lib/Analysis/ValueTracking.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Analysis/ValueTracking.cpp') diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index d3723037dda..d8a449193a3 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1415,7 +1415,7 @@ static void computeKnownBitsFromOperator(Operator *I, APInt &KnownZero, } } -static unsigned getAlignment(Value *V, const DataLayout &DL) { +static unsigned getAlignment(const Value *V, const DataLayout &DL) { unsigned Align = 0; if (auto *GO = dyn_cast(V)) { Align = GO->getAlignment(); @@ -1433,7 +1433,7 @@ static unsigned getAlignment(Value *V, const DataLayout &DL) { } } } - } else if (Argument *A = dyn_cast(V)) { + } else if (const Argument *A = dyn_cast(V)) { Align = A->getType()->isPointerTy() ? A->getParamAlignment() : 0; if (!Align && A->hasStructRetAttr()) { @@ -1442,7 +1442,16 @@ static unsigned getAlignment(Value *V, const DataLayout &DL) { if (EltTy->isSized()) Align = DL.getABITypeAlignment(EltTy); } - } + } else if (const AllocaInst *AI = dyn_cast(V)) + Align = AI->getAlignment(); + else if (auto CS = ImmutableCallSite(V)) + Align = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex); + else if (const LoadInst *LI = dyn_cast(V)) + if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) { + ConstantInt *CI = mdconst::extract(MD->getOperand(0)); + Align = CI->getLimitedValue(); + } + return Align; } -- cgit v1.2.3