summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorArtur Pilipenko <apilipenko@azulsystems.com>2015-10-07 16:01:18 +0000
committerArtur Pilipenko <apilipenko@azulsystems.com>2015-10-07 16:01:18 +0000
commitd94903c9f80d9dfa2664caed8e35845b46a7b8f2 (patch)
tree0e22981dbc4cc26c322d666816440979713e1286 /llvm/lib/Analysis/ValueTracking.cpp
parentd45b205ed1a1f83529929de88feb0e63e5a27649 (diff)
downloadbcm5719-llvm-d94903c9f80d9dfa2664caed8e35845b46a7b8f2.tar.gz
bcm5719-llvm-d94903c9f80d9dfa2664caed8e35845b46a7b8f2.zip
Teach computeKnownBits to use new align attribute/metadata
Reviewed By: reames Differential Revision: http://reviews.llvm.org/D13470 llvm-svn: 249557
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp15
1 files changed, 12 insertions, 3 deletions
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<GlobalObject>(V)) {
Align = GO->getAlignment();
@@ -1433,7 +1433,7 @@ static unsigned getAlignment(Value *V, const DataLayout &DL) {
}
}
}
- } else if (Argument *A = dyn_cast<Argument>(V)) {
+ } else if (const Argument *A = dyn_cast<Argument>(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<AllocaInst>(V))
+ Align = AI->getAlignment();
+ else if (auto CS = ImmutableCallSite(V))
+ Align = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex);
+ else if (const LoadInst *LI = dyn_cast<LoadInst>(V))
+ if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) {
+ ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0));
+ Align = CI->getLimitedValue();
+ }
+
return Align;
}
OpenPOWER on IntegriCloud