diff options
author | Hideto Ueno <uenoku.tokotoko@gmail.com> | 2019-07-28 06:17:46 +0000 |
---|---|---|
committer | Hideto Ueno <uenoku.tokotoko@gmail.com> | 2019-07-28 06:17:46 +0000 |
commit | afd4a37b2a35d730a85a26d21428034915bd5b3f (patch) | |
tree | 35cf92efb78ba8609617524a6b71a5ba6a1b6e67 /llvm/lib | |
parent | cc0a4cdc890f738fc93916a8604301362bcc9d57 (diff) | |
download | bcm5719-llvm-afd4a37b2a35d730a85a26d21428034915bd5b3f.tar.gz bcm5719-llvm-afd4a37b2a35d730a85a26d21428034915bd5b3f.zip |
[IR] Fix getPointerAlignment for CallBase
Summary:
In current getPointerAlignemnt implementation, CallBase.getPointerAlignement(..) checks only parameter attriutes in the callsite. For example,
```
declare align 8 i8* @foo()
define void @bar() {
%a = tail call align 8 i8* @foo() ; getPointerAlignment returns 8
%b = tail call i8* @foo() ; getPointerAlignemnt returns 0
ret void
}
```
This patch will fix the problem.
Reviewers: jdoerfert
Reviewed By: jdoerfert
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65281
llvm-svn: 367185
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/Value.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index 6a743b708f9..c0efab4a35d 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -723,9 +723,11 @@ unsigned Value::getPointerAlignment(const DataLayout &DL) const { if (AllocatedType->isSized()) Align = DL.getPrefTypeAlignment(AllocatedType); } - } else if (const auto *Call = dyn_cast<CallBase>(this)) - Align = Call->getAttributes().getRetAlignment(); - else if (const LoadInst *LI = dyn_cast<LoadInst>(this)) + } else if (const auto *Call = dyn_cast<CallBase>(this)) { + Align = Call->getRetAlignment(); + if (Align == 0 && Call->getCalledFunction()) + Align = Call->getCalledFunction()->getAttributes().getRetAlignment(); + } else if (const LoadInst *LI = dyn_cast<LoadInst>(this)) if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) { ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0)); Align = CI->getLimitedValue(); |