From a9296ae71b045f818fa02de23efbfb6eec4fc54a Mon Sep 17 00:00:00 2001 From: Prakalp Srivastava <psrivas2@illinois.edu> Date: Wed, 26 Nov 2014 13:17:25 +0000 Subject: [PATCH] Modified file to provide mapping provided by kernel object to get arguments from parent instead of getInValAt() function --- .../DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp index 93059ccde2..c402848cbd 100644 --- a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp +++ b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp @@ -54,9 +54,10 @@ public: // calls class Kernel { public: - Kernel(Function* _KF, std::vector<unsigned>* _inArgMap = NULL, - unsigned _gridDim = 0, std::vector<Value*> - _globalWGSize = std::vector<Value*>(), unsigned _blockDim = 0, + Kernel(Function* _KF, std::vector<unsigned> _inArgMap = + std::vector<unsigned>(), unsigned _gridDim = 0, std::vector<Value*> + _globalWGSize = std::vector<Value*>(), + unsigned _blockDim = 0, std::vector<Value*> _localWGSize = std::vector<Value*>()) : KernelFunction(_KF), inArgMap(_inArgMap), gridDim(_gridDim), globalWGSize(_globalWGSize), @@ -69,11 +70,15 @@ public: } Function* KernelFunction; - std::vector<unsigned>* inArgMap; + std::vector<unsigned> inArgMap; unsigned gridDim; unsigned blockDim; std::vector<Value*> globalWGSize; std::vector<Value*> localWGSize; + + std::vector<unsigned> getInArgMap() { + return inArgMap; + } }; // Helper function declarations @@ -469,7 +474,11 @@ void CodeGenTraversal::insertRuntimeCalls(DFInternalNode* N, const Twine& FileNa std::vector<OutputPtr> OutputPointers; for(unsigned i=0; i<CF->getFunctionType()->getNumParams(); i++) { - Value* inputVal = getInValueAt(C, i, F_X86, RI); + // The kernel object gives us the mapping of arguments from kernel launch + // node function (F_X86) to kernel (kernel->KF) + Value* inputVal = getArgumentAt(F_X86, kernel->getInArgMap()[i]); + DEBUG(errs() << "\tArgument "<< i<< " = " << *inputVal << "\n"); + // input value has been obtained. // Check if input is a scalar value or a pointer operand // For scalar values such as int, float, etc. the size is simply the size of @@ -484,10 +493,10 @@ void CodeGenTraversal::insertRuntimeCalls(DFInternalNode* N, const Twine& FileNa Argument* A = getArgumentAt(CF, i); if(isOutput == True) { - errs() << *A << " is an OUTPUT argument\n"; + DEBUG(errs() << *A << " is an OUTPUT argument\n"); } if(isInput == True) { - errs() << *A << " is an INPUT argument\n"; + DEBUG(errs() << *A << " is an INPUT argument\n"); } @@ -495,7 +504,7 @@ void CodeGenTraversal::insertRuntimeCalls(DFInternalNode* N, const Twine& FileNa Type::getInt8PtrTy(M.getContext()), inputVal->getName()+".i8ptr", RI); - Value* inputSize = getInValueAt(C, i+1, F_X86, RI); + Value* inputSize = getArgumentAt(F_X86, kernel->getInArgMap()[i+1]); assert(inputSize->getType() == Type::getInt64Ty(M.getContext()) && "Pointer type input must always be followed by size (integer type)"); Value* setInputArgs[] = {GraphID, @@ -551,9 +560,9 @@ void CodeGenTraversal::insertRuntimeCalls(DFInternalNode* N, const Twine& FileNa }; d_Output = CallInst::Create(llvm_visc_ptx_argument_ptr, - ArrayRef<Value*>(setOutputArgs, 6), - "d_output."+CF->getName(), - RI); + ArrayRef<Value*>(setOutputArgs, 6), + "d_output."+CF->getName(), + RI); } // Enqueue kernel @@ -601,9 +610,10 @@ void CodeGenTraversal::insertRuntimeCalls(DFInternalNode* N, const Twine& FileNa // Read all the pointer arguments which had side effects i.e., had out // attribute for(auto output: OutputPointers) { - errs() << "Read: " << *output.d_ptr << "\n"; - errs() << "\t To: " << *output.h_ptr << "\n"; - errs() << "\t #bytes: " << *output.bytes << "\n"; + DEBUG(errs() << "Read: " << *output.d_ptr << "\n"); + DEBUG(errs() << "\tTo: " << *output.h_ptr << "\n"); + DEBUG(errs() << "\t#bytes: " << *output.bytes << "\n"); + Value* GetOutputArgs[] = {GraphID, output.h_ptr, output.d_ptr, output.bytes}; CallInst* CI = CallInst::Create(llvm_visc_ptx_getOutput, ArrayRef<Value*>(GetOutputArgs, 4), @@ -688,14 +698,13 @@ void CodeGenTraversal::codeGen(DFInternalNode* N) { DEBUG(errs() << "Found intermediate node. Getting size parameters.\n"); // Keep track of the arguments order. - std::vector<unsigned>* map1 = N->getInArgMap(); - std::vector<unsigned>* map2 = kernel->getInArgMap(); + std::vector<unsigned> map1 = N->getInArgMap(); + std::vector<unsigned> map2 = kernel->getInArgMap(); // The limit is the size of map2, because this is the number of kernel arguments for (unsigned i = 0; i < map2.size(); i++) { map2[i] = map1[map2[i]]; } - free(map1); } -- GitLab