mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-12 05:40:30 +00:00
implement Transforms/InstCombine/cast2.ll:test3 and PR1263
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35341 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7d4d6b8615
commit
db9654e284
@ -7896,10 +7896,22 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
|||||||
if (GEP.getNumOperands() == 2 && HasZeroPointerIndex)
|
if (GEP.getNumOperands() == 2 && HasZeroPointerIndex)
|
||||||
return ReplaceInstUsesWith(GEP, PtrOp);
|
return ReplaceInstUsesWith(GEP, PtrOp);
|
||||||
|
|
||||||
|
// Keep track of whether all indices are zero constants integers.
|
||||||
|
bool AllZeroIndices = true;
|
||||||
|
|
||||||
// Eliminate unneeded casts for indices.
|
// Eliminate unneeded casts for indices.
|
||||||
bool MadeChange = false;
|
bool MadeChange = false;
|
||||||
|
|
||||||
gep_type_iterator GTI = gep_type_begin(GEP);
|
gep_type_iterator GTI = gep_type_begin(GEP);
|
||||||
for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i, ++GTI)
|
for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i, ++GTI) {
|
||||||
|
// Track whether this GEP has all zero indices, if so, it doesn't move the
|
||||||
|
// input pointer, it just changes its type.
|
||||||
|
if (AllZeroIndices) {
|
||||||
|
if (ConstantInt *CI = dyn_cast<ConstantInt>(GEP.getOperand(i)))
|
||||||
|
AllZeroIndices = CI->isNullValue();
|
||||||
|
else
|
||||||
|
AllZeroIndices = false;
|
||||||
|
}
|
||||||
if (isa<SequentialType>(*GTI)) {
|
if (isa<SequentialType>(*GTI)) {
|
||||||
if (CastInst *CI = dyn_cast<CastInst>(GEP.getOperand(i))) {
|
if (CastInst *CI = dyn_cast<CastInst>(GEP.getOperand(i))) {
|
||||||
if (CI->getOpcode() == Instruction::ZExt ||
|
if (CI->getOpcode() == Instruction::ZExt ||
|
||||||
@ -7929,8 +7941,16 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
|||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (MadeChange) return &GEP;
|
if (MadeChange) return &GEP;
|
||||||
|
|
||||||
|
// If this GEP instruction doesn't move the pointer, and if the input operand
|
||||||
|
// is a bitcast of another pointer, just replace the GEP with a bitcast of the
|
||||||
|
// real input to the dest type.
|
||||||
|
if (AllZeroIndices && isa<BitCastInst>(GEP.getOperand(0)))
|
||||||
|
return new BitCastInst(cast<BitCastInst>(GEP.getOperand(0))->getOperand(0),
|
||||||
|
GEP.getType());
|
||||||
|
|
||||||
// Combine Indices - If the source pointer to this getelementptr instruction
|
// Combine Indices - If the source pointer to this getelementptr instruction
|
||||||
// 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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user