[llvm-commits] [llvm] r140616 - in /llvm/trunk/lib/Target/PTX: PTXAsmPrinter.cpp PTXISelDAGToDAG.cpp PTXISelLowering.cpp PTXInstrLoadStore.td PTXMachineFunctionInfo.h PTXRegisterInfo.cpp

Justin Holewinski justin.holewinski at gmail.com
Tue Sep 27 11:12:55 PDT 2011


Author: jholewinski
Date: Tue Sep 27 13:12:55 2011
New Revision: 140616

URL: http://llvm.org/viewvc/llvm-project?rev=140616&view=rev
Log:
PTX: Use external symbols to keep track of params and locals. This also fixes
a couple of outstanding issues with frame objects occuring as instruction
operands.

Modified:
    llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp
    llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp
    llvm/trunk/lib/Target/PTX/PTXISelLowering.cpp
    llvm/trunk/lib/Target/PTX/PTXInstrLoadStore.td
    llvm/trunk/lib/Target/PTX/PTXMachineFunctionInfo.h
    llvm/trunk/lib/Target/PTX/PTXRegisterInfo.cpp

Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp?rev=140616&r1=140615&r2=140616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Tue Sep 27 13:12:55 2011
@@ -66,10 +66,6 @@
   void printOperand(const MachineInstr *MI, int opNum, raw_ostream &OS);
   void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &OS,
                        const char *Modifier = 0);
-  void printParamOperand(const MachineInstr *MI, int opNum, raw_ostream &OS,
-                         const char *Modifier = 0);
-  void printLocalOperand(const MachineInstr *MI, int opNum, raw_ostream &OS,
-                         const char *Modifier = 0);
   void printReturnOperand(const MachineInstr *MI, int opNum, raw_ostream &OS,
                           const char *Modifier = 0);
   void printPredicateOperand(const MachineInstr *MI, raw_ostream &O);
@@ -415,6 +411,9 @@
     case MachineOperand::MO_Register:
       OS << MFI->getRegisterName(MO.getReg());
       break;
+    case MachineOperand::MO_ExternalSymbol:
+      OS << MO.getSymbolName();
+      break;
     case MachineOperand::MO_FPImmediate:
       APInt constFP = MO.getFPImm()->getValueAPF().bitcastToAPInt();
       bool  isFloat = MO.getFPImm()->getType()->getTypeID() == Type::FloatTyID;
@@ -451,29 +450,12 @@
   printOperand(MI, opNum+1, OS);
 }
 
-void PTXAsmPrinter::printParamOperand(const MachineInstr *MI, int opNum,
-                                      raw_ostream &OS, const char *Modifier) {
-  const PTXMachineFunctionInfo *MFI = MI->getParent()->getParent()->
-                                      getInfo<PTXMachineFunctionInfo>();
-  OS << MFI->getParamManager().getParamName(MI->getOperand(opNum).getImm());
-}
-
 void PTXAsmPrinter::printReturnOperand(const MachineInstr *MI, int opNum,
                                        raw_ostream &OS, const char *Modifier) {
   //OS << RETURN_PREFIX << (int) MI->getOperand(opNum).getImm() + 1;
   OS << "__ret";
 }
 
-void PTXAsmPrinter::printLocalOperand(const MachineInstr *MI, int opNum,
-                                      raw_ostream &OS, const char *Modifier) {
-  OS << "__local" << MI->getOperand(opNum).getImm();
-
-  if (MI->getOperand(opNum+1).isImm() && MI->getOperand(opNum+1).getImm() != 0){
-    OS << "+";
-    printOperand(MI, opNum+1, OS);
-  }
-}
-
 void PTXAsmPrinter::EmitVariableDeclaration(const GlobalVariable *gv) {
   // Check to see if this is a special global used by LLVM, if so, emit it.
   if (EmitSpecialLLVMGlobal(gv))
@@ -702,7 +684,7 @@
     } else {
       O << ", ";
     }
-    printParamOperand(MI, Index, O);
+    printOperand(MI, Index, O);
     Index++;
   }
 
