From 6de76f8a6ff5fe5c842ecc2b7ab4229ee8a53b25 Mon Sep 17 00:00:00 2001
From: Prakalp Srivastava <psrivas2@illinois.edu>
Date: Sat, 5 Mar 2016 20:35:50 -0600
Subject: [PATCH] Added malloc intrinsic in IntrinsicsVISC.td and barrier code
 gen to NVPTX pass

---
 llvm/include/llvm/IR/IntrinsicsVISC.td        |  3 +++
 .../DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp         | 21 ++++++++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/llvm/include/llvm/IR/IntrinsicsVISC.td b/llvm/include/llvm/IR/IntrinsicsVISC.td
index 2dcd8a2f33..7f56304384 100644
--- a/llvm/include/llvm/IR/IntrinsicsVISC.td
+++ b/llvm/include/llvm/IR/IntrinsicsVISC.td
@@ -174,4 +174,7 @@ let TargetPrefix = "visc" in {
    */
   def int_visc_getVectorLength : Intrinsic<[llvm_i32_ty], [], []>;
 
+  /* ============ Atomic intrinsics ============= */
+
+
 }
diff --git a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp
index fa99523df4..942b79f686 100644
--- a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp
+++ b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp
@@ -954,7 +954,7 @@ void CGT_NVPTX::codeGen(DFLeafNode* N) {
     assert(!BuildDFG::isViscLaunchIntrinsic(I) && "Launch intrinsic within a dataflow graph!");
     assert(!BuildDFG::isViscGraphIntrinsic(I) && "VISC graph intrinsic within a leaf dataflow node!");
 
-    if (BuildDFG::isViscQueryIntrinsic(I)) {
+    if (BuildDFG::isViscIntrinsic(I)) {
       IntrinsicInst* II = dyn_cast<IntrinsicInst>(I);
       IntrinsicInst* ArgII;
       DFNode* ArgDFNode;
@@ -1159,6 +1159,25 @@ void CGT_NVPTX::codeGen(DFLeafNode* N) {
         IItoRemove.push_back(II);
       }
       break;
+      case Intrinsic::visc_barrier:
+      {
+        errs() << F_nvptx->getName() << "\t: Handling barrier\n";
+        errs() << "Substitute with barrier()\n";
+        errs() << *II << "\n";
+          FunctionType* FT =
+            FunctionType::get(Type::getVoidTy(getGlobalContext() /*KernelM.getContext()*/),
+                              std::vector<Type*>(1, Type::getInt32Ty(getGlobalContext() /*KernelM.getContext()*/)),
+                              false);
+          Function* OpenCLFunction = cast<Function>
+                           (KernelM.getOrInsertFunction(StringRef("barrier"), FT));
+        CallInst* CI = CallInst::Create(OpenCLFunction,
+                               ArrayRef<Value*>(ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 1)),
+                               "", II);
+        II->replaceAllUsesWith(CI);
+        IItoRemove.push_back(II);
+       
+      }
+      break;
       default:
         assert(false && "Unknown VISC Intrinsic!");
         break;
-- 
GitLab