diff --git a/ctx.cpp b/ctx.cpp index 8ac64fe5..e9fd7203 100644 --- a/ctx.cpp +++ b/ctx.cpp @@ -1279,7 +1279,11 @@ FunctionEmitContext::MasksAllEqual(llvm::Value *v1, llvm::Value *v2) { llvm::Value * FunctionEmitContext::GetStringPtr(const std::string &str) { +#ifdef LLVM_3_1svn + llvm::Constant *lstr = llvm::ConstantDataArray::getString(*g->ctx, str); +#else llvm::Constant *lstr = llvm::ConstantArray::get(*g->ctx, str); +#endif llvm::GlobalValue::LinkageTypes linkage = llvm::GlobalValue::InternalLinkage; llvm::Value *lstrPtr = new llvm::GlobalVariable(*m->module, lstr->getType(), true /*isConst*/, @@ -1329,7 +1333,11 @@ FunctionEmitContext::I1VecToBoolVec(llvm::Value *b) { static llvm::Value * lGetStringAsValue(llvm::BasicBlock *bblock, const char *s) { +#ifdef LLVM_3_1svn + llvm::Constant *sConstant = llvm::ConstantDataArray::getString(*g->ctx, s); +#else llvm::Constant *sConstant = llvm::ConstantArray::get(*g->ctx, s); +#endif llvm::Value *sPtr = new llvm::GlobalVariable(*m->module, sConstant->getType(), true /* const */, llvm::GlobalValue::InternalLinkage, diff --git a/llvmutil.cpp b/llvmutil.cpp index 92abd392..e5c4785e 100644 --- a/llvmutil.cpp +++ b/llvmutil.cpp @@ -607,6 +607,12 @@ LLVMVectorValuesAllEqual(llvm::Value *v, int vectorLength, if (cv != NULL) return (cv->getSplatValue() != NULL); +#ifdef LLVM_3_1svn + llvm::ConstantDataVector *cdv = llvm::dyn_cast(v); + if (cdv != NULL) + return (cdv->getSplatValue() != NULL); +#endif + llvm::BinaryOperator *bop = llvm::dyn_cast(v); if (bop != NULL) return (LLVMVectorValuesAllEqual(bop->getOperand(0), vectorLength, diff --git a/opt.cpp b/opt.cpp index 5e74bd5a..57443040 100644 --- a/opt.cpp +++ b/opt.cpp @@ -630,13 +630,17 @@ lGetMask(llvm::Value *factor) { "known and all bits on". */ Assert(g->target.vectorWidth < 32); +#ifdef LLVM_3_1svn + llvm::ConstantDataVector *cv = llvm::dyn_cast(factor); +#else llvm::ConstantVector *cv = llvm::dyn_cast(factor); +#endif if (cv) { int mask = 0; llvm::SmallVector elements; #ifdef LLVM_3_1svn - for (int i = 0; i < (int)cv->getNumOperands(); ++i) - elements.push_back(cv->getOperand(i)); + for (int i = 0; i < (int)cv->getNumElements(); ++i) + elements.push_back(cv->getElementAsConstant(i)); #else cv->getVectorElements(elements); #endif @@ -1133,8 +1137,13 @@ lGetBasePtrAndOffsets(llvm::Value *ptrs, llvm::Value **offsets, // ConstantVectors.. llvm::SmallVector elements; #ifdef LLVM_3_1svn - for (int i = 0; i < (int)cv->getNumOperands(); ++i) - elements.push_back(cv->getOperand(i)); + for (int i = 0; i < (int)cv->getNumOperands(); ++i) { + llvm::Constant *c = + llvm::dyn_cast(cv->getOperand(i)); + if (c == NULL) + return NULL; + elements.push_back(c); + } #else cv->getVectorElements(elements); #endif @@ -1247,6 +1256,9 @@ lExtractConstantOffset(llvm::Value *vec, llvm::Value **constOffset, llvm::Value **variableOffset, llvm::Instruction *insertBefore) { if (llvm::isa(vec) || +#ifdef LLVM_3_1svn + llvm::isa(vec) || +#endif llvm::isa(vec)) { *constOffset = vec; *variableOffset = NULL; @@ -1365,7 +1377,12 @@ lExtractConstantOffset(llvm::Value *vec, llvm::Value **constOffset, in *splat, if so). */ static bool lIs248Splat(llvm::Value *v, int *splat) { +#ifdef LLVM_3_1svn + llvm::ConstantDataVector *cvec = + llvm::dyn_cast(v); +#else llvm::ConstantVector *cvec = llvm::dyn_cast(v); +#endif if (cvec == NULL) return false; @@ -1472,6 +1489,9 @@ lExtractUniforms(llvm::Value **vec, llvm::Instruction *insertBefore) { fprintf(stderr, "\n"); if (llvm::isa(*vec) || +#ifdef LLVM_3_1svn + llvm::isa(*vec) || +#endif llvm::isa(*vec)) return NULL; @@ -2153,13 +2173,19 @@ char GSToLoadStorePass::ID = 0; elements. */ static bool -lVectorIsLinearConstantInts(llvm::ConstantVector *cv, int vectorLength, +lVectorIsLinearConstantInts( +#ifdef LLVM_3_1svn + llvm::ConstantDataVector *cv, +#else + llvm::ConstantVector *cv, +#endif + int vectorLength, int stride) { // Flatten the vector out into the elements array llvm::SmallVector elements; #ifdef LLVM_3_1svn - for (int i = 0; i < (int)cv->getNumOperands(); ++i) - elements.push_back(cv->getOperand(i)); + for (int i = 0; i < (int)cv->getNumElements(); ++i) + elements.push_back(cv->getElementAsConstant(i)); #else cv->getVectorElements(elements); #endif @@ -2201,7 +2227,11 @@ lCheckMulForLinear(llvm::Value *op0, llvm::Value *op1, int vectorLength, int stride, std::vector &seenPhis) { // Is the first operand a constant integer value splatted across all of // the lanes? +#ifdef LLVM_3_1svn + llvm::ConstantDataVector *cv = llvm::dyn_cast(op0); +#else llvm::ConstantVector *cv = llvm::dyn_cast(op0); +#endif if (cv == NULL) return false; @@ -2237,7 +2267,11 @@ lVectorIsLinear(llvm::Value *v, int vectorLength, int stride, std::vector &seenPhis) { // First try the easy case: if the values are all just constant // integers and have the expected stride between them, then we're done. +#ifdef LLVM_3_1svn + llvm::ConstantDataVector *cv = llvm::dyn_cast(v); +#else llvm::ConstantVector *cv = llvm::dyn_cast(v); +#endif if (cv != NULL) return lVectorIsLinearConstantInts(cv, vectorLength, stride);