@@ -718,7 +700,7 @@
   Index++;
 
   while (Index < MI->getNumOperands()) {
-    printParamOperand(MI, Index, O);
+    printOperand(MI, Index, O);
     if (Index < MI->getNumOperands()-1) {
       O << ", ";
     }

Modified: llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp?rev=140616&r1=140615&r2=140616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp Tue Sep 27 13:12:55 2011
@@ -12,7 +12,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "PTX.h"
+#include "PTXMachineFunctionInfo.h"
 #include "PTXTargetMachine.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/CodeGen/SelectionDAGISel.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Support/Debug.h"
@@ -180,20 +182,14 @@
 SDNode *PTXDAGToDAGISel::SelectFrameIndex(SDNode *Node) {
   int FI = cast<FrameIndexSDNode>(Node)->getIndex();
   //dbgs() << "Selecting FrameIndex at index " << FI << "\n";
-  SDValue TFI = CurDAG->getTargetFrameIndex(FI, Node->getValueType(0));
+  //SDValue TFI = CurDAG->getTargetFrameIndex(FI, Node->getValueType(0));
 
-  //unsigned OpCode = PTX::LOAD_LOCAL_F32;
+  PTXMachineFunctionInfo *MFI = MF->getInfo<PTXMachineFunctionInfo>();
 
-  //for (SDNode::use_iterator i = Node->use_begin(), e = Node->use_end();
-  //     i != e; ++i) {
-  //  SDNode *Use = *i;
-  //  dbgs() << "USE: ";
-  //  Use->dumpr(CurDAG);
-  //}
-
-  return Node;
-  //return CurDAG->getMachineNode(OpCode, Node->getDebugLoc(),
-  //                              Node->getValueType(0), TFI);
+  SDValue FrameSymbol = CurDAG->getTargetExternalSymbol(MFI->getFrameSymbol(FI),
+                                                        Node->getValueType(0));
+
+  return FrameSymbol.getNode();
 }
 
 // Match memory operand of the form [reg+reg]

Modified: llvm/trunk/lib/Target/PTX/PTXISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXISelLowering.cpp?rev=140616&r1=140615&r2=140616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXISelLowering.cpp Tue Sep 27 13:12:55 2011
@@ -225,8 +225,11 @@
 
       unsigned ParamSize = Ins[i].VT.getStoreSizeInBits();
       unsigned Param = PM.addArgumentParam(ParamSize);
+      std::string ParamName = PM.getParamName(Param);
+      SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(),
+                                                       MVT::Other);
       SDValue ArgValue = DAG.getNode(PTXISD::LOAD_PARAM, dl, Ins[i].VT, Chain,
-                                     DAG.getTargetConstant(Param, MVT::i32));
+                                     ParamValue);
       InVals.push_back(ArgValue);
     }
   }
@@ -319,9 +322,11 @@
     if (Outs.size() == 1) {
       unsigned ParamSize = OutVals[0].getValueType().getSizeInBits();
       unsigned Param = PM.addReturnParam(ParamSize);
-      SDValue ParamIndex = DAG.getTargetConstant(Param, MVT::i32);
+      std::string ParamName = PM.getParamName(Param);
+      SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(),
+                                                       MVT::Other);
       Chain = DAG.getNode(PTXISD::STORE_PARAM, dl, MVT::Other, Chain,
-                          ParamIndex, OutVals[0]);
+                          ParamValue, OutVals[0]);
     }
   } else {
     for (unsigned i = 0, e = Outs.size(); i != e; ++i) {
@@ -414,21 +419,25 @@
   for (unsigned i = 0; i != OutVals.size(); ++i) {
     unsigned Size = OutVals[i].getValueType().getSizeInBits();
     unsigned Param = PM.addLocalParam(Size);
-    SDValue Index = DAG.getTargetConstant(Param, MVT::i32);
+    std::string ParamName = PM.getParamName(Param);
+    SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(),
+                                                     MVT::Other);
     Chain = DAG.getNode(PTXISD::STORE_PARAM, dl, MVT::Other, Chain,
-                        Index, OutVals[i]);
-    Ops[i+Ins.size()+2] = Index;
+                        ParamValue, OutVals[i]);
+    Ops[i+Ins.size()+2] = ParamValue;
   }
 
-  std::vector<unsigned> InParams;
+  std::vector<SDValue> InParams;
 
   // Generate list of .param variables to hold the return value(s).
   for (unsigned i = 0; i < Ins.size(); ++i) {
     unsigned Size = Ins[i].VT.getStoreSizeInBits();
     unsigned Param = PM.addLocalParam(Size);
-    SDValue Index = DAG.getTargetConstant(Param, MVT::i32);
-    Ops[i+1] = Index;
-    InParams.push_back(Param);
+    std::string ParamName = PM.getParamName(Param);
+    SDValue ParamValue = DAG.getTargetExternalSymbol(ParamName.c_str(),
+                                                     MVT::Other);
+    Ops[i+1] = ParamValue;
+    InParams.push_back(ParamValue);
   }
 
   Ops[0] = Chain;
@@ -438,8 +447,8 @@
 
   // Create the LOAD_PARAM nodes that retrieve the function return value(s).
   for (unsigned i = 0; i < Ins.size(); ++i) {
-    SDValue Index = DAG.getTargetConstant(InParams[i], MVT::i32);
-    SDValue Load = DAG.getNode(PTXISD::LOAD_PARAM, dl, Ins[i].VT, Chain, Index);
+    SDValue Load = DAG.getNode(PTXISD::LOAD_PARAM, dl, Ins[i].VT, Chain,
+                               InParams[i]);
     InVals.push_back(Load);
   }
 

