mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 22:24:28 +00:00
Implement InstCombine/getelementptr.ll:test9, which is the source of many
ugly and giant constnat exprs in some programs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17066 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -4018,6 +4018,24 @@ bool InstCombiner::runOnFunction(Function &F) {
|
|||||||
|
|
||||||
// Instruction isn't dead, see if we can constant propagate it...
|
// Instruction isn't dead, see if we can constant propagate it...
|
||||||
if (Constant *C = ConstantFoldInstruction(I)) {
|
if (Constant *C = ConstantFoldInstruction(I)) {
|
||||||
|
if (isa<GetElementPtrInst>(I) &&
|
||||||
|
cast<Constant>(I->getOperand(0))->isNullValue() &&
|
||||||
|
!isa<ConstantPointerNull>(C)) {
|
||||||
|
// If this is a constant expr gep that is effectively computing an
|
||||||
|
// "offsetof", fold it into 'cast int X to T*' instead of 'gep 0, 0, 12'
|
||||||
|
bool isFoldableGEP = true;
|
||||||
|
for (unsigned i = 1, e = I->getNumOperands(); i != e; ++i)
|
||||||
|
if (!isa<ConstantInt>(I->getOperand(i)))
|
||||||
|
isFoldableGEP = false;
|
||||||
|
if (isFoldableGEP) {
|
||||||
|
uint64_t Offset = TD->getIndexedOffset(I->getOperand(0)->getType(),
|
||||||
|
std::vector<Value*>(I->op_begin()+1, I->op_end()));
|
||||||
|
C = ConstantUInt::get(Type::ULongTy, Offset);
|
||||||
|
C = ConstantUInt::getCast(C, TD->getIntPtrType());
|
||||||
|
C = ConstantExpr::getCast(C, I->getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add operands to the worklist...
|
// Add operands to the worklist...
|
||||||
AddUsesToWorkList(*I);
|
AddUsesToWorkList(*I);
|
||||||
ReplaceInstUsesWith(*I, C);
|
ReplaceInstUsesWith(*I, C);
|
||||||
|
Reference in New Issue
Block a user