From c24f456857358d4de05227c39502d2144b7aab6a Mon Sep 17 00:00:00 2001 From: Alina Sbirlea Date: Thu, 10 Oct 2019 20:43:06 +0000 Subject: [PATCH] [MemorySSA] Additional handling of unreachable blocks. Summary: Whenever we get the previous definition, the assumption is that the recursion starts ina reachable block. If the recursion starts in an unreachable block, we may recurse indefinitely. Handle this case by returning LoE if the block is unreachable. Resolves PR43426. Reviewers: george.burgess.iv Subscribers: Prazek, sanjoy.google, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68809 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374447 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/MemorySSAUpdater.cpp | 4 +++ test/Analysis/MemorySSA/pr43426.ll | 40 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/Analysis/MemorySSA/pr43426.ll diff --git a/lib/Analysis/MemorySSAUpdater.cpp b/lib/Analysis/MemorySSAUpdater.cpp index 78e197aad55..ce74c708df1 100644 --- a/lib/Analysis/MemorySSAUpdater.cpp +++ b/lib/Analysis/MemorySSAUpdater.cpp @@ -48,6 +48,10 @@ MemoryAccess *MemorySSAUpdater::getPreviousDefRecursive( return Cached->second; } + // If this method is called from an unreachable block, return LoE. + if (!MSSA->DT->isReachableFromEntry(BB)) + return MSSA->getLiveOnEntryDef(); + if (BasicBlock *Pred = BB->getSinglePredecessor()) { // Single predecessor case, just recurse, we can only have one definition. MemoryAccess *Result = getPreviousDefFromEnd(Pred, CachedPreviousDef); diff --git a/test/Analysis/MemorySSA/pr43426.ll b/test/Analysis/MemorySSA/pr43426.ll new file mode 100644 index 00000000000..f603c32cf8d --- /dev/null +++ b/test/Analysis/MemorySSA/pr43426.ll @@ -0,0 +1,40 @@ +; RUN: opt -licm -enable-mssa-loop-dependency -S %s | FileCheck %s +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: @d() +define dso_local void @d() { +entry: + br label %header + +header: + store i32 1, i32* null, align 4 + br i1 true, label %cleanup53, label %body + +body: + br i1 undef, label %cleanup31, label %for.cond11 + +for.cond11: ; Needs branch as is + br i1 undef, label %unreachable, label %latch + +cleanup31: + br label %unreachable + +deadblock: + br i1 undef, label %unreachable, label %deadblock + +cleanup53: + %val = load i32, i32* null, align 4 + %cmpv = icmp eq i32 %val, 0 + br i1 %cmpv, label %cleanup63, label %latch + +latch: + br label %header + +cleanup63: + ret void + +unreachable: + unreachable +} + -- 2.40.0