diff options
author | Chris Lattner <sabre@nondot.org> | 2002-08-17 22:21:59 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-08-17 22:21:59 +0000 |
commit | c59af1d257a96bd459088ad0492e5e12278e23ab (patch) | |
tree | 28520699775a33a4f42041ce8d5f69c8810958c8 | |
parent | c8d952ebba20fe415b2bd4c71d2a27105e9ab780 (diff) | |
download | bcm5719-llvm-c59af1d257a96bd459088ad0492e5e12278e23ab.tar.gz bcm5719-llvm-c59af1d257a96bd459088ad0492e5e12278e23ab.zip |
Promote getelementptr instructions to constexprs if we can.
llvm-svn: 3368
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index f5acaf47e62..088a758c7f5 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -540,7 +540,6 @@ static inline bool isEliminableCastOfCast(const CastInst &CI, return SrcSize != MidSize || SrcTy == Type::BoolTy; default: assert(0 && "Bad entry in sign table!"); } - return false; // NOT REACHED } } @@ -614,8 +613,7 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { // is a getelementptr instruction, combine the indices of the two // getelementptr instructions into a single instruction. // - if (GetElementPtrInst *Src = - dyn_cast<GetElementPtrInst>(GEP.getPointerOperand())) { + if (GetElementPtrInst *Src = dyn_cast<GetElementPtrInst>(GEP.getOperand(0))) { std::vector<Value *> Indices; // Can we combine the two pointer arithmetics offsets? @@ -635,6 +633,24 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { if (!Indices.empty()) return new GetElementPtrInst(Src->getOperand(0), Indices, GEP.getName()); + + } else if (GlobalValue *GV = dyn_cast<GlobalValue>(GEP.getOperand(0))) { + // GEP of global variable. If all of the indices for this GEP are + // constants, we can promote this to a constexpr instead of an instruction. + + // Scan for nonconstants... + std::vector<Constant*> Indices; + User::op_iterator I = GEP.idx_begin(), E = GEP.idx_end(); + for (; I != E && isa<Constant>(*I); ++I) + Indices.push_back(cast<Constant>(*I)); + + if (I == E) { // If they are all constants... + ConstantExpr *CE = + ConstantExpr::getGetElementPtr(ConstantPointerRef::get(GV), Indices); + + // Replace all uses of the GEP with the new constexpr... + return ReplaceInstUsesWith(GEP, CE); + } } return 0; |