From b82f80057d69564a889f1439a683c3544d30b7fa Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Wed, 28 Oct 2020 11:01:25 +0000 Subject: [PATCH] [DSE] Use walker to skip noalias stores between current & clobber def. Instead of getting the defining access we should be able to use getClobberingMemoryAccess to skip non-aliasing MemoryDefs. No additional checks should be needed, because we only remove the starting def if it matches the defining access of the load. All we need to worry about is that there are no (may)alias stores between the starting def and the load and getClobberingMemoryAccess should guarantee that. Partly fixes PR47887. This improves the number of redundant stores removed in some cases (numbers below for MultiSource, SPEC2000, SPEC2006 on X86 with -flto -O3). Same hash: 226 (filtered out) Remaining: 11 Metric: dse.NumRedundantStores Program base patch1 diff test-suite...:: External/Povray/povray.test 1.00 5.00 400.0% test-suite...chmarks/MallocBench/gs/gs.test 1.00 3.00 200.0% test-suite...0/253.perlbmk/253.perlbmk.test 21.00 37.00 76.2% test-suite...0.perlbench/400.perlbench.test 24.00 37.00 54.2% test-suite.../Applications/SPASS/SPASS.test 3.00 4.00 33.3% test-suite...006/453.povray/453.povray.test 15.00 18.00 20.0% test-suite...T2006/445.gobmk/445.gobmk.test 27.00 29.00 7.4% test-suite.../CINT2006/403.gcc/403.gcc.test 136.00 137.00 0.7% test-suite.../CINT2000/176.gcc/176.gcc.test 6.00 6.00 0.0% test-suite.../Benchmarks/Bullet/bullet.test NaN 3.00 nan% test-suite.../Benchmarks/Ptrdist/bc/bc.test NaN 1.00 nan% Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D89647 --- llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 3 ++- llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index 75cd65b..2738050 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -2426,7 +2426,8 @@ struct DSEState { // adding them to a worklist. Bail when we run into a memory def that // does not match LoadAccess. SetVector ToCheck; - MemoryAccess *Current = Def->getDefiningAccess(); + MemoryAccess *Current = + MSSA.getWalker()->getClobberingMemoryAccess(Def); // We don't want to bail when we run into the store memory def. But, // the phi access may point to it. So, pretend like we've already // checked it. diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll b/llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll index 22bf395..97fa988 100644 --- a/llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll +++ b/llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll @@ -15,7 +15,6 @@ declare void @llvm.init.trampoline(i8*, i8*, i8*) define void @test_load_volatile(i32* %Q) { ; CHECK-LABEL: @test_load_volatile( ; CHECK-NEXT: [[A:%.*]] = load volatile i32, i32* [[Q:%.*]], align 4 -; CHECK-NEXT: store i32 [[A]], i32* [[Q]], align 4 ; CHECK-NEXT: ret void ; %a = load volatile i32, i32* %Q @@ -284,9 +283,7 @@ bb3: define void @test_noalias_store_between_load_and_store(i32* noalias %x, i32* noalias %y) { ; CHECK-LABEL: @test_noalias_store_between_load_and_store( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[LV:%.*]] = load i32, i32* [[X:%.*]], align 4 ; CHECK-NEXT: store i32 0, i32* [[Y:%.*]], align 4 -; CHECK-NEXT: store i32 [[LV]], i32* [[X]], align 4 ; CHECK-NEXT: ret void ; entry: -- 2.7.4