summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorYang, Rong R <rong.r.yang@intel.com>2017-03-23 18:00:26 +0800
committerYang Rong <rong.r.yang@intel.com>2017-05-15 16:39:41 +0800
commitda576713c4d84c1c746c11352d3e9a7afa8c0598 (patch)
tree9d228e32802c9e85f63b616a2948b54994ec3b73 /backend
parentb88e76f0508503110cae6456a92383d2e1a42617 (diff)
downloadbeignet-da576713c4d84c1c746c11352d3e9a7afa8c0598.tar.gz
GBE: set memcpy and memset functions's linkage to LinkOnceAnyLinkage at last call.
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@intel.com> Reviewed-by: Pan Xiuli <xiuli.pan@intel.com>
Diffstat (limited to 'backend')
-rw-r--r--backend/src/llvm/StripAttributes.cpp15
-rw-r--r--backend/src/llvm/llvm_gen_backend.hpp2
-rw-r--r--backend/src/llvm/llvm_to_gen.cpp4
3 files changed, 14 insertions, 7 deletions
diff --git a/backend/src/llvm/StripAttributes.cpp b/backend/src/llvm/StripAttributes.cpp
index 9d07c29d..99e5a71e 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 2a322ac1..b4715b15 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 37919ec6..ceefbbb0 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 * 10 + LLVM_VERSION_MINOR >= 37
passes.add(createSROAPass());