From 4e9082ef95db5d760df4cce00a4351fa122176d6 Mon Sep 17 00:00:00 2001 From: Alina Sbirlea Date: Tue, 17 Sep 2019 16:33:35 +0000 Subject: [PATCH] [MemorySSA] Fix phi insertion when inserting a def. Summary: When inserting a Def, the current algorithm is walking edges backward and inserting new Phis where needed. There may be additional Phis needed in the IDF of the newly inserted Def and Phis. Adding Phis in the IDF of the Def was added ina previous patch, but we may also need other Phis in the IDF of the newly added Phis. Reviewers: george.burgess.iv Subscribers: Prazek, sanjoy.google, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67637 llvm-svn: 372138 --- llvm/lib/Analysis/MemorySSAUpdater.cpp | 3 +++ llvm/test/Analysis/MemorySSA/pr43320.ll | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 llvm/test/Analysis/MemorySSA/pr43320.ll diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp index b29be09..94417dc 100644 --- a/llvm/lib/Analysis/MemorySSAUpdater.cpp +++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp @@ -339,6 +339,9 @@ void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) { ForwardIDFCalculator IDFs(*MSSA->DT); SmallVector IDFBlocks; SmallPtrSet DefiningBlocks; + for (const auto &VH : InsertedPHIs) + if (const auto *RealPHI = cast_or_null(VH)) + DefiningBlocks.insert(RealPHI->getBlock()); DefiningBlocks.insert(MD->getBlock()); IDFs.setDefiningBlocks(DefiningBlocks); IDFs.calculate(IDFBlocks); diff --git a/llvm/test/Analysis/MemorySSA/pr43320.ll b/llvm/test/Analysis/MemorySSA/pr43320.ll new file mode 100644 index 0000000..6aca3f9 --- /dev/null +++ b/llvm/test/Analysis/MemorySSA/pr43320.ll @@ -0,0 +1,33 @@ +; RUN: opt -licm -enable-mssa-loop-dependency -verify-memoryssa -S < %s | FileCheck %s +; REQUIRES: asserts + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-none-eabi" + +; CHECK-LABEL: @e() +define void @e() { +entry: + br label %g + +g: ; preds = %cleanup, %entry + %0 = load i32, i32* null, align 4 + %and = and i32 %0, undef + store i32 %and, i32* null, align 4 + br i1 undef, label %if.end8, label %if.then + +if.then: ; preds = %g + br i1 undef, label %k, label %cleanup + +k: ; preds = %if.end8, %if.then + br i1 undef, label %if.end8, label %cleanup + +if.end8: ; preds = %k, %g + br i1 undef, label %for.cond.preheader, label %k + +for.cond.preheader: ; preds = %if.end8 + unreachable + +cleanup: ; preds = %k, %if.then + br label %g +} + -- 2.7.4