summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
diff options
context:
space:
mode:
authorLouis Gerbarg <lgg@apple.com>2014-05-17 06:51:36 +0000
committerLouis Gerbarg <lgg@apple.com>2014-05-17 06:51:36 +0000
commit455805694efd4953a3192d1a828fecf0b6dfd212 (patch)
tree85bb9b465a3c57da39b25ac0dae18e57fa525f9c /llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
parent483e4e08ac5fa8877c416abe616f4025a5332cd0 (diff)
downloadbcm5719-llvm-455805694efd4953a3192d1a828fecf0b6dfd212.tar.gz
bcm5719-llvm-455805694efd4953a3192d1a828fecf0b6dfd212.zip
Fix for sanitizer crash introduced in r209049
This patch fixes 3 issues introduced by r209049 that only showed up in on the sanitizer buildbots. One was a typo in a compare. The other is a check to confirm that the single differing value in the two incoming GEPs is the same type. The final issue was the the IRBuilder under some circumstances would build PHIs in the middle of the block. llvm-svn: 209065
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstructionCombining.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstructionCombining.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 35b4889a836..b65c4ee8e59 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -1230,10 +1230,13 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
for (auto I = PN->op_begin()+1, E = PN->op_end(); I !=E; ++I) {
GetElementPtrInst *Op2 = dyn_cast<GetElementPtrInst>(*I);
- if (!Op2 || Op1->getNumOperands() != Op1->getNumOperands())
+ 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
@@ -1263,8 +1266,12 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
// 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));
OpenPOWER on IntegriCloud