diff options
| author | Taewook Oh <twoh@fb.com> | 2019-05-15 19:35:38 +0000 |
|---|---|---|
| committer | Taewook Oh <twoh@fb.com> | 2019-05-15 19:35:38 +0000 |
| commit | 9d020de3e867e17101299dcd278bacc1365dce25 (patch) | |
| tree | 89f005cf1f7bae148dd2af2080958a08771aa600 | |
| parent | e8a039d62c7e7c687d729bca5aacfc553125c0ea (diff) | |
| download | bcm5719-llvm-9d020de3e867e17101299dcd278bacc1365dce25.tar.gz bcm5719-llvm-9d020de3e867e17101299dcd278bacc1365dce25.zip | |
[PredicateInfo] Do not process unreachable operands.
Summary: We should excluded unreachable operands from processing as their DFS visitation order is undefined. When `renameUses` function sorts `OpsToRename` (https://fburl.com/d2wubn60), the comparator assumes that the parent block of the operand has a corresponding dominator tree node. This is not the case for unreachable operands and crashes the compiler.
Reviewers: dberlin, mgrang, davide
Subscribers: efriedma, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61154
llvm-svn: 360796
| -rw-r--r-- | llvm/lib/Transforms/Utils/PredicateInfo.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/Transforms/Util/PredicateInfo/unreachable.ll | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/PredicateInfo.cpp b/llvm/lib/Transforms/Utils/PredicateInfo.cpp index 6f041ace6d1..bdf24d80bd1 100644 --- a/llvm/lib/Transforms/Utils/PredicateInfo.cpp +++ b/llvm/lib/Transforms/Utils/PredicateInfo.cpp @@ -473,7 +473,8 @@ void PredicateInfo::buildPredicateInfo() { } for (auto &Assume : AC.assumptions()) { if (auto *II = dyn_cast_or_null<IntrinsicInst>(Assume)) - processAssume(II, II->getParent(), OpsToRename); + if (DT.isReachableFromEntry(II->getParent())) + processAssume(II, II->getParent(), OpsToRename); } // Now rename all our operations. renameUses(OpsToRename); diff --git a/llvm/test/Transforms/Util/PredicateInfo/unreachable.ll b/llvm/test/Transforms/Util/PredicateInfo/unreachable.ll new file mode 100644 index 00000000000..010172debd2 --- /dev/null +++ b/llvm/test/Transforms/Util/PredicateInfo/unreachable.ll @@ -0,0 +1,25 @@ +; RUN: opt -print-predicateinfo < %s 2>&1 | FileCheck %s + +declare void @foo() +declare void @llvm.assume(i1) + +define void @bar(i32* %p) { +entry: +; CHECK-LABEL: @bar + br label %end + +unreachable1: + %v1 = load i32, i32* %p, align 4 + %c1 = icmp eq i32 %v1, 0 + call void @llvm.assume(i1 %c1) + br label %unreachable2 + +unreachable2: + %v2 = load i32, i32* %p, align 4 + %c2 = icmp eq i32 %v2, 0 + call void @llvm.assume(i1 %c2) + br label %end + +end: + ret void +} |

