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