mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-13 16:03:55 +00:00
[NVPTX] Check if callsite is defined when computing argument allignment
Summary: In getArgumentAlignment check if the ImmutableCallSite pointer CS is non-null before dereferencing. If CS is 0x0 fall back to the ABI type alignment else compute the alignment as before. Reviewers: eliben, jpienaar Subscribers: jlebar, vchuravy, cfe-commits, jholewinski Differential Revision: https://reviews.llvm.org/D9168 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2a546868cb
commit
1d75557110
@ -1024,11 +1024,15 @@ std::string NVPTXTargetLowering::getPrototype(
|
||||
return O.str();
|
||||
}
|
||||
|
||||
unsigned
|
||||
NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
|
||||
const ImmutableCallSite *CS,
|
||||
Type *Ty,
|
||||
unsigned Idx) const {
|
||||
unsigned NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
|
||||
const ImmutableCallSite *CS,
|
||||
Type *Ty, unsigned Idx,
|
||||
const DataLayout &DL) const {
|
||||
if (!CS) {
|
||||
// CallSite is zero, fallback to ABI type alignment
|
||||
return DL.getABITypeAlignment(Ty);
|
||||
}
|
||||
|
||||
unsigned Align = 0;
|
||||
const Value *DirectCallee = CS->getCalledFunction();
|
||||
|
||||
@ -1046,7 +1050,7 @@ NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
|
||||
|
||||
const Value *CalleeV = cast<CallInst>(CalleeI)->getCalledValue();
|
||||
// Ignore any bitcast instructions
|
||||
while(isa<ConstantExpr>(CalleeV)) {
|
||||
while (isa<ConstantExpr>(CalleeV)) {
|
||||
const ConstantExpr *CE = cast<ConstantExpr>(CalleeV);
|
||||
if (!CE->isCast())
|
||||
break;
|
||||
@ -1069,7 +1073,6 @@ NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
|
||||
|
||||
// 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 +1129,8 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
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 <align> .b8 .param<n>[<size>];
|
||||
unsigned sz = DL.getTypeAllocSize(Ty);
|
||||
SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
|
||||
@ -1166,7 +1170,8 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
}
|
||||
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 <align> .b8 .param<n>[<size>];
|
||||
unsigned sz = DL.getTypeAllocSize(Ty);
|
||||
SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
|
||||
@ -1426,7 +1431,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
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 +1638,10 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
} else {
|
||||
SmallVector<EVT, 16> VTs;
|
||||
SmallVector<uint64_t, 16> 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]);
|
||||
|
@ -539,7 +539,8 @@ private:
|
||||
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
|
||||
|
||||
|
10
test/CodeGen/NVPTX/zero-cs.ll
Normal file
10
test/CodeGen/NVPTX/zero-cs.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; RUN: not llc < %s -march=nvptx 2>&1 | FileCheck %s
|
||||
; used to seqfault and now fails with a "Cannot select"
|
||||
|
||||
; 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
|
Loading…
x
Reference in New Issue
Block a user