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 /llvm/lib | |
| parent | c8d952ebba20fe415b2bd4c71d2a27105e9ab780 (diff) | |
| download | bcm5719-llvm-c59af1d257a96bd459088ad0492e5e12278e23ab.tar.gz bcm5719-llvm-c59af1d257a96bd459088ad0492e5e12278e23ab.zip  | |
Promote getelementptr instructions to constexprs if we can.
llvm-svn: 3368
Diffstat (limited to 'llvm/lib')
| -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;  | 

