diff options
author | Justin Holewinski <jholewinski@nvidia.com> | 2013-11-11 19:28:19 +0000 |
---|---|---|
committer | Justin Holewinski <jholewinski@nvidia.com> | 2013-11-11 19:28:19 +0000 |
commit | 07a5d3dc3d99ad2bf5c1122787d37ec0e17adde6 (patch) | |
tree | 130813e190812f7253c57d4f16ce1a1dc21d77e7 /lib | |
parent | 0df3ce333b90cb42ee190a80b310ba89ff4cbeb3 (diff) | |
download | external_llvm-07a5d3dc3d99ad2bf5c1122787d37ec0e17adde6.zip external_llvm-07a5d3dc3d99ad2bf5c1122787d37ec0e17adde6.tar.gz external_llvm-07a5d3dc3d99ad2bf5c1122787d37ec0e17adde6.tar.bz2 |
[NVPTX] Properly handle bitcast ConstantExpr when checking for the alignment of function parameters
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194410 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/NVPTX/NVPTXISelLowering.cpp | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/lib/Target/NVPTX/NVPTXISelLowering.cpp b/lib/Target/NVPTX/NVPTXISelLowering.cpp index 55caaad..98b9ce6 100644 --- a/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -471,22 +471,47 @@ NVPTXTargetLowering::getArgumentAlignment(SDValue Callee, Type *Ty, unsigned Idx) const { const DataLayout *TD = getDataLayout(); - unsigned align = 0; - GlobalAddressSDNode *Func = dyn_cast<GlobalAddressSDNode>(Callee.getNode()); + unsigned Align = 0; + const Value *DirectCallee = CS->getCalledFunction(); + + if (!DirectCallee) { + // We don't have a direct function symbol, but that may be because of + // constant cast instructions in the call. + const Instruction *CalleeI = CS->getInstruction(); + assert(CalleeI && "Call target is not a function or derived value?"); + + // With bitcast'd call targets, the instruction will be the call + if (isa<CallInst>(CalleeI)) { + // Check if we have call alignment metadata + if (llvm::getAlign(*cast<CallInst>(CalleeI), Idx, Align)) + return Align; + + const Value *CalleeV = cast<CallInst>(CalleeI)->getCalledValue(); + // Ignore any bitcast instructions + while(isa<ConstantExpr>(CalleeV)) { + const ConstantExpr *CE = cast<ConstantExpr>(CalleeV); + if (!CE->isCast()) + break; + // Look through the bitcast + CalleeV = cast<ConstantExpr>(CalleeV)->getOperand(0); + } - if (Func) { // direct call - assert(CS->getCalledFunction() && - "direct call cannot find callee"); - if (!llvm::getAlign(*(CS->getCalledFunction()), Idx, align)) - align = TD->getABITypeAlignment(Ty); - } - else { // indirect call - const CallInst *CallI = dyn_cast<CallInst>(CS->getInstruction()); - if (!llvm::getAlign(*CallI, Idx, align)) - align = TD->getABITypeAlignment(Ty); + // We have now looked past all of the bitcasts. Do we finally have a + // Function? + if (isa<Function>(CalleeV)) + DirectCallee = CalleeV; + } } - return align; + // Check for function alignment information if we found that the + // ultimate target is a Function + if (DirectCallee) + if (llvm::getAlign(*cast<Function>(DirectCallee), Idx, Align)) + return Align; + + // Call is indirect or alignment information is not available, fall back to + // the ABI type alignment + return TD->getABITypeAlignment(Ty); } SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, |