diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-28 21:41:21 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-28 21:41:21 +0000 |
commit | 836475b2e2b45d34bcc558497f47a87585157254 (patch) | |
tree | 2181cf6819d2c3424ae32a67ffc40469e5611738 /lib/Transforms | |
parent | e8d18694cbee58ffd7137014e89200fc424e3b78 (diff) | |
download | llvm-836475b2e2b45d34bcc558497f47a87585157254.tar.gz llvm-836475b2e2b45d34bcc558497f47a87585157254.tar.bz2 llvm-836475b2e2b45d34bcc558497f47a87585157254.tar.xz |
Revert "Add support for combining GEPs across PHI nodes"
This reverts commit r209755.
it was the real cause of the libc++ build failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209775 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/InstCombine/InstructionCombining.cpp | 79 |
1 files changed, 0 insertions, 79 deletions
diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp index 80eec1b311..4c36887f62 100644 --- a/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1220,85 +1220,6 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { if (MadeChange) return &GEP; } - // Check to see if the inputs to the PHI node are getelementptr instructions. - if (PHINode *PN = dyn_cast<PHINode>(PtrOp)) { - GetElementPtrInst *Op1 = dyn_cast<GetElementPtrInst>(PN->getOperand(0)); - if (!Op1) - return nullptr; - - signed DI = -1; - - for (auto I = PN->op_begin()+1, E = PN->op_end(); I !=E; ++I) { - GetElementPtrInst *Op2 = dyn_cast<GetElementPtrInst>(*I); - if (!Op2 || Op1->getNumOperands() != Op2->getNumOperands()) - return nullptr; - - for (unsigned J = 0, F = Op1->getNumOperands(); J != F; ++J) { - if (Op1->getOperand(J)->getType() != Op2->getOperand(J)->getType()) - return nullptr; - - if (Op1->getOperand(J) != Op2->getOperand(J)) { - if (DI == -1) { - // We have not seen any differences yet in the GEPs feeding the - // PHI yet, so we record this one if it is allowed to be a - // variable. - - // The first two arguments can vary for any GEP, the rest have to be - // static for struct slots - if (J > 1) { - SmallVector<Value*, 8> Idxs(GEP.idx_begin(), GEP.idx_begin()+J); - Type *Ty = - GetElementPtrInst::getIndexedType(Op1->getOperand(0)->getType(), - Idxs); - if (Ty->isStructTy()) - return nullptr; - } - - DI = J; - } else { - // The GEP is different by more than one input. While this could be - // extended to support GEPs that vary by more than one variable it - // doesn't make sense since it greatly increases the complexity and - // would result in an R+R+R addressing mode which no backend - // directly supports and would need to be broken into several - // simpler instructions anyway. - return nullptr; - } - } - } - } - - GetElementPtrInst *NewGEP = cast<GetElementPtrInst>(Op1->clone()); - - if (DI == -1) { - // All the GEPs feeding the PHI are identical. Clone one down into our - // BB so that it can be merged with the current GEP. - GEP.getParent()->getInstList().insert(GEP.getParent()->getFirstNonPHI(), - NewGEP); - } else { - // All the GEPs feeding the PHI differ at a single offset. Clone a GEP - // into the current block so it can be merged, and create a new PHI to - // set that index. - Instruction *InsertPt = Builder->GetInsertPoint(); - Builder->SetInsertPoint(PN); - PHINode *NewPN = Builder->CreatePHI(Op1->getOperand(DI)->getType(), - PN->getNumOperands()); - Builder->SetInsertPoint(InsertPt); - - for (auto &I : PN->operands()) - NewPN->addIncoming(cast<GEPOperator>(I)->getOperand(DI), - PN->getIncomingBlock(I)); - - NewGEP->setOperand(DI, NewPN); - GEP.getParent()->getInstList().insert(GEP.getParent()->getFirstNonPHI(), - NewGEP); - NewGEP->setOperand(DI, NewPN); - } - - GEP.setOperand(0, NewGEP); - PtrOp = NewGEP; - } - // Combine Indices - If the source pointer to this getelementptr instruction // is a getelementptr instruction, combine the indices of the two // getelementptr instructions into a single instruction. |