diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-12-01 02:55:24 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-12-01 02:55:24 +0000 |
commit | a4b2ee45482be9f497b1de6bc780fed1cde79994 (patch) | |
tree | 2f829ff9640a9c3d234ab5fa4aa6035db227ab4c /llvm | |
parent | 2895527ec2bf7d6861080a9853304b7ea9d566a1 (diff) | |
download | bcm5719-llvm-a4b2ee45482be9f497b1de6bc780fed1cde79994.tar.gz bcm5719-llvm-a4b2ee45482be9f497b1de6bc780fed1cde79994.zip |
Relax an assert a bit to avoid a crash on unreachable code.
Patch by Duncan Exon Smith with a small tweak by me.
llvm-svn: 222984
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/GVN/load-from-unreachable-predecessor.ll | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp index 187eadacd7a..ad7242136bb 100644 --- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -1361,7 +1361,7 @@ getNonLocalPointerDepFromBB(const PHITransAddr &Pointer, if (I->getBB() != BB) continue; - assert(I->getResult().isNonLocal() && + assert((I->getResult().isNonLocal() || !DT->isReachableFromEntry(BB)) && "Should only be here with transparent block"); I->setResult(MemDepResult::getUnknown()); Result.push_back(NonLocalDepResult(I->getBB(), I->getResult(), diff --git a/llvm/test/Transforms/GVN/load-from-unreachable-predecessor.ll b/llvm/test/Transforms/GVN/load-from-unreachable-predecessor.ll new file mode 100644 index 00000000000..b676d958aa4 --- /dev/null +++ b/llvm/test/Transforms/GVN/load-from-unreachable-predecessor.ll @@ -0,0 +1,20 @@ +; RUN: opt -gvn -S < %s | FileCheck %s + +; Check that an unreachable predecessor to a PHI node doesn't cause a crash. +; PR21625. + +define i32 @f(i32** %f) { +; CHECK: bb0: +; Load should be removed, since it's ignored. +; CHECK-NEXT: br label +bb0: + %bar = load i32** %f + br label %bb2 +bb1: + %zed = load i32** %f + br i1 false, label %bb1, label %bb2 +bb2: + %foo = phi i32* [ null, %bb0 ], [ %zed, %bb1 ] + %storemerge = load i32* %foo + ret i32 %storemerge +} |