mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-19 19:29:31 +00:00
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
This commit is contained in:
parent
e4619181cc
commit
9b76123124
@ -540,7 +540,6 @@ static inline bool isEliminableCastOfCast(const CastInst &CI,
|
|||||||
return SrcSize != MidSize || SrcTy == Type::BoolTy;
|
return SrcSize != MidSize || SrcTy == Type::BoolTy;
|
||||||
default: assert(0 && "Bad entry in sign table!");
|
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
|
// is a getelementptr instruction, combine the indices of the two
|
||||||
// getelementptr instructions into a single instruction.
|
// getelementptr instructions into a single instruction.
|
||||||
//
|
//
|
||||||
if (GetElementPtrInst *Src =
|
if (GetElementPtrInst *Src = dyn_cast<GetElementPtrInst>(GEP.getOperand(0))) {
|
||||||
dyn_cast<GetElementPtrInst>(GEP.getPointerOperand())) {
|
|
||||||
std::vector<Value *> Indices;
|
std::vector<Value *> Indices;
|
||||||
|
|
||||||
// Can we combine the two pointer arithmetics offsets?
|
// Can we combine the two pointer arithmetics offsets?
|
||||||
@ -635,6 +633,24 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
|||||||
|
|
||||||
if (!Indices.empty())
|
if (!Indices.empty())
|
||||||
return new GetElementPtrInst(Src->getOperand(0), Indices, GEP.getName());
|
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;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user