PTX: Start fixing function calls
authorJustin Holewinski <justin.holewinski@gmail.com>
Fri, 23 Sep 2011 14:31:12 +0000 (14:31 +0000)
committerJustin Holewinski <justin.holewinski@gmail.com>
Fri, 23 Sep 2011 14:31:12 +0000 (14:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140378 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PTX/PTXAsmPrinter.cpp
lib/Target/PTX/PTXISelLowering.cpp
test/CodeGen/PTX/simple-call.ll

index 06cab0bc79132d01c56610778eec821072e488ed..77164cac881573e26242e303fd5281267ca87b85 100644 (file)
@@ -222,6 +222,7 @@ void PTXAsmPrinter::EmitFunctionBodyStart() {
   OutStreamer.EmitRawText(Twine("{"));
 
   const PTXMachineFunctionInfo *MFI = MF->getInfo<PTXMachineFunctionInfo>();
+  const PTXParamManager &PM = MFI->getParamManager();
 
   // Print register definitions
   std::string regDefs;
@@ -275,6 +276,16 @@ void PTXAsmPrinter::EmitFunctionBodyStart() {
     regDefs += ">;\n";
   }
 
+  // Local params
+  for (PTXParamManager::param_iterator i = PM.local_begin(), e = PM.local_end();
+       i != e; ++i) {
+    regDefs += "\t.param .b";
+    regDefs += utostr(PM.getParamSize(*i));
+    regDefs += " ";
+    regDefs += PM.getParamName(*i);
+    regDefs += ";\n";
+  }
+
   OutStreamer.EmitRawText(Twine(regDefs));
 
 
@@ -677,7 +688,7 @@ printCall(const MachineInstr *MI, raw_ostream &O) {
   for (unsigned i = 3; i < MI->getNumOperands(); ++i) {
     //const MachineOperand& MO = MI->getOperand(i);
 
-    printReturnOperand(MI, i, O);
+    printParamOperand(MI, i, O);
     if (i < MI->getNumOperands()-1) {
       O << ", ";
     }
index 79967280344d44ca62e7910c837b5a1ca4e59592..3fdfcdf57498e3da133624b7b634ff7f10e282ad 100644 (file)
@@ -435,6 +435,7 @@ PTXTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
 
   MachineFunction& MF = DAG.getMachineFunction();
   PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
+  PTXParamManager &PM = MFI->getParamManager();
 
   assert(getTargetMachine().getSubtarget<PTXSubtarget>().callsAreHandled() &&
          "Calls are not handled for the target device");
@@ -454,7 +455,8 @@ PTXTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
 
   for (unsigned i = 0; i != OutVals.size(); ++i) {
     unsigned Size = OutVals[i].getValueType().getSizeInBits();
-    SDValue Index = DAG.getTargetConstant(MFI->getNextParam(Size), MVT::i32);
+    unsigned Param = PM.addLocalParam(Size);
+    SDValue Index = DAG.getTargetConstant(Param, MVT::i32);
     Chain = DAG.getNode(PTXISD::STORE_PARAM, dl, MVT::Other, Chain,
                         Index, OutVals[i]);
     ops[i+2] = Index;
index 1647075e5e87d1b0fef0bc9d015b71b057a5ffc3..1e980655d3e629eb2517ccda97a9e1f5658bc378 100644 (file)
@@ -1,5 +1,4 @@
 ; RUN: llc < %s -march=ptx32 -mattr=sm20 | FileCheck %s
-; XFAIL: *
 
 define ptx_device void @test_add(float %x, float %y) {
 ; CHECK: ret;
@@ -9,7 +8,7 @@ define ptx_device void @test_add(float %x, float %y) {
 
 define ptx_device float @test_call(float %x, float %y) {
   %a = fadd float %x, %y
-; CHECK: call.uni test_add, (__ret_{{[0-9]+}}, __ret_{{[0-9]+}});
+; CHECK: call.uni test_add, (__localparam_{{[0-9]+}}, __localparam_{{[0-9]+}});
   call void @test_add(float %a, float %y)
   ret float %a
 }