From c8e19fcc1c1d95802f1fd227078d4847e12b2098 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Fri, 10 Jun 2016 21:36:41 +0000 Subject: [PATCH] MemorySSA: fix memory access local dominance function for live on entry A memory access defined on function entry cannot be locally dominated by another memory access. The patch was split from http://reviews.llvm.org/D19338 which exposes the problem. Differential Revision: http://reviews.llvm.org/D21039 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272436 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/MemorySSA.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/Transforms/Utils/MemorySSA.cpp b/lib/Transforms/Utils/MemorySSA.cpp index 5946b99d146..85d21b1007e 100644 --- a/lib/Transforms/Utils/MemorySSA.cpp +++ b/lib/Transforms/Utils/MemorySSA.cpp @@ -623,6 +623,21 @@ bool MemorySSA::locallyDominates(const MemoryAccess *Dominator, assert((Dominator->getBlock() == Dominatee->getBlock()) && "Asking for local domination when accesses are in different blocks!"); + + // A node dominates itself. + if (Dominatee == Dominator) + return true; + + // When Dominatee is defined on function entry, it is not dominated by another + // memory access. + if (isLiveOnEntryDef(Dominatee)) + return false; + + // When Dominator is defined on function entry, it dominates the other memory + // access. + if (isLiveOnEntryDef(Dominator)) + return true; + // Get the access list for the block const AccessListType *AccessList = getBlockAccesses(Dominator->getBlock()); AccessListType::const_reverse_iterator It(Dominator->getIterator()); -- 2.50.1