mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
Implement Transforms/InstCombine/cast.ll:test13, a case which occurs in a
hot 164.gzip loop. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11702 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0ca4418b95
commit
c6bd195336
@ -2004,9 +2004,14 @@ Instruction *InstCombiner::visitPHINode(PHINode &PN) {
|
||||
Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
// Is it 'getelementptr %P, long 0' or 'getelementptr %P'
|
||||
// If so, eliminate the noop.
|
||||
if ((GEP.getNumOperands() == 2 &&
|
||||
GEP.getOperand(1) == Constant::getNullValue(Type::LongTy)) ||
|
||||
GEP.getNumOperands() == 1)
|
||||
if (GEP.getNumOperands() == 1)
|
||||
return ReplaceInstUsesWith(GEP, GEP.getOperand(0));
|
||||
|
||||
bool HasZeroPointerIndex = false;
|
||||
if (Constant *C = dyn_cast<Constant>(GEP.getOperand(1)))
|
||||
HasZeroPointerIndex = C->isNullValue();
|
||||
|
||||
if (GEP.getNumOperands() == 2 && HasZeroPointerIndex)
|
||||
return ReplaceInstUsesWith(GEP, GEP.getOperand(0));
|
||||
|
||||
// Combine Indices - If the source pointer to this getelementptr instruction
|
||||
@ -2073,6 +2078,31 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
// Replace all uses of the GEP with the new constexpr...
|
||||
return ReplaceInstUsesWith(GEP, CE);
|
||||
}
|
||||
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(GEP.getOperand(0))) {
|
||||
if (CE->getOpcode() == Instruction::Cast) {
|
||||
if (HasZeroPointerIndex) {
|
||||
// transform: GEP (cast [10 x ubyte]* X to [0 x ubyte]*), long 0, ...
|
||||
// into : GEP [10 x ubyte]* X, long 0, ...
|
||||
//
|
||||
// This occurs when the program declares an array extern like "int X[];"
|
||||
//
|
||||
Constant *X = CE->getOperand(0);
|
||||
const PointerType *CPTy = cast<PointerType>(CE->getType());
|
||||
if (const PointerType *XTy = dyn_cast<PointerType>(X->getType()))
|
||||
if (const ArrayType *XATy =
|
||||
dyn_cast<ArrayType>(XTy->getElementType()))
|
||||
if (const ArrayType *CATy =
|
||||
dyn_cast<ArrayType>(CPTy->getElementType()))
|
||||
if (CATy->getElementType() == XATy->getElementType()) {
|
||||
// At this point, we know that the cast source type is a pointer
|
||||
// to an array of the same type as the destination pointer
|
||||
// array. Because the array type is never stepped over (there
|
||||
// is a leading zero) we can fold the cast into this GEP.
|
||||
GEP.setOperand(0, X);
|
||||
return &GEP;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -126,7 +126,8 @@ bool TailDup::canEliminateUnconditionalBranch(TerminatorInst *TI) {
|
||||
// Basically, we refuse to make the transformation if any of the values
|
||||
// computed in the 'tail' are used in any other basic blocks.
|
||||
BasicBlock *Tail = TI->getSuccessor(0);
|
||||
|
||||
assert(isa<BranchInst>(TI) && cast<BranchInst>(TI)->isUnconditional());
|
||||
|
||||
for (BasicBlock::iterator I = Tail->begin(), E = Tail->end(); I != E; ++I)
|
||||
for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E;
|
||||
++UI) {
|
||||
|
Loading…
Reference in New Issue
Block a user