From 9d020de3e867e17101299dcd278bacc1365dce25 Mon Sep 17 00:00:00 2001 From: Taewook Oh Date: Wed, 15 May 2019 19:35:38 +0000 Subject: [PATCH] [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 --- llvm/lib/Transforms/Utils/PredicateInfo.cpp | 3 ++- .../Transforms/Util/PredicateInfo/unreachable.ll | 25 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/Util/PredicateInfo/unreachable.ll diff --git a/llvm/lib/Transforms/Utils/PredicateInfo.cpp b/llvm/lib/Transforms/Utils/PredicateInfo.cpp index 6f041ac..bdf24d8 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(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 0000000..010172d --- /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 +} -- 2.7.4