diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2014-05-17 14:39:21 +0000 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2014-05-17 14:39:21 +0000 |
commit | 7ef81a4f9863ce7caad72d3c5390efbc1e9f5e70 (patch) | |
tree | 29442a39e7218151b13b87da2f0e672cd35fcc70 /llvm/lib | |
parent | 41d7dfe46a23952aeafbc6fa0fc5c5cef8a51d88 (diff) | |
download | bcm5719-llvm-7ef81a4f9863ce7caad72d3c5390efbc1e9f5e70.tar.gz bcm5719-llvm-7ef81a4f9863ce7caad72d3c5390efbc1e9f5e70.zip |
Revert r209049 and r209065, "Add support for combining GEPs across PHI nodes"
It broke clang selfhosting even after r209065.
llvm-svn: 209067
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 66 |
1 files changed, 0 insertions, 66 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index b65c4ee8e59..4c36887f628 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1220,72 +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. - 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 = dyn_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(dyn_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. |