[Beignet] [OCL20 PATCH V2] GBE:Add LLVM3.8 support
Pan Xiuli
xiuli.pan at intel.com
Wed Nov 18 01:27:39 PST 2015
LLVM3.8 does not support iterator implicit cast to pointer, so add change
type for these uses. And due to the refine of ScalarEvolution, the using
namespace llvm::legacy is not enough to tell comilper which PassManager
to use, refine the PassManager declaration.
Now CallInst::hasStructRetAttr() will assert if there is no argments,
don't know if it is a llvm bug or our fault, just workaround it now.
V2:
Remove patch about CMakeList
Do not use macro to handle cast
Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
---
backend/src/llvm/ExpandConstantExpr.cpp | 4 +--
backend/src/llvm/ExpandLargeIntegers.cpp | 2 +-
backend/src/llvm/ExpandUtils.cpp | 2 +-
backend/src/llvm/PromoteIntegers.cpp | 4 +--
backend/src/llvm/StripAttributes.cpp | 2 +-
backend/src/llvm/llvm_gen_backend.cpp | 28 +++++++--------
backend/src/llvm/llvm_includes.hpp | 5 +++
backend/src/llvm/llvm_intrinsic_lowering.cpp | 6 ++--
backend/src/llvm/llvm_loadstore_optimization.cpp | 19 +++++++---
backend/src/llvm/llvm_printf_parser.cpp | 2 +-
backend/src/llvm/llvm_scalarize.cpp | 10 +++---
backend/src/llvm/llvm_to_gen.cpp | 45 ++++++++++++++++++++++--
backend/src/llvm/llvm_unroll.cpp | 9 +++++
13 files changed, 101 insertions(+), 37 deletions(-)
diff --git a/backend/src/llvm/ExpandConstantExpr.cpp b/backend/src/llvm/ExpandConstantExpr.cpp
index c6f57b8..e9ec3ab 100644
--- a/backend/src/llvm/ExpandConstantExpr.cpp
+++ b/backend/src/llvm/ExpandConstantExpr.cpp
@@ -115,7 +115,7 @@ static Value *expandConstantVector(Instruction *InsertPt, ConstantVector *CV) {
Type *IntTy = IntegerType::get(CV->getContext(), 32);
BasicBlock::iterator InsertPos(InsertPt);
- IRBuilder<> IRB(InsertPos);
+ IRBuilder<> IRB(&*InsertPos);
Value *vec = UndefValue::get(CV->getType());
for (int i = 0; i < elemNum; i++) {
Value *idx = ConstantInt::get(IntTy, i);
@@ -177,7 +177,7 @@ bool ExpandConstantExpr::runOnFunction(Function &Func) {
for (BasicBlock::InstListType::iterator Inst = BB->begin(), E = BB->end();
Inst != E;
++Inst) {
- Modified |= expandInstruction(Inst);
+ Modified |= expandInstruction(&*Inst);
}
}
return Modified;
diff --git a/backend/src/llvm/ExpandLargeIntegers.cpp b/backend/src/llvm/ExpandLargeIntegers.cpp
index 20fdda9..00987cb 100644
--- a/backend/src/llvm/ExpandLargeIntegers.cpp
+++ b/backend/src/llvm/ExpandLargeIntegers.cpp
@@ -388,7 +388,7 @@ static void convertInstruction(Instruction *Inst, ConversionState &State,
// Set the insert point *after* Inst, so that any instructions inserted here
// will be visited again. That allows iterative expansion of types > i128.
BasicBlock::iterator InsertPos(Inst);
- IRBuilder<> IRB(++InsertPos);
+ IRBuilder<> IRB(&*++InsertPos);
StringRef Name = Inst->getName();
if (PHINode *Phi = dyn_cast<PHINode>(Inst)) {
diff --git a/backend/src/llvm/ExpandUtils.cpp b/backend/src/llvm/ExpandUtils.cpp
index 801f969..a09d990 100644
--- a/backend/src/llvm/ExpandUtils.cpp
+++ b/backend/src/llvm/ExpandUtils.cpp
@@ -101,7 +101,7 @@ namespace llvm {
Function *RecreateFunction(Function *Func, FunctionType *NewType) {
Function *NewFunc = Function::Create(NewType, Func->getLinkage());
NewFunc->copyAttributesFrom(Func);
- Func->getParent()->getFunctionList().insert(Func, NewFunc);
+ Func->getParent()->getFunctionList().insert(ilist_iterator<Function>(Func), NewFunc);
NewFunc->takeName(Func);
NewFunc->getBasicBlockList().splice(NewFunc->begin(),
Func->getBasicBlockList());
diff --git a/backend/src/llvm/PromoteIntegers.cpp b/backend/src/llvm/PromoteIntegers.cpp
index b65440f..8759287 100644
--- a/backend/src/llvm/PromoteIntegers.cpp
+++ b/backend/src/llvm/PromoteIntegers.cpp
@@ -615,7 +615,7 @@ bool PromoteIntegers::runOnFunction(Function &F) {
// Don't support changing the function arguments. This should not be
// generated by clang.
for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
- Value *Arg = I;
+ Value *Arg = &*I;
if (shouldConvert(Arg)) {
errs() << "Function " << F.getName() << ": " << *Arg << "\n";
llvm_unreachable("Function has illegal integer/pointer argument");
@@ -626,7 +626,7 @@ bool PromoteIntegers::runOnFunction(Function &F) {
bool Modified = false;
for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) {
for (BasicBlock::iterator BBI = FI->begin(), BBE = FI->end(); BBI != BBE;) {
- Instruction *Inst = BBI++;
+ Instruction *Inst = &*BBI++;
// Only attempt to convert an instruction if its result or any of its
// operands are illegal.
bool ShouldConvert = shouldConvert(Inst);
diff --git a/backend/src/llvm/StripAttributes.cpp b/backend/src/llvm/StripAttributes.cpp
index e6df312..3bf3853 100644
--- a/backend/src/llvm/StripAttributes.cpp
+++ b/backend/src/llvm/StripAttributes.cpp
@@ -98,7 +98,7 @@ bool StripAttributes::runOnFunction(Function &Func) {
BB != E; ++BB) {
for (BasicBlock::iterator Inst = BB->begin(), E = BB->end();
Inst != E; ++Inst) {
- CallSite Call(Inst);
+ CallSite Call(&*Inst);
if (Call)
Call.setCallingConv(CallingConv::C);
}
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 39665b8..f89ae0d 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -1164,7 +1164,7 @@ namespace gbe
llvmInfo.typeName= (cast<MDString>(typeNameNode->getOperand(1 + argID)))->getString();
bool isImage = llvmInfo.isImageType();
if (I->getType()->isPointerTy() || isImage) {
- BtiMap.insert(std::make_pair(I, getNewBti(I, isImage)));
+ BtiMap.insert(std::make_pair(&*I, getNewBti(&*I, isImage)));
}
}
@@ -1278,7 +1278,7 @@ namespace gbe
// function argument
for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
if (I->getType()->isPointerTy()) {
- findPointerEscape(I, mixedPtr, true, revisit);
+ findPointerEscape(&*I, mixedPtr, true, revisit);
}
}
// alloca
@@ -1327,7 +1327,7 @@ namespace gbe
while (isa<AllocaInst>(bbIter)) ++bbIter;
IRBuilder<> Builder(&entry);
- Builder.SetInsertPoint(bbIter);
+ Builder.SetInsertPoint(&*bbIter);
PointerType * AITy = cast<AllocaInst>(base)->getType();
Value * btiArray = Builder.CreateAlloca(AITy->getElementType(), ArraySize, base->getName() + ".bti");
@@ -1752,7 +1752,7 @@ namespace gbe
}
void GenWriter::simplifyTerminator(BasicBlock *bb) {
- Value *value = --bb->end();
+ Value *value = bb->getTerminator();
BranchInst *I = NULL;
if ((I = dyn_cast<BranchInst>(value)) != NULL) {
if (I->isConditional() == false)
@@ -1982,12 +1982,12 @@ namespace gbe
}
// function arguments are uniform values.
- this->newRegister(I, NULL, true);
+ this->newRegister(&*I, NULL, true);
// add support for vector argument.
if(type->isVectorTy()) {
VectorType *vectorType = cast<VectorType>(type);
- ir::Register reg = getRegister(I, 0);
+ ir::Register reg = getRegister(&*I, 0);
Type *elemType = vectorType->getElementType();
const uint32_t elemSize = getTypeByteSize(unit, elemType);
const uint32_t elemNum = vectorType->getNumElements();
@@ -1997,7 +1997,7 @@ namespace gbe
ir::Function& fn = ctx.getFunction();
for(uint32_t i=1; i < elemNum; i++) {
ir::PushLocation argLocation(fn, argID, elemSize*i);
- reg = getRegister(I, i);
+ reg = getRegister(&*I, i);
ctx.appendPushedConstant(reg, argLocation); //add to push map for reg alloc
}
continue;
@@ -2005,10 +2005,10 @@ namespace gbe
GBE_ASSERTM(isScalarType(type) == true,
"vector type in the function argument is not supported yet");
- const ir::Register reg = getRegister(I);
+ const ir::Register reg = getRegister(&*I);
if (llvmInfo.isImageType()) {
ctx.input(argName, ir::FunctionArgument::IMAGE, reg, llvmInfo, 4, 4, 0);
- ctx.getFunction().getImageSet()->append(reg, &ctx, BtiMap.find(I)->second);
+ ctx.getFunction().getImageSet()->append(reg, &ctx, BtiMap.find(&*I)->second);
collectImageArgs(llvmInfo.accessQual, imageArgsInfo);
continue;
}
@@ -2041,7 +2041,7 @@ namespace gbe
const uint32_t align = getAlignmentByte(unit, pointed);
switch (addrSpace) {
case ir::MEM_GLOBAL:
- ctx.input(argName, ir::FunctionArgument::GLOBAL_POINTER, reg, llvmInfo, ptrSize, align, BtiMap.find(I)->second);
+ ctx.input(argName, ir::FunctionArgument::GLOBAL_POINTER, reg, llvmInfo, ptrSize, align, BtiMap.find(&*I)->second);
break;
case ir::MEM_LOCAL:
ctx.input(argName, ir::FunctionArgument::LOCAL_POINTER, reg, llvmInfo, ptrSize, align, BTI_LOCAL);
@@ -2814,12 +2814,12 @@ namespace gbe
// First create all the labels (one per block) ...
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
- this->newLabelIndex(BB);
+ this->newLabelIndex(&*BB);
// Then, for all branch instructions that have conditions, see if we can
// simplify the code by inverting condition code
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
- this->simplifyTerminator(BB);
+ this->simplifyTerminator(&*BB);
// gather loop info, which is useful for liveness analysis
gatherLoopInfo(fn);
@@ -2827,7 +2827,7 @@ namespace gbe
// ... then, emit the instructions for all basic blocks
pass = PASS_EMIT_INSTRUCTIONS;
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
- emitBasicBlock(BB);
+ emitBasicBlock(&*BB);
ctx.endFunction();
// Liveness can be shared when we optimized the immediates and the MOVs
@@ -3347,7 +3347,7 @@ namespace gbe
Value *Callee = I.getCalledValue();
GBE_ASSERT(ctx.getFunction().getProfile() == ir::PROFILE_OCL);
GBE_ASSERT(isa<InlineAsm>(I.getCalledValue()) == false);
- GBE_ASSERT(I.hasStructRetAttr() == false);
+ if(I.getNumArgOperands()) GBE_ASSERT(I.hasStructRetAttr() == false);
// We only support a small number of intrinsics right now
if (Function *F = I.getCalledFunction()) {
diff --git a/backend/src/llvm/llvm_includes.hpp b/backend/src/llvm/llvm_includes.hpp
index fed3a18..d2deb90 100644
--- a/backend/src/llvm/llvm_includes.hpp
+++ b/backend/src/llvm/llvm_includes.hpp
@@ -122,4 +122,9 @@
#include <clang/CodeGen/CodeGenAction.h>
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >=8
+#include "llvm/Analysis/BasicAliasAnalysis.h"
+#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
+#endif
+
#endif /* __GBE_IR_LLVM_INCLUDES_HPP__ */
diff --git a/backend/src/llvm/llvm_intrinsic_lowering.cpp b/backend/src/llvm/llvm_intrinsic_lowering.cpp
index b35d1e6..c26e96a 100644
--- a/backend/src/llvm/llvm_intrinsic_lowering.cpp
+++ b/backend/src/llvm/llvm_intrinsic_lowering.cpp
@@ -73,7 +73,7 @@ namespace gbe {
Constant* FCache = M->getOrInsertFunction(NewFn,
FunctionType::get(RetTy, ParamTys, false));
- IRBuilder<> Builder(CI->getParent(), CI);
+ IRBuilder<> Builder(CI->getParent(), BasicBlock::iterator(CI));
SmallVector<Value *, 8> Args(ArgBegin, ArgEnd);
CallInst *NewCI = Builder.CreateCall(FCache, Args);
NewCI->setName(CI->getName());
@@ -90,12 +90,12 @@ namespace gbe {
DataLayout TD(M);
LLVMContext &Context = BB.getContext();
for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) {
- Instruction *Inst = DI++;
+ Instruction *Inst = &*DI++;
CallInst* CI = dyn_cast<CallInst>(Inst);
if(CI == NULL)
continue;
- IRBuilder<> Builder(&BB, CI);
+ IRBuilder<> Builder(&BB, BasicBlock::iterator(CI));
// only support memcpy and memset
if (Function *F = CI->getCalledFunction()) {
const Intrinsic::ID intrinsicID = (Intrinsic::ID) F->getIntrinsicID();
diff --git a/backend/src/llvm/llvm_loadstore_optimization.cpp b/backend/src/llvm/llvm_loadstore_optimization.cpp
index 698fdc2..121f53d 100644
--- a/backend/src/llvm/llvm_loadstore_optimization.cpp
+++ b/backend/src/llvm/llvm_loadstore_optimization.cpp
@@ -35,13 +35,22 @@ namespace gbe {
GenLoadStoreOptimization() : BasicBlockPass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const {
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ AU.addRequired<ScalarEvolutionWrapperPass>();
+ AU.addPreserved<ScalarEvolutionWrapperPass>();
+#else
AU.addRequired<ScalarEvolution>();
AU.addPreserved<ScalarEvolution>();
+#endif
AU.setPreservesCFG();
}
virtual bool runOnBasicBlock(BasicBlock &BB) {
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
+#else
SE = &getAnalysis<ScalarEvolution>();
+#endif
#if LLVM_VERSION_MINOR >= 7
TD = &BB.getModule()->getDataLayout();
#elif LLVM_VERSION_MINOR >= 5
@@ -159,9 +168,9 @@ namespace gbe {
bool isLoad) {
BasicBlock::iterator stepForward = start;
- if(!isSimpleLoadStore(start)) return stepForward;
+ if(!isSimpleLoadStore(&*start)) return stepForward;
- merged.push_back(start);
+ merged.push_back(&*start);
BasicBlock::iterator E = BB.end();
BasicBlock::iterator J = ++start;
@@ -170,8 +179,8 @@ namespace gbe {
for(unsigned ss = 0; J != E && ss <= maxLimit; ++ss, ++J) {
if((isLoad && isa<LoadInst>(*J)) || (!isLoad && isa<StoreInst>(*J))) {
- if(isLoadStoreCompatible(merged[merged.size()-1], J)) {
- merged.push_back(J);
+ if(isLoadStoreCompatible(merged[merged.size()-1], &*J)) {
+ merged.push_back(&*J);
stepForward = ++J;
}
} else if((isLoad && isa<StoreInst>(*J)) || (!isLoad && isa<LoadInst>(*J))) {
@@ -217,7 +226,7 @@ namespace gbe {
for (BasicBlock::iterator BBI = BB.begin(), E = BB.end(); BBI != E;++BBI) {
if(isa<LoadInst>(*BBI) || isa<StoreInst>(*BBI)) {
bool isLoad = isa<LoadInst>(*BBI) ? true: false;
- Type *ty = getValueType(BBI);
+ Type *ty = getValueType(&*BBI);
if(ty->isVectorTy()) continue;
// TODO Support DWORD/WORD/BYTE LOAD for store support DWORD only now.
if (!(ty->isFloatTy() || ty->isIntegerTy(32) ||
diff --git a/backend/src/llvm/llvm_printf_parser.cpp b/backend/src/llvm/llvm_printf_parser.cpp
index bdaed8a..d1cb1ae 100644
--- a/backend/src/llvm/llvm_printf_parser.cpp
+++ b/backend/src/llvm/llvm_printf_parser.cpp
@@ -626,7 +626,7 @@ error:
Value* op0 = NULL;
Value* val = NULL;
- builder->SetInsertPoint(F.begin()->begin());// Insert the common var in the begin.
+ builder->SetInsertPoint(&*(F.begin()->begin()));// Insert the common var in the begin.
/* FIXME: Because the OpenCL language do not support va macro, and we do not want
to introduce the va_list, va_start and va_end into our code, we just simulate
diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp
index 7ee5259..dbc3544 100644
--- a/backend/src/llvm/llvm_scalarize.cpp
+++ b/backend/src/llvm/llvm_scalarize.cpp
@@ -197,7 +197,7 @@ namespace gbe {
/* set to insert new instructions after the specified instruction.*/
void setAppendPoint(Instruction *insn) {
BasicBlock::iterator next(insn);
- builder->SetInsertPoint(++next);
+ builder->SetInsertPoint(&*++next);
}
DenseMap<Value*, VectorValues> vectorVals;
@@ -759,7 +759,7 @@ namespace gbe {
return;
ReversePostOrderTraversal<Function*> rpot(&F);
BasicBlock::iterator instI = (*rpot.begin())->begin();
- builder->SetInsertPoint(instI);
+ builder->SetInsertPoint(&*instI);
Function::arg_iterator I = F.arg_begin(), E = F.arg_end();
@@ -767,7 +767,7 @@ namespace gbe {
Type *type = I->getType();
if(type->isVectorTy())
- extractFromVector(I);
+ extractFromVector(&*I);
}
return;
}
@@ -804,11 +804,11 @@ namespace gbe {
RPOTType rpot(&F);
for (RPOTType::rpo_iterator bbI = rpot.begin(), bbE = rpot.end(); bbI != bbE; ++bbI) {
for (BasicBlock::iterator instI = (*bbI)->begin(), instE = (*bbI)->end(); instI != instE; ++instI) {
- bool scalarized = scalarize(instI);
+ bool scalarized = scalarize(&*instI);
if (scalarized) {
changed = true;
// TODO: uncomment when done
- deadList.push_back(instI);
+ deadList.push_back(&*instI);
}
}
}
diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp
index 24d4be7..ceaee9b 100644
--- a/backend/src/llvm/llvm_to_gen.cpp
+++ b/backend/src/llvm/llvm_to_gen.cpp
@@ -45,7 +45,6 @@ namespace gbe
using namespace llvm;
#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
- using namespace llvm::legacy;
#define TARGETLIBRARY TargetLibraryInfoImpl
#else
#define TARGETLIBRARY TargetLibraryInfo
@@ -53,7 +52,11 @@ namespace gbe
void runFuntionPass(Module &mod, TARGETLIBRARY *libraryInfo, const DataLayout &DL)
{
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
+ legacy::FunctionPassManager FPM(&mod);
+#else
FunctionPassManager FPM(&mod);
+#endif
#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
@@ -74,8 +77,13 @@ namespace gbe
#else
FPM.add(new TargetLibraryInfo(*libraryInfo));
#endif
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ FPM.add(createTypeBasedAAWrapperPass());
+ FPM.add(createBasicAAWrapperPass());
+#else
FPM.add(createTypeBasedAliasAnalysisPass());
FPM.add(createBasicAliasAnalysisPass());
+#endif
FPM.add(createCFGSimplificationPass());
FPM.add(createSROAPass());
FPM.add(createEarlyCSEPass());
@@ -91,7 +99,11 @@ namespace gbe
void runModulePass(Module &mod, TARGETLIBRARY *libraryInfo, const DataLayout &DL, int optLevel, bool strictMath)
{
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
+ legacy::PassManager MPM;
+#else
PassManager MPM;
+#endif
#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
@@ -107,8 +119,13 @@ namespace gbe
#else
MPM.add(new TargetLibraryInfo(*libraryInfo));
#endif
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ MPM.add(createTypeBasedAAWrapperPass());
+ MPM.add(createBasicAAWrapperPass());
+#else
MPM.add(createTypeBasedAliasAnalysisPass());
MPM.add(createBasicAliasAnalysisPass());
+#endif
MPM.add(createIntrinsicLoweringPass());
MPM.add(createStripAttributesPass()); // Strip unsupported attributes and calling conventions.
MPM.add(createSamplerFixPass());
@@ -127,7 +144,11 @@ namespace gbe
//MPM.add(createScalarReplAggregatesPass(64, true, -1, -1, 64))
if(optLevel > 0)
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ MPM.add(createSROAPass());
+#else
MPM.add(createSROAPass(/*RequiresDomTree*/ false));
+#endif
MPM.add(createEarlyCSEPass()); // Catch trivial redundancies
MPM.add(createJumpThreadingPass()); // Thread jumps.
MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
@@ -146,7 +167,11 @@ namespace gbe
MPM.add(createLoopDeletionPass()); // Delete dead loops
MPM.add(createLoopUnrollPass(1024)); //1024, 32, 1024, 512)); //Unroll loops
if(optLevel > 0) {
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ MPM.add(createSROAPass());
+#else
MPM.add(createSROAPass(/*RequiresDomTree*/ false));
+#endif
MPM.add(createGVNPass()); // Remove redundancies
}
#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
@@ -157,7 +182,11 @@ namespace gbe
MPM.add(createCustomLoopUnrollPass()); //1024, 32, 1024, 512)); //Unroll loops
MPM.add(createLoopUnrollPass()); //1024, 32, 1024, 512)); //Unroll loops
if(optLevel > 0) {
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ MPM.add(createSROAPass());
+#else
MPM.add(createSROAPass(/*RequiresDomTree*/ false));
+#endif
MPM.add(createGVNPass()); // Remove redundancies
}
}
@@ -184,7 +213,15 @@ namespace gbe
}
-#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
+#define OUTPUT_BITCODE(STAGE, MOD) do { \
+ legacy::PassManager passes__; \
+ if (OCL_OUTPUT_LLVM_##STAGE) { \
+ passes__.add(createPrintModulePass(*o)); \
+ passes__.run(MOD); \
+ } \
+ }while(0)
+#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
#define OUTPUT_BITCODE(STAGE, MOD) do { \
PassManager passes__; \
if (OCL_OUTPUT_LLVM_##STAGE) { \
@@ -255,7 +292,11 @@ namespace gbe
runFuntionPass(mod, libraryInfo, DL);
runModulePass(mod, libraryInfo, DL, optLevel, strictMath);
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
+ legacy::PassManager passes;
+#else
PassManager passes;
+#endif
#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
passes.add(new DataLayoutPass());
diff --git a/backend/src/llvm/llvm_unroll.cpp b/backend/src/llvm/llvm_unroll.cpp
index 6990e39..4cc3481 100644
--- a/backend/src/llvm/llvm_unroll.cpp
+++ b/backend/src/llvm/llvm_unroll.cpp
@@ -47,8 +47,13 @@ namespace gbe {
AU.addPreservedID(LoopSimplifyID);
AU.addRequiredID(LCSSAID);
AU.addPreservedID(LCSSAID);
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ AU.addRequired<ScalarEvolutionWrapperPass>();
+ AU.addPreserved<ScalarEvolutionWrapperPass>();
+#else
AU.addRequired<ScalarEvolution>();
AU.addPreserved<ScalarEvolution>();
+#endif
// FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.
// If loop unroll does not preserve dom info then LCSSA pass on next
// loop will receive invalid dom info.
@@ -156,7 +161,11 @@ namespace gbe {
// be unrolled.
bool handleParentLoops(Loop *L, LPPassManager &LPM) {
Loop *currL = L;
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
+ ScalarEvolution *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
+#else
ScalarEvolution *SE = &getAnalysis<ScalarEvolution>();
+#endif
BasicBlock *ExitBlock = currL->getLoopLatch();
if (!ExitBlock || !L->isLoopExiting(ExitBlock))
ExitBlock = currL->getExitingBlock();
--
2.1.4
More information about the Beignet
mailing list