[Beignet] [PATCH 1/8] strip unsupported attributes and calling conventions.
Zhigang Gong
zhigang.gong at intel.com
Tue Mar 31 19:05:36 PDT 2015
Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
---
backend/src/CMakeLists.txt | 1 +
backend/src/llvm/StripAttributes.cpp | 119 ++++++++++++++++++++++++++++++++++
backend/src/llvm/llvm_gen_backend.cpp | 7 +-
backend/src/llvm/llvm_gen_backend.hpp | 4 +-
backend/src/llvm/llvm_scalarize.cpp | 1 +
backend/src/llvm/llvm_to_gen.cpp | 6 +-
6 files changed, 134 insertions(+), 4 deletions(-)
create mode 100644 backend/src/llvm/StripAttributes.cpp
diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
index a21918c..a6736ec 100644
--- a/backend/src/CMakeLists.txt
+++ b/backend/src/CMakeLists.txt
@@ -88,6 +88,7 @@ set (GBE_SRC
llvm/ExpandUtils.cpp
llvm/PromoteIntegers.cpp
llvm/ExpandLargeIntegers.cpp
+ llvm/StripAttributes.cpp
llvm/llvm_to_gen.cpp
llvm/llvm_loadstore_optimization.cpp
llvm/llvm_gen_backend.hpp
diff --git a/backend/src/llvm/StripAttributes.cpp b/backend/src/llvm/StripAttributes.cpp
new file mode 100644
index 0000000..05cac17
--- /dev/null
+++ b/backend/src/llvm/StripAttributes.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// Imported from pNaCl project
+// Copyright (c) 2003-2014 University of Illinois at Urbana-Champaign.
+// All rights reserved.
+//
+// Developed by:
+//
+// LLVM Team
+//
+// University of Illinois at Urbana-Champaign
+//
+// http://llvm.org
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal with
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimers.
+//
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimers in the
+// documentation and/or other materials provided with the distribution.
+//
+// * Neither the names of the LLVM Team, University of Illinois at
+// Urbana-Champaign, nor the names of its contributors may be used to
+// endorse or promote products derived from this Software without specific
+// prior written permission.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+// SOFTWARE.
+
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass strips out attributes that are not supported by Beignet.
+// Currently, this strips out:
+//
+// * Calling conventions from functions and function calls.
+//
+
+#include "llvm/IR/Function.h"
+#include "llvm/Pass.h"
+
+#if LLVM_VERSION_MINOR >= 5
+#include "llvm/IR/CallSite.h"
+#else
+#include "llvm/Support/CallSite.h"
+#endif
+
+#include "llvm_gen_backend.hpp"
+
+using namespace llvm;
+
+namespace {
+ class StripAttributes : public FunctionPass {
+ public:
+ static char ID; // Pass identification, replacement for typeid
+ StripAttributes() : FunctionPass(ID) {
+ }
+
+ virtual bool runOnFunction(Function &Func);
+ };
+}
+
+char StripAttributes::ID = 0;
+
+bool StripAttributes::runOnFunction(Function &Func) {
+ if (!gbe::isKernelFunction(Func))
+ Func.addFnAttr(Attribute::AlwaysInline);
+ Func.setCallingConv(CallingConv::C);
+ Func.setLinkage(GlobalValue::ExternalLinkage);
+
+ for (Function::iterator BB = Func.begin(), E = Func.end();
+ BB != E; ++BB) {
+ for (BasicBlock::iterator Inst = BB->begin(), E = BB->end();
+ Inst != E; ++Inst) {
+ CallSite Call(Inst);
+ if (Call)
+ Call.setCallingConv(CallingConv::C);
+ }
+ }
+
+ return true;
+}
+
+FunctionPass *llvm::createStripAttributesPass() {
+ return new StripAttributes();
+}
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 813d0d3..ec79628 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -2791,8 +2791,13 @@ namespace gbe
break;
case GEN_OCL_PRINTF:
break;
+ case GEN_OCL_NOT_FOUND:
default:
- GBE_ASSERTM(false, "Function call are not supported yet");
+ std::cerr << "Caller instruction: " << std::endl;
+ I.dump();
+ std::cerr << "Callee function: " << std::endl;
+ Callee->dump();
+ GBE_ASSERT(0);
};
}
diff --git a/backend/src/llvm/llvm_gen_backend.hpp b/backend/src/llvm/llvm_gen_backend.hpp
index 91a1166..5724917 100644
--- a/backend/src/llvm/llvm_gen_backend.hpp
+++ b/backend/src/llvm/llvm_gen_backend.hpp
@@ -50,6 +50,7 @@ namespace llvm {
FunctionPass *createExpandConstantExprPass();
FunctionPass *createExpandLargeIntegersPass();
FunctionPass *createPromoteIntegersPass();
+ FunctionPass *createStripAttributesPass();
// Copy debug information from Original to New, and return New.
template <typename T> T *CopyDebug(T *New, llvm::Instruction *Original) {
New->setDebugLoc(Original->getDebugLoc());
@@ -66,6 +67,7 @@ namespace gbe
enum OCLInstrinsic {
#define DECL_LLVM_GEN_FUNCTION(ID, NAME) GEN_OCL_##ID,
#include "llvm_gen_ocl_function.hxx"
+ GEN_OCL_NOT_FOUND,
#undef DECL_LLVM_GEN_FUNCTION
};
@@ -97,7 +99,7 @@ namespace gbe
if (it == map.end()) {
std::cerr << "Unresolved symbol: " << symbol << std::endl;
std::cerr << "Aborting..." << std::endl;
- exit(-1);
+ return GEN_OCL_NOT_FOUND;
}
return it->second;
}
diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp
index 860053f..b657246 100644
--- a/backend/src/llvm/llvm_scalarize.cpp
+++ b/backend/src/llvm/llvm_scalarize.cpp
@@ -643,6 +643,7 @@ namespace gbe {
CallSite::arg_iterator CI = CS.arg_begin() + 1;
switch (genIntrinsicID) {
+ case GEN_OCL_NOT_FOUND:
default: break;
case GEN_OCL_READ_IMAGE_I:
case GEN_OCL_READ_IMAGE_UI:
diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp
index 89a22b6..a4ce4a2 100644
--- a/backend/src/llvm/llvm_to_gen.cpp
+++ b/backend/src/llvm/llvm_to_gen.cpp
@@ -133,8 +133,9 @@ namespace gbe
MPM.add(createInstructionCombiningPass());// Clean up after IPCP & DAE
MPM.add(createCFGSimplificationPass()); // Clean up after IPCP & DAE
MPM.add(createPruneEHPass()); // Remove dead EH info
+ MPM.add(createStripAttributesPass()); // Strip unsupported attributes and calling conventions.
MPM.add(createBarrierNodupPass(false)); // remove noduplicate fnAttr before inlining.
- MPM.add(createFunctionInliningPass(200000));
+ MPM.add(createFunctionInliningPass(20000));
MPM.add(createBarrierNodupPass(true)); // restore noduplicate fnAttr after inlining.
MPM.add(createFunctionAttrsPass()); // Set readonly/readnone attrs
@@ -275,7 +276,8 @@ namespace gbe
#endif
// Print the code before further optimizations
passes.add(createIntrinsicLoweringPass());
- passes.add(createFunctionInliningPass(200000));
+ passes.add(createStripAttributesPass()); // Strip unsupported attributes and calling conventions.
+ passes.add(createFunctionInliningPass(20000));
passes.add(createScalarReplAggregatesPass(64, true, -1, -1, 64));
passes.add(createLoadStoreOptimizationPass());
passes.add(createConstantPropagationPass());
--
1.9.1
More information about the Beignet
mailing list