Modified: llvm/trunk/lib/Target/PTX/PTXInstrLoadStore.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXInstrLoadStore.td?rev=140616&r1=140615&r2=140616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXInstrLoadStore.td (original)
+++ llvm/trunk/lib/Target/PTX/PTXInstrLoadStore.td Tue Sep 27 13:12:55 2011
@@ -88,12 +88,12 @@
   let MIOperandInfo = (ops RegI64, i64imm);
 }
 def LOCALri32 : Operand<i32> {
-  let PrintMethod = "printLocalOperand";
-  let MIOperandInfo = (ops RegI32, i32imm);
+  let PrintMethod = "printMemOperand";
+  let MIOperandInfo = (ops i32imm, i32imm);
 }
 def LOCALri64 : Operand<i64> {
-  let PrintMethod = "printLocalOperand";
-  let MIOperandInfo = (ops RegI64, i64imm);
+  let PrintMethod = "printMemOperand";
+  let MIOperandInfo = (ops i64imm, i64imm);
 }
 def MEMii32 : Operand<i32> {
   let PrintMethod = "printMemOperand";
@@ -117,7 +117,7 @@
 
 // Load/store .param space
 def PTXloadparam
-  : SDNode<"PTXISD::LOAD_PARAM", SDTypeProfile<1, 1, [SDTCisVT<1, i32>]>,
+  : SDNode<"PTXISD::LOAD_PARAM", SDTypeProfile<1, 1, [SDTCisPtrTy<1>]>,
            [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue]>;
 def PTXstoreparam
   : SDNode<"PTXISD::STORE_PARAM", SDTypeProfile<0, 2, [SDTCisVT<0, i32>]>,
@@ -220,12 +220,12 @@
 
 multiclass PTX_PARAM_LD_ST<string typestr, RegisterClass RC> {
   let hasSideEffects = 1 in {
-  def LDpi : InstPTX<(outs RC:$d), (ins MEMpi:$a),
+  def LDpi : InstPTX<(outs RC:$d), (ins i32imm:$a),
                      !strconcat("ld.param", !strconcat(typestr, "\t$d, [$a]")),
-                     [(set RC:$d, (PTXloadparam timm:$a))]>;
-  def STpi : InstPTX<(outs), (ins MEMpi:$d, RC:$a),
+                     [(set RC:$d, (PTXloadparam texternalsym:$a))]>;
+  def STpi : InstPTX<(outs), (ins i32imm:$d, RC:$a),
                      !strconcat("st.param", !strconcat(typestr, "\t[$d], $a")),
-                     [(PTXstoreparam timm:$d, RC:$a)]>;
+                     [(PTXstoreparam texternalsym:$d, RC:$a)]>;
   }
 }
 

Modified: llvm/trunk/lib/Target/PTX/PTXMachineFunctionInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXMachineFunctionInfo.h?rev=140616&r1=140615&r2=140616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXMachineFunctionInfo.h (original)
+++ llvm/trunk/lib/Target/PTX/PTXMachineFunctionInfo.h Tue Sep 27 13:12:55 2011
@@ -38,9 +38,11 @@
   typedef std::vector<unsigned> RegisterList;
   typedef DenseMap<const TargetRegisterClass*, RegisterList> RegisterMap;
   typedef DenseMap<unsigned, std::string> RegisterNameMap;
+  typedef DenseMap<int, std::string> FrameMap;
 
   RegisterMap UsedRegs;
   RegisterNameMap RegNames;
+  FrameMap FrameSymbols;
 
   PTXParamManager ParamManager;
 
@@ -141,6 +143,21 @@
     return UsedRegs.lookup(TRC).size();
   }
 
+  /// getFrameSymbol - Returns the symbol name for the given FrameIndex.
+  const char* getFrameSymbol(int FrameIndex) {
+    if (FrameSymbols.count(FrameIndex)) {
+      return FrameSymbols.lookup(FrameIndex).c_str();
+    } else {
+      std::string Name = "__local";
+      Name += utostr(FrameIndex);
+      // The whole point of caching this name is to ensure the pointer we pass
+      // to any getExternalSymbol() calls will remain valid for the lifetime of
+      // the back-end instance. This is to work around an issue in SelectionDAG
+      // where symbol names are expected to be life-long strings.
+      FrameSymbols[FrameIndex] = Name;
+      return FrameSymbols[FrameIndex].c_str();
+    }
+  }
 }; // class PTXMachineFunctionInfo
 } // namespace llvm
 

Modified: llvm/trunk/lib/Target/PTX/PTXRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXRegisterInfo.cpp?rev=140616&r1=140615&r2=140616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXRegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXRegisterInfo.cpp Tue Sep 27 13:12:55 2011
@@ -42,6 +42,8 @@
 
   //unsigned Reg = MRI.createVirtualRegister(PTX::RegF32RegisterClass);
 
+  llvm_unreachable("FrameIndex should have been previously eliminated!");
+
   Index = 0;
   while (!MI.getOperand(Index).isFI()) {
     ++Index;
@@ -63,7 +65,10 @@
   //}
   //MI2->dump();
 
+  //MachineOperand ESOp = MachineOperand::CreateES("__local__");
+
   // This frame index is post stack slot re-use assignments
   //MI.getOperand(Index).ChangeToRegister(Reg, false);
   MI.getOperand(Index).ChangeToImmediate(FrameIndex);
+  //MI.getOperand(Index) = ESOp;
 }





More information about the llvm-commits mailing list