|
Orion Poplawski |
ec1ad97 |
Index: lib/Target/NVPTX/NVPTXISelLowering.h
|
|
Orion Poplawski |
ec1ad97 |
===================================================================
|
|
Orion Poplawski |
ec1ad97 |
--- a/lib/Target/NVPTX/NVPTXISelLowering.h
|
|
Orion Poplawski |
ec1ad97 |
+++ b/lib/Target/NVPTX/NVPTXISelLowering.h
|
|
Orion Poplawski |
ec1ad97 |
@@ -539,7 +539,8 @@
|
|
Orion Poplawski |
ec1ad97 |
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
unsigned getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS,
|
|
Orion Poplawski |
ec1ad97 |
- Type *Ty, unsigned Idx) const;
|
|
Orion Poplawski |
ec1ad97 |
+ Type *Ty, unsigned Idx,
|
|
Orion Poplawski |
ec1ad97 |
+ const DataLayout &DL) const;
|
|
Orion Poplawski |
ec1ad97 |
};
|
|
Orion Poplawski |
ec1ad97 |
} // namespace llvm
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
Index: lib/Target/NVPTX/NVPTXISelLowering.cpp
|
|
Orion Poplawski |
ec1ad97 |
===================================================================
|
|
Orion Poplawski |
ec1ad97 |
--- a/lib/Target/NVPTX/NVPTXISelLowering.cpp
|
|
Orion Poplawski |
ec1ad97 |
+++ b/lib/Target/NVPTX/NVPTXISelLowering.cpp
|
|
Orion Poplawski |
ec1ad97 |
@@ -1024,11 +1024,15 @@
|
|
Orion Poplawski |
ec1ad97 |
return O.str();
|
|
Orion Poplawski |
ec1ad97 |
}
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
-unsigned
|
|
Orion Poplawski |
ec1ad97 |
-NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
|
|
Orion Poplawski |
ec1ad97 |
- const ImmutableCallSite *CS,
|
|
Orion Poplawski |
ec1ad97 |
- Type *Ty,
|
|
Orion Poplawski |
ec1ad97 |
- unsigned Idx) const {
|
|
Orion Poplawski |
ec1ad97 |
+unsigned NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
|
|
Orion Poplawski |
ec1ad97 |
+ const ImmutableCallSite *CS,
|
|
Orion Poplawski |
ec1ad97 |
+ Type *Ty, unsigned Idx,
|
|
Orion Poplawski |
ec1ad97 |
+ const DataLayout &DL) const {
|
|
Orion Poplawski |
ec1ad97 |
+ if (!CS) {
|
|
Orion Poplawski |
ec1ad97 |
+ // CallSite is zero, fallback to ABI type alignment
|
|
Orion Poplawski |
ec1ad97 |
+ return DL.getABITypeAlignment(Ty);
|
|
Orion Poplawski |
ec1ad97 |
+ }
|
|
Orion Poplawski |
ec1ad97 |
+
|
|
Orion Poplawski |
ec1ad97 |
unsigned Align = 0;
|
|
Orion Poplawski |
ec1ad97 |
const Value *DirectCallee = CS->getCalledFunction();
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
@@ -1046,7 +1050,7 @@
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
const Value *CalleeV = cast<CallInst>(CalleeI)->getCalledValue();
|
|
Orion Poplawski |
ec1ad97 |
// Ignore any bitcast instructions
|
|
Orion Poplawski |
ec1ad97 |
- while(isa<ConstantExpr>(CalleeV)) {
|
|
Orion Poplawski |
ec1ad97 |
+ while (isa<ConstantExpr>(CalleeV)) {
|
|
Orion Poplawski |
ec1ad97 |
const ConstantExpr *CE = cast<ConstantExpr>(CalleeV);
|
|
Orion Poplawski |
ec1ad97 |
if (!CE->isCast())
|
|
Orion Poplawski |
ec1ad97 |
break;
|
|
Orion Poplawski |
ec1ad97 |
@@ -1069,7 +1073,6 @@
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
// Call is indirect or alignment information is not available, fall back to
|
|
Orion Poplawski |
ec1ad97 |
// the ABI type alignment
|
|
Orion Poplawski |
ec1ad97 |
- auto &DL = CS->getCaller()->getParent()->getDataLayout();
|
|
Orion Poplawski |
ec1ad97 |
return DL.getABITypeAlignment(Ty);
|
|
Orion Poplawski |
ec1ad97 |
}
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
@@ -1126,7 +1129,8 @@
|
|
Orion Poplawski |
ec1ad97 |
ComputePTXValueVTs(*this, DAG.getDataLayout(), Ty, vtparts, &Offsets,
|
|
Orion Poplawski |
ec1ad97 |
0);
|
|
Orion Poplawski |
ec1ad97 |
|
|
Orion Poplawski |
ec1ad97 |
- unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1);
|
|
Orion Poplawski |
ec1ad97 |
+ unsigned align =
|
|
Orion Poplawski |
ec1ad97 |
+ getArgumentAlignment(Callee, CS, Ty, paramCount + 1, DL);
|
|
Orion Poplawski |
ec1ad97 |
// declare .param .align <align> .b8 .param<n>[<size>];
|
|
Orion Poplawski |
ec1ad97 |
unsigned sz = DL.getTypeAllocSize(Ty);
|
|
Orion Poplawski |
ec1ad97 |
SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
|
|
Orion Poplawski |
ec1ad97 |
@@ -1166,7 +1170,8 @@
|
|
Orion Poplawski |
ec1ad97 |
}
|
|
Orion Poplawski |
ec1ad97 |
if (Ty->isVectorTy()) {
|
|
Orion Poplawski |
ec1ad97 |
EVT ObjectVT = getValueType(DL, Ty);
|
|
Orion Poplawski |
ec1ad97 |
- unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1);
|
|
Orion Poplawski |
ec1ad97 |
+ unsigned align =
|
|
Orion Poplawski |
ec1ad97 |
+ getArgumentAlignment(Callee, CS, Ty, paramCount + 1, DL);
|
|
Orion Poplawski |
ec1ad97 |
// declare .param .align <align> .b8 .param<n>[<size>];
|
|
Orion Poplawski |
ec1ad97 |
unsigned sz = DL.getTypeAllocSize(Ty);
|
|
Orion Poplawski |
ec1ad97 |
SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
|
|
Orion Poplawski |
ec1ad97 |
@@ -1426,7 +1431,7 @@
|
|
Orion Poplawski |
ec1ad97 |
DeclareRetOps);
|
|
Orion Poplawski |
ec1ad97 |
InFlag = Chain.getValue(1);
|
|
Orion Poplawski |
ec1ad97 |
} else {
|
|
Orion Poplawski |
ec1ad97 |
- retAlignment = getArgumentAlignment(Callee, CS, retTy, 0);
|
|
Orion Poplawski |
ec1ad97 |
+ retAlignment = getArgumentAlignment(Callee, CS, retTy, 0, DL);
|
|
Orion Poplawski |
ec1ad97 |
SDVTList DeclareRetVTs = DAG.getVTList(MVT::Other, MVT::Glue);
|
|
Orion Poplawski |
ec1ad97 |
SDValue DeclareRetOps[] = { Chain,
|
|
Orion Poplawski |
ec1ad97 |
DAG.getConstant(retAlignment, dl, MVT::i32),
|
|
Orion Poplawski |
ec1ad97 |
@@ -1633,9 +1638,10 @@
|
|
Orion Poplawski |
ec1ad97 |
} else {
|
|
Orion Poplawski |
ec1ad97 |
SmallVector<EVT, 16> VTs;
|
|
Orion Poplawski |
ec1ad97 |
SmallVector<uint64_t, 16> Offsets;
|
|
Orion Poplawski |
ec1ad97 |
- ComputePTXValueVTs(*this, DAG.getDataLayout(), retTy, VTs, &Offsets, 0);
|
|
Orion Poplawski |
ec1ad97 |
+ auto &DL = DAG.getDataLayout();
|
|
Orion Poplawski |
ec1ad97 |
+ ComputePTXValueVTs(*this, DL, retTy, VTs, &Offsets, 0);
|
|
Orion Poplawski |
ec1ad97 |
assert(VTs.size() == Ins.size() && "Bad value decomposition");
|
|
Orion Poplawski |
ec1ad97 |
- unsigned RetAlign = getArgumentAlignment(Callee, CS, retTy, 0);
|
|
Orion Poplawski |
ec1ad97 |
+ unsigned RetAlign = getArgumentAlignment(Callee, CS, retTy, 0, DL);
|
|
Orion Poplawski |
ec1ad97 |
for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
|
|
Orion Poplawski |
ec1ad97 |
unsigned sz = VTs[i].getSizeInBits();
|
|
Orion Poplawski |
ec1ad97 |
unsigned AlignI = GreatestCommonDivisor64(RetAlign, Offsets[i]);
|