From a38210cc6882f540224acb2c4559dcdf3d9e5ee5 Mon Sep 17 00:00:00 2001 From: Akash Kothari <akashk4@tyler.cs.illinois.edu> Date: Mon, 21 Dec 2020 11:53:31 -0600 Subject: [PATCH] LLVM-9-port FuseHPVMTensorNodes pass --- .../FuseHPVMTensorNodes/CMakeLists.txt | 4 +- .../FuseHPVMTensorNodes.cpp | 113 +++++++++--------- .../FuseHPVMTensorNodes.exports | 2 + .../FuseHPVMTensorNodes/LLVMBuild.txt | 2 +- 4 files changed, 63 insertions(+), 58 deletions(-) diff --git a/hpvm/lib/Transforms/FuseHPVMTensorNodes/CMakeLists.txt b/hpvm/lib/Transforms/FuseHPVMTensorNodes/CMakeLists.txt index 374f3b26f1..987be23ca4 100644 --- a/hpvm/lib/Transforms/FuseHPVMTensorNodes/CMakeLists.txt +++ b/hpvm/lib/Transforms/FuseHPVMTensorNodes/CMakeLists.txt @@ -2,7 +2,8 @@ if(WIN32 OR CYGWIN) set(LLVM_LINK_COMPONENTS Core Support) endif() -add_llvm_loadable_module( LLVMFuseHPVMTensorNodes +add_llvm_library( LLVMFuseHPVMTensorNodes + MODULE FuseHPVMTensorNodes.cpp DEPENDS @@ -10,3 +11,4 @@ add_llvm_loadable_module( LLVMFuseHPVMTensorNodes PLUGIN_TOOL opt ) + diff --git a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp index 541efe4e1d..f77852182d 100644 --- a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp +++ b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp @@ -12,14 +12,14 @@ #include "llvm/IR/ValueMap.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" -#include "llvm/FuseHPVMTensorNodes/FuseHPVMTensorNodes.h" -#include "llvm/SupportVISC/DFG2LLVM.h" -#include "llvm/SupportVISC/VISCUtils.h" +#include "FuseHPVMTensorNodes/FuseHPVMTensorNodes.h" +#include "SupportHPVM/DFG2LLVM.h" +#include "SupportHPVM/HPVMUtils.h" using namespace llvm; using namespace builddfg; using namespace dfg2llvm; -using namespace viscUtils; +using namespace hpvmUtils; namespace tensorfuse { /*** Classes ***/ @@ -56,7 +56,7 @@ static void getIncomingEdgeIntrinsicList(IntrinsicInst *II, IntrinsicInst* useI = dyn_cast<IntrinsicInst>(*ui); assert(useI && "HPVM graph intrinsic used in non HPVM intrinsic instruction\n"); - if (useI->getIntrinsicID() != Intrinsic::visc_createEdge) + if (useI->getIntrinsicID() != Intrinsic::hpvm_createEdge) continue; // Skip all non edge intrinsics // For edge intrinsics, test the descination operand @@ -91,7 +91,7 @@ static IntrinsicInst *isValidHPVMTensorNode(DFNode *N) { if(dyn_cast<IntrinsicInst>(&*I)){ II = dyn_cast<IntrinsicInst>(&*I); - if ((II->getCalledFunction()->getName()).startswith("llvm.visc.tensor")){ + if ((II->getCalledFunction()->getName()).startswith("llvm.hpvm.tensor")){ errs()<<"** Tensor Intrinsic = " << *II << "\n"; } @@ -101,7 +101,7 @@ static IntrinsicInst *isValidHPVMTensorNode(DFNode *N) { //assert(II && // "HPVM tensor intrinsic expected as first instruction of HPVM tensor node\n"); - //assert((II->getCalledFunction()->getName()).startswith("llvm.visc.tensor") && + //assert((II->getCalledFunction()->getName()).startswith("llvm.hpvm.tensor") && // "Only HPVM tensor intrinsics allowed in ApproxHPVM leaf nodes\n"); return II; @@ -179,7 +179,7 @@ void FuseHPVMTensorNodes::createArgTypes(IntrinsicInst* II1, Function* F2 = cast<Function>((II2->getOperand(0))->stripPointerCasts()); // Arguments of the first node are simply added - for(auto& arg: F1->getArgumentList()) { + for(auto& arg: F1->args()) { DEBUG(errs() << arg << "\n"); ArgTypes.push_back(arg.getType()); } @@ -199,7 +199,7 @@ void FuseHPVMTensorNodes::createArgTypes(IntrinsicInst* II1, // Add argument type to the new function only if it is not incoming from // an edge - for(auto& arg: F2->getArgumentList()) { + for(auto& arg: F2->args()) { DEBUG(errs() << arg << "\n"); unsigned inport = arg.getArgNo(); if (isIncomingEdgeArgument(inport, IncomingEdgeList)) @@ -235,7 +235,7 @@ void FuseHPVMTensorNodes::copyArgumentNames(IntrinsicInst* II1, Function::arg_iterator dest_it = F->arg_begin(); // Argument names of the first node are simply copied - for(auto& arg: F1->getArgumentList()) { + for(auto& arg: F1->args()) { dest_it->setName("s_" + arg.getName()); dest_it++; } @@ -254,7 +254,7 @@ void FuseHPVMTensorNodes::copyArgumentNames(IntrinsicInst* II1, // Copy argument name to the new function only if it is not incoming from // an edge - for(auto& arg: F2->getArgumentList()) { + for(auto& arg: F2->args()) { DEBUG(errs() << arg << "\n"); unsigned inport = arg.getArgNo(); if (isIncomingEdgeArgument(inport, IncomingEdgeList)) @@ -293,13 +293,13 @@ void FuseHPVMTensorNodes::copyAttrList(IntrinsicInst* II1, // Copy attributes of F1 for(; f1_ai != f1_ae && f_ai != f_ae; ++f1_ai, ++f_ai) { - AttributeSet AS = F1->getAttributes(); + AttributeList AS = F1->getAttributes(); DEBUG(errs() << "Copying attributes from " << F1->getName() << " at " << f1_ai->getArgNo() << "\n"); AttrBuilder AB(AS, f1_ai->getArgNo()+1); - AttributeSet argAS = AttributeSet::get(F1->getContext(), - f_ai->getArgNo()+1, AB); - F->addAttributes(f_ai->getArgNo()+1, argAS); + //AttributeList argAS = AttributeList::get(F1->getContext(), + // f_ai->getArgNo()+1, AB); + F->addAttributes(f_ai->getArgNo()+1, AB);//argAS); } // Copy needed attributes of F2 @@ -308,13 +308,13 @@ void FuseHPVMTensorNodes::copyAttrList(IntrinsicInst* II1, if (isIncomingEdgeArgument(inport, IncomingEdgeList)) continue; - AttributeSet AS = F2->getAttributes(); + AttributeList AS = F2->getAttributes(); DEBUG(errs() << "Copying attributes from " << F2->getName() << " at " << f2_ai->getArgNo() << "\n"); AttrBuilder AB(AS, f2_ai->getArgNo()+1); - AttributeSet argAS = AttributeSet::get(F2->getContext(), - f_ai->getArgNo()+1, AB); - F->addAttributes(f_ai->getArgNo()+1, argAS); + //AttributeList argAS = AttributeList::get(F2->getContext(), + // f_ai->getArgNo()+1, AB); + F->addAttributes(f_ai->getArgNo()+1, AB);//argAS); ++f_ai;; } return; @@ -368,14 +368,14 @@ void FuseHPVMTensorNodes::inlineFirstNodeFunction(Module &M, Function *F1, // First, we copy the HPVM intrinsics of F1 into Ffused, applying the mapping for (inst_iterator f1_e = inst_end(F1); f1_i != f1_e; ++f1_i) { Instruction *I = &(*f1_i); - if (!(BuildDFG::isViscIntrinsic(I))) { + if (!(BuildDFG::isHPVMIntrinsic(I))) { // We are done with the node computation break; } IntrinsicInst* II = dyn_cast<IntrinsicInst>(I); - assert ( ((II->getCalledFunction()->getName()).startswith("llvm.visc.tensor") - || (II->getCalledFunction()->getName()).startswith("llvm.visc.node.id") ) + assert ( ((II->getCalledFunction()->getName()).startswith("llvm.hpvm.tensor") + || (II->getCalledFunction()->getName()).startswith("llvm.hpvm.node.id") ) && "Only HPVM tensor intrinsics allowed in ApproxHPVM leaf nodes\n"); std::vector<Value*> Args; @@ -427,14 +427,14 @@ void FuseHPVMTensorNodes::inlineSecondNodeFunction(Module &M, Function *F2, inst_iterator f2_i = inst_begin(F2); for (inst_iterator f2_e = inst_end(F2); f2_i != f2_e; ++f2_i) { Instruction *I = &(*f2_i); - if ((BuildDFG::isViscIntrinsic(I))) { + if ((BuildDFG::isHPVMIntrinsic(I))) { IntrinsicInst* II = dyn_cast<IntrinsicInst>(I); - assert( ((II->getCalledFunction()->getName()).startswith("llvm.visc.tensor") - || (II->getCalledFunction()->getName()).startswith("llvm.visc.node.id")) + assert( ((II->getCalledFunction()->getName()).startswith("llvm.hpvm.tensor") + || (II->getCalledFunction()->getName()).startswith("llvm.hpvm.node.id")) && "Only HPVM tensor intrinsics allowed in ApproxHPVM leaf nodes\n"); - if ( (II->getCalledFunction()->getName()).startswith("llvm.visc.node.id")) { - continue; // Skip adding visc.node.id calls in nodes other than first node + if ( (II->getCalledFunction()->getName()).startswith("llvm.hpvm.node.id")) { + continue; // Skip adding hpvm.node.id calls in nodes other than first node } std::vector<Value*> Args; @@ -526,7 +526,7 @@ Function* FuseHPVMTensorNodes::createLeafDFNodeFunction(IntrinsicInst* II1, // Initially, update FusedValueMap: it is populated with the arguments of F1 Function::arg_iterator fused_arg_it = Ffused->arg_begin(); // Argument names of the first node are simply copied - for(auto& arg: F1->getArgumentList()) { + for(auto& arg: F1->args()) { FusedValueMap[&arg] = &*fused_arg_it; ++fused_arg_it; } @@ -551,7 +551,7 @@ Function* FuseHPVMTensorNodes::createLeafDFNodeFunction(IntrinsicInst* II1, } // FusedValueMap is now populated with the arguments of F2 as well - for(auto& arg: F2->getArgumentList()) { + for(auto& arg: F2->args()) { DEBUG(errs() << arg << "\n"); unsigned inport = arg.getArgNo(); if (isIncomingEdgeArgument(inport, IncomingEdgeList)) { @@ -595,7 +595,7 @@ void FuseHPVMTensorNodes::updateParentNodeFunction(IntrinsicInst* II1, } // Compute shift map for n2: maps position in F2 arg list to Ffused arg list - for(auto& arg: F2->getArgumentList()) { + for(auto& arg: F2->args()) { DEBUG(errs() << arg << "\n"); unsigned inport = arg.getArgNo(); if (isIncomingEdgeArgument(inport, IncomingEdgeList)) @@ -612,10 +612,10 @@ void FuseHPVMTensorNodes::updateParentNodeFunction(IntrinsicInst* II1, i != ie; ++i) { Instruction *VI = dyn_cast<Instruction>(*i); IntrinsicInst* II = dyn_cast<IntrinsicInst>(VI); - assert(II && "Use of a node handle outside of a visc intrinsic\n"); + assert(II && "Use of a node handle outside of a hpvm intrinsic\n"); switch(II->getIntrinsicID()) { - case Intrinsic::visc_createEdge: + case Intrinsic::hpvm_createEdge: { if (isOutgoingEdgeIntrinsic(II,II1)) { assert(isIncomingEdgeIntrinsic(II,II2) && @@ -624,11 +624,11 @@ void FuseHPVMTensorNodes::updateParentNodeFunction(IntrinsicInst* II1, } } break; - case Intrinsic::visc_bind_input: + case Intrinsic::hpvm_bind_input: { } break; - case Intrinsic::visc_bind_output: + case Intrinsic::hpvm_bind_output: { assert(false && "Source node of node fusion not expected in bind.out\n"); @@ -656,16 +656,16 @@ void FuseHPVMTensorNodes::updateParentNodeFunction(IntrinsicInst* II1, i != ie; ++i) { Instruction *VI = dyn_cast<Instruction>(*i); IntrinsicInst* II = dyn_cast<IntrinsicInst>(VI); - assert(II && "Use of a node handle outside of a visc intrinsic\n"); + assert(II && "Use of a node handle outside of a hpvm intrinsic\n"); switch(II->getIntrinsicID()) { - case Intrinsic::visc_createEdge: + case Intrinsic::hpvm_createEdge: { assert(isOutgoingEdgeIntrinsic(II,II2) && "Node 2 is expected to have only outgoing edges at this point\n"); } break; - case Intrinsic::visc_bind_input: + case Intrinsic::hpvm_bind_input: { /* The index must be updated to the matching argument position of * * the fused functionm using ShiftMap */ @@ -678,7 +678,7 @@ void FuseHPVMTensorNodes::updateParentNodeFunction(IntrinsicInst* II1, IItoRemove.push_back(II); } break; - case Intrinsic::visc_bind_output: + case Intrinsic::hpvm_bind_output: { assert(false && "Source node of node fusion not expected in bind.out\n"); @@ -726,7 +726,7 @@ IntrinsicInst* FuseHPVMTensorNodes::FuseHPVMTensorNodesStep(IntrinsicInst* II1, // Generate createNode Intrinsic for fused node and insert it Function* CreateNodeF = Intrinsic::getDeclaration(&M, - Intrinsic::visc_createNode); + Intrinsic::hpvm_createNode); Constant* Fp = ConstantExpr::getPointerCast(Ffused, Type::getInt8PtrTy(M.getContext())); CallInst *CI = CallInst::Create(CreateNodeF, @@ -769,7 +769,7 @@ IntrinsicInst* FuseHPVMTensorNodes::FuseHPVMTensorNodesStep(IntrinsicInst* II1, void FuseHPVMTensorNodes::FuseHPVMTensorNodeSequence( std::vector<IntrinsicInst*> &IIs, Module &M) { for (IntrinsicInst *II : IIs) { - assert((II->getIntrinsicID() == Intrinsic::visc_createNode) && + assert((II->getIntrinsicID() == Intrinsic::hpvm_createNode) && "Expected createNode intrinsic in fuse intrinsic sequence\n"); } @@ -831,7 +831,7 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { } - if(!preferredTargetIncludes(N, visc::PROMISE_TARGET)) { + if(!preferredTargetIncludes(N, hpvm::PROMISE_TARGET)) { // Only fuse if we plan to target PROMISE/Layers API // The CUDNN backend would be able to generate calls for the fused node, // but not the other way around @@ -840,7 +840,7 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { return; } - visc::Target StartNodePreferredTarget = getPreferredTarget(N); + hpvm::Target StartNodePreferredTarget = getPreferredTarget(N); // Make sure that this is a valid HPVM Tensor Node // Find first instruction, and check that it is an HPVM tensor intrinsic IntrinsicInst *II = isValidHPVMTensorNode(N); @@ -849,14 +849,14 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { switch(II->getIntrinsicID()) { - /*case Intrinsic::visc_node_id: + /*case Intrinsic::hpvm_node_id: { // Found beginning of pattern conv-bias-activation-pooling. } break; */ - case Intrinsic::visc_tensor_convolution: + case Intrinsic::hpvm_tensor_convolution: { // Found beginning of pattern conv-bias-activation-pooling. // Look for the rest CurrentNodeSequence.push_back(N->getInstruction()); @@ -870,7 +870,7 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { return; // Node in sequence has different hint. Simpy return. } IntrinsicInst *SII = isValidHPVMTensorNode(SN); - if (SII->getIntrinsicID() != Intrinsic::visc_tensor_add) { + if (SII->getIntrinsicID() != Intrinsic::hpvm_tensor_add) { // Successor is not the bias operation, thus does not fit the pattern. return; } @@ -890,9 +890,9 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { } SII = isValidHPVMTensorNode(SN); - if ((SII->getIntrinsicID() == Intrinsic::visc_tensor_clipped_relu) || - (SII->getIntrinsicID() == Intrinsic::visc_tensor_relu) || - (SII->getIntrinsicID() == Intrinsic::visc_tensor_tanh)) { + if ((SII->getIntrinsicID() == Intrinsic::hpvm_tensor_clipped_relu) || + (SII->getIntrinsicID() == Intrinsic::hpvm_tensor_relu) || + (SII->getIntrinsicID() == Intrinsic::hpvm_tensor_tanh)) { // Successor is activation. Push this node to the current sequence. CurrentNodeSequence.push_back(SN->getInstruction()); @@ -907,15 +907,15 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { SII = isValidHPVMTensorNode(SN); } //else {} // Look for pooling in this node - if ((SII->getIntrinsicID() == Intrinsic::visc_tensor_pool_max) || - (SII->getIntrinsicID() == Intrinsic::visc_tensor_pool_min) || - (SII->getIntrinsicID() == Intrinsic::visc_tensor_pool_mean)) { + if ((SII->getIntrinsicID() == Intrinsic::hpvm_tensor_pool_max) || + (SII->getIntrinsicID() == Intrinsic::hpvm_tensor_pool_min) || + (SII->getIntrinsicID() == Intrinsic::hpvm_tensor_pool_mean)) { // Successor is a pool operation. Use currently found sequence. CurrentNodeSequence.push_back(SN->getInstruction()); } } break; - case Intrinsic::visc_tensor_mul: + case Intrinsic::hpvm_tensor_mul: { // Found beginning of pattern gemm-bias-activation. Look for the rest CurrentNodeSequence.push_back(N->getInstruction()); // Look for bias @@ -927,7 +927,7 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { return; // Node in sequence has different hint. Simpy return. } IntrinsicInst *SII = isValidHPVMTensorNode(SN); - if (SII->getIntrinsicID() != Intrinsic::visc_tensor_add) { + if (SII->getIntrinsicID() != Intrinsic::hpvm_tensor_add) { // Successor is not the bias operation, thus does not fit the pattern. return; } @@ -943,9 +943,9 @@ void FindFusionTargetsTraversal::codeGen(DFLeafNode *N) { if (SN) { if (getPreferredTarget(SN) == StartNodePreferredTarget) { SII = isValidHPVMTensorNode(SN); - if ((SII->getIntrinsicID() == Intrinsic::visc_tensor_clipped_relu) || - (SII->getIntrinsicID() == Intrinsic::visc_tensor_relu) || - (SII->getIntrinsicID() == Intrinsic::visc_tensor_tanh)) { + if ((SII->getIntrinsicID() == Intrinsic::hpvm_tensor_clipped_relu) || + (SII->getIntrinsicID() == Intrinsic::hpvm_tensor_relu) || + (SII->getIntrinsicID() == Intrinsic::hpvm_tensor_tanh)) { // We found activation in sequence. Push in vector as well. CurrentNodeSequence.push_back(SN->getInstruction()); } @@ -1005,3 +1005,4 @@ static RegisterPass<FuseHPVMTensorNodesWrapper> X("hpvm-fuse", } // End of namespace + diff --git a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.exports b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.exports index e69de29bb2..139597f9cb 100644 --- a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.exports +++ b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.exports @@ -0,0 +1,2 @@ + + diff --git a/hpvm/lib/Transforms/FuseHPVMTensorNodes/LLVMBuild.txt b/hpvm/lib/Transforms/FuseHPVMTensorNodes/LLVMBuild.txt index 55a6ee5150..cbf43ed9b1 100644 --- a/hpvm/lib/Transforms/FuseHPVMTensorNodes/LLVMBuild.txt +++ b/hpvm/lib/Transforms/FuseHPVMTensorNodes/LLVMBuild.txt @@ -1,4 +1,4 @@ -;===- ./lib/Transforms/LocalMem/LLVMBuild.txt ------------------*- Conf -*--===; +;===- ./lib/Transforms/DFG2LLVM_WrapperAPI/LLVMBuild.txt -------*- Conf -*--===; ; ; The LLVM Compiler Infrastructure ; -- GitLab