From d3eb51f0626cc86af904bfbdb061fecbd90ffdc5 Mon Sep 17 00:00:00 2001 From: Juneyoung Lee Date: Wed, 13 May 2020 00:37:38 +0900 Subject: [PATCH] [ValueTracking] Fix crash in isGuaranteedNotToBeUndefOrPoison when V is in an unreachable block Summary: This fixes PR45885 by fixing isGuaranteedNotToBeUndefOrPoison so it does not look into dominating branch conditions of V when V is an instruction in an unreachable block. Reviewers: spatel, nikic, lebedev.ri Reviewed By: nikic Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D79790 --- llvm/lib/Analysis/ValueTracking.cpp | 7 ++++++- .../test/Transforms/DivRemPairs/PowerPC/pr45885.ll | 24 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/DivRemPairs/PowerPC/pr45885.ll diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 691e452..a4b0202 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4821,12 +4821,17 @@ bool llvm::isGuaranteedNotToBeUndefOrPoison(const Value *V, if (!CtxI || !CtxI->getParent() || !DT) return false; + auto *DNode = DT->getNode(CtxI->getParent()); + if (!DNode) + // Unreachable block + return false; + // If V is used as a branch condition before reaching CtxI, V cannot be // undef or poison. // br V, BB1, BB2 // BB1: // CtxI ; V cannot be undef or poison here - auto Dominator = DT->getNode(CtxI->getParent())->getIDom(); + auto *Dominator = DNode->getIDom(); while (Dominator) { auto *TI = Dominator->getBlock()->getTerminator(); diff --git a/llvm/test/Transforms/DivRemPairs/PowerPC/pr45885.ll b/llvm/test/Transforms/DivRemPairs/PowerPC/pr45885.ll new file mode 100644 index 0000000..666c4b4 --- /dev/null +++ b/llvm/test/Transforms/DivRemPairs/PowerPC/pr45885.ll @@ -0,0 +1,24 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -div-rem-pairs -S -mtriple=powerpc64-unknown-unknown | FileCheck %s + +define void @g() { +; CHECK-LABEL: @g( +; CHECK-NEXT: if.end: +; CHECK-NEXT: ret void +; CHECK: for.cond: +; CHECK-NEXT: [[TMP0:%.*]] = mul i16 [[DIV_I:%.*]], [[REM_FROZEN:%.*]] +; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i16 1, [[TMP0]] +; CHECK-NEXT: [[REM_FROZEN]] = freeze i16 [[REM_DECOMPOSED]] +; CHECK-NEXT: [[DIV_I]] = sdiv i16 1, [[REM_FROZEN]] +; CHECK-NEXT: br label [[FOR_COND:%.*]] +; +if.end: + ret void + +for.cond: ; preds = %for.cond + %rem = srem i16 1, %rem + %div.i = sdiv i16 1, %rem + br label %for.cond +} + + -- 2.7.4