[Beignet] [PATCH] GBE: set memcpy and memset functions's linkage to LinkOnceAnyLinkage at last call.

Yang Rong rong.r.yang at intel.com
Thu Mar 23 10:00:26 UTC 2017


LLVM IR pass will produce memcpy and memset, if set LinkOnceAnyLinkage,
memcpy and memset will be delete before and cause fail.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/llvm/StripAttributes.cpp  | 15 +++++++++++----
 backend/src/llvm/llvm_gen_backend.hpp |  2 +-
 backend/src/llvm/llvm_to_gen.cpp      |  4 ++--
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/backend/src/llvm/StripAttributes.cpp b/backend/src/llvm/StripAttributes.cpp
index 9d07c29..afa8783 100644
--- a/backend/src/llvm/StripAttributes.cpp
+++ b/backend/src/llvm/StripAttributes.cpp
@@ -79,10 +79,13 @@ namespace {
   class StripAttributes : public FunctionPass {
   public:
     static char ID; // Pass identification, replacement for typeid
-    StripAttributes() : FunctionPass(ID) {
+    StripAttributes(bool lastTime) : FunctionPass(ID),
+                                     lastTime(lastTime) {
     }
 
     virtual bool runOnFunction(Function &Func);
+  private:
+    bool lastTime; //last time all StripAttributes
   };
 }
 
@@ -93,7 +96,11 @@ bool StripAttributes::runOnFunction(Function &Func) {
   Func.setLinkage(GlobalValue::ExternalLinkage);
   if (!gbe::isKernelFunction(Func)) {
     Func.addFnAttr(Attribute::AlwaysInline);
-    Func.setLinkage(GlobalValue::LinkOnceAnyLinkage);
+    if (lastTime ||
+        (Func.getName().find("__gen_mem") == std::string::npos))
+      // Memcpy and memset functions could be deleted at last inline.
+      // Delete memcpy and memset functions for output llvm ir friendly.
+      Func.setLinkage(GlobalValue::LinkOnceAnyLinkage);
   }
 
   for (Function::iterator BB = Func.begin(), E = Func.end();
@@ -109,6 +116,6 @@ bool StripAttributes::runOnFunction(Function &Func) {
   return true;
 }
 
-FunctionPass *llvm::createStripAttributesPass() {
-  return new StripAttributes();
+FunctionPass *llvm::createStripAttributesPass(bool lastTime) {
+  return new StripAttributes(lastTime);
 }
diff --git a/backend/src/llvm/llvm_gen_backend.hpp b/backend/src/llvm/llvm_gen_backend.hpp
index 1ab77c9..79b698c 100644
--- a/backend/src/llvm/llvm_gen_backend.hpp
+++ b/backend/src/llvm/llvm_gen_backend.hpp
@@ -46,7 +46,7 @@ namespace llvm {
   FunctionPass *createExpandConstantExprPass();
   FunctionPass *createExpandLargeIntegersPass();
   FunctionPass *createPromoteIntegersPass();
-  FunctionPass *createStripAttributesPass();
+  FunctionPass *createStripAttributesPass(bool lastTime);
   // Copy debug information from Original to New, and return New.
   template <typename T> T *CopyDebug(T *New, llvm::Instruction *Original) {
     New->setDebugLoc(Original->getDebugLoc());
diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp
index bef4df1..5fd7219 100644
--- a/backend/src/llvm/llvm_to_gen.cpp
+++ b/backend/src/llvm/llvm_to_gen.cpp
@@ -139,7 +139,7 @@ namespace gbe
     MPM.add(createBarrierNodupPass(false));   // remove noduplicate fnAttr before inlining.
     MPM.add(createFunctionInliningPass(20000));
     MPM.add(createBarrierNodupPass(true));    // restore noduplicate fnAttr after inlining.
-    MPM.add(createStripAttributesPass());     // Strip unsupported attributes and calling conventions.
+    MPM.add(createStripAttributesPass(false));     // Strip unsupported attributes and calling conventions.
     MPM.add(createSamplerFixPass());
     MPM.add(createGlobalOptimizerPass());     // Optimize out global vars
 
@@ -372,7 +372,7 @@ namespace gbe
 #endif
     // Print the code before further optimizations
     passes.add(createIntrinsicLoweringPass());
-    passes.add(createStripAttributesPass());     // Strip unsupported attributes and calling conventions.
+    passes.add(createStripAttributesPass(true));     // Strip unsupported attributes and calling conventions.
     passes.add(createFunctionInliningPass(20000));
 #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
     passes.add(createSROAPass());
-- 
2.1.4



More information about the Beignet mailing list