From 9b761231240a06f4f0f193eb01b05c6e43812484 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 17 Aug 2002 22:21:59 +0000 Subject: [PATCH] Promote getelementptr instructions to constexprs if we can. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3368 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/InstructionCombining.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index f5acaf47e62..088a758c7f5 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/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(GEP.getPointerOperand())) { + if (GetElementPtrInst *Src = dyn_cast(GEP.getOperand(0))) { std::vector 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(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 Indices; + User::op_iterator I = GEP.idx_begin(), E = GEP.idx_end(); + for (; I != E && isa(*I); ++I) + Indices.push_back(cast(*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;