[PATCH] D22001: [DSE] Remove dead stores in end blocks containing fence

Anna Thomas via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 6 06:33:01 PDT 2016


anna updated this revision to Diff 62856.
anna marked an inline comment as done.
anna updated the summary for this revision.
anna added a comment.

Updated comment on skipping fence, moved the check to below CallSite check.


http://reviews.llvm.org/D22001

Files:
  lib/Transforms/Scalar/DeadStoreElimination.cpp
  test/Transforms/DeadStoreElimination/fence.ll

Index: test/Transforms/DeadStoreElimination/fence.ll
===================================================================
--- test/Transforms/DeadStoreElimination/fence.ll
+++ test/Transforms/DeadStoreElimination/fence.ll
@@ -46,3 +46,45 @@
   store i32 5, i32* %addr.i, align 4
   ret void
 }
+
+; We DSE stack alloc'ed pointer operands, byval attributes, and calloc-like operations at end blocks (contains no successors) irrespective of fence ordering.
+; The store to %addr.i can be removed since it is a byval attribute
+define void @test3(i32* byval %addr.i) {
+; CHECK-LABEL: @test3
+; CHECK-NOT: store
+; CHECK: fence
+; CHECK: ret
+  store i32 5, i32* %addr.i, align 4
+  fence release
+  ret void
+}
+
+declare void @foo(i8* nocapture %p)
+
+declare noalias i8* @malloc(i32)
+define void @test_nocapture() {
+; CHECK-LABEL: @test_nocapture
+; CHECK: malloc
+; CHECK: foo
+; CHECK-NOT: store
+; CHECK: fence
+  %m  =  call i8* @malloc(i32 24)
+  call void @foo(i8* %m)
+  store i8 4, i8* %m
+  fence release
+  ret void
+} 
+
+
+; This is a full fence, but since the stores is to stack allocated location, we can remove the stores (and leave the fence as-is).
+define void @fence_seq_cst(i32* %P2) {
+; CHECK-LABEL: @fence_seq_cst
+; CHECK-NEXT: fence seq_cst
+; CHECK-NEXT: ret void
+  %P1 = alloca i32
+  store i32 0, i32* %P1, align 4
+  fence seq_cst
+  store i32 4, i32* %P1, align 4
+  ret void
+}
+
Index: lib/Transforms/Scalar/DeadStoreElimination.cpp
===================================================================
--- lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -771,6 +771,14 @@
       continue;
     }
 
+    // We can remove the dead stores in the end basic block, irrespective of the
+    // fence and its ordering (release/acquire/seq_cst). Fences only constraints
+    // the ordering of already visible stores, it does not make a store visible
+    // to other threads. So, skipping over a fence does not change a store from
+    // being dead.
+    if (isa<FenceInst>(&*BBI))
+      continue;
+
     MemoryLocation LoadedLoc;
 
     // If we encounter a use of the pointer, it is no longer considered dead


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22001.62856.patch
Type: text/x-patch
Size: 2192 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160706/6495e90b/attachment.bin>


More information about the llvm-commits mailing list