Blame llvm-D9168_argument_alignment.patch

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]);