Index: lib/Target/NVPTX/NVPTXISelLowering.h =================================================================== --- lib/Target/NVPTX/NVPTXISelLowering.h +++ lib/Target/NVPTX/NVPTXISelLowering.h @@ -539,7 +539,7 @@ SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override; unsigned getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS, - Type *Ty, unsigned Idx) const; + Type *Ty, unsigned Idx, const DataLayout &DL) const; }; } // namespace llvm Index: lib/Target/NVPTX/NVPTXISelLowering.cpp =================================================================== --- lib/Target/NVPTX/NVPTXISelLowering.cpp +++ lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -1028,48 +1028,50 @@ NVPTXTargetLowering::getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS, Type *Ty, - unsigned Idx) const { - 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(CalleeI)) { - // Check if we have call alignment metadata - if (llvm::getAlign(*cast(CalleeI), Idx, Align)) - return Align; + unsigned Idx, + const DataLayout &DL) const { + if (CS) { + 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(CalleeI)) { + // Check if we have call alignment metadata + if (llvm::getAlign(*cast(CalleeI), Idx, Align)) + return Align; + + const Value *CalleeV = cast(CalleeI)->getCalledValue(); + // Ignore any bitcast instructions + while(isa(CalleeV)) { + const ConstantExpr *CE = cast(CalleeV); + if (!CE->isCast()) + break; + // Look through the bitcast + CalleeV = cast(CalleeV)->getOperand(0); + } - const Value *CalleeV = cast(CalleeI)->getCalledValue(); - // Ignore any bitcast instructions - while(isa(CalleeV)) { - const ConstantExpr *CE = cast(CalleeV); - if (!CE->isCast()) - break; - // Look through the bitcast - CalleeV = cast(CalleeV)->getOperand(0); + // We have now looked past all of the bitcasts. Do we finally have a + // Function? + if (isa(CalleeV)) + DirectCallee = CalleeV; } - - // We have now looked past all of the bitcasts. Do we finally have a - // Function? - if (isa(CalleeV)) - DirectCallee = CalleeV; } - } - // Check for function alignment information if we found that the - // ultimate target is a Function - if (DirectCallee) - if (llvm::getAlign(*cast(DirectCallee), Idx, Align)) - return Align; + // Check for function alignment information if we found that the + // ultimate target is a Function + if (DirectCallee) + if (llvm::getAlign(*cast(DirectCallee), Idx, Align)) + return Align; + } // Call is indirect or alignment information is not available, fall back to // the ABI type alignment - auto &DL = CS->getCaller()->getParent()->getDataLayout(); return DL.getABITypeAlignment(Ty); } @@ -1126,7 +1128,7 @@ ComputePTXValueVTs(*this, DAG.getDataLayout(), Ty, vtparts, &Offsets, 0); - unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1); + unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1, DL); // declare .param .align .b8 .param[]; unsigned sz = DL.getTypeAllocSize(Ty); SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue); @@ -1166,7 +1168,7 @@ } if (Ty->isVectorTy()) { EVT ObjectVT = getValueType(DL, Ty); - unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1); + unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1, DL); // declare .param .align .b8 .param[]; unsigned sz = DL.getTypeAllocSize(Ty); SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue); @@ -1426,7 +1428,7 @@ DeclareRetOps); InFlag = Chain.getValue(1); } else { - retAlignment = getArgumentAlignment(Callee, CS, retTy, 0); + retAlignment = getArgumentAlignment(Callee, CS, retTy, 0, DL); SDVTList DeclareRetVTs = DAG.getVTList(MVT::Other, MVT::Glue); SDValue DeclareRetOps[] = { Chain, DAG.getConstant(retAlignment, dl, MVT::i32), @@ -1633,9 +1635,10 @@ } else { SmallVector VTs; SmallVector Offsets; - ComputePTXValueVTs(*this, DAG.getDataLayout(), retTy, VTs, &Offsets, 0); + auto &DL = DAG.getDataLayout(); + ComputePTXValueVTs(*this, DL, retTy, VTs, &Offsets, 0); assert(VTs.size() == Ins.size() && "Bad value decomposition"); - unsigned RetAlign = getArgumentAlignment(Callee, CS, retTy, 0); + unsigned RetAlign = getArgumentAlignment(Callee, CS, retTy, 0, DL); for (unsigned i = 0, e = Ins.size(); i != e; ++i) { unsigned sz = VTs[i].getSizeInBits(); unsigned AlignI = GreatestCommonDivisor64(RetAlign, Offsets[i]); Index: test/CodeGen/NVPTX/zero-cs.ll =================================================================== --- /dev/null +++ test/CodeGen/NVPTX/zero-cs.ll @@ -0,0 +1,9 @@ +; RUN: not llc < %s -march=nvptx 2>&1 | FileCheck %s + +; CHECK: LLVM ERROR: Cannot select: t7: i32 = ExternalSymbol'__powidf2' +define double @powi() { + %1 = call double @llvm.powi.f64(double 1.000000e+00, i32 undef) + ret double %1 +} + +declare double @llvm.powi.f64(double, i32) nounwind readnone