<div dir="ltr">Doesn't AA have an existing API that gives you exactly the info you want here (Does this call ref the memory touched the things in the store list)<div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 15, 2016 at 4:47 PM, Nicolai Hähnle <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">nhaehnle created this revision.<br>
nhaehnle added reviewers: hfinkel, majnemer, tstellarAMD, sunfish.<br>
nhaehnle added a subscriber: llvm-commits.<br>
<br>
This is conservative because it doesn't consider the argmemonly attribute.<br>
Perhaps somebody who knows this part of the code better can improve this<br>
in a separate patch. For now, it fixes a real miscompilation I encountered<br>
in the AMDGPU backend.<br>
<br>
<a href="http://reviews.llvm.org/D17279" rel="noreferrer" target="_blank">http://reviews.llvm.org/D17279</a><br>
<br>
Files:<br>
  lib/Transforms/Scalar/Sink.cpp<br>
  test/Transforms/Sink/call.ll<br>
<br>
Index: test/Transforms/Sink/call.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/Transforms/Sink/call.ll<br>
@@ -0,0 +1,68 @@<br>
+; RUN: opt < %s -basicaa -sink -S | FileCheck %s<br>
+<br>
+declare i32 @f_load_global() nounwind readonly<br>
+declare void @f_store_global(i32) nounwind<br>
+declare i32 @f_readnone(i32) nounwind readnone<br>
+<br>
+@A = external global i32<br>
+<br>
+; Sink readonly call if no stores are in the way.<br>
+;<br>
+; CHECK-LABEL: @test1(<br>
+; CHECK: true:<br>
+; CHECK-NEXT: %l = call i32 @f_load_global<br>
+; CHECK-NEXT: ret i32 %l<br>
+define i32 @test1(i1 %z) {<br>
+  %l = call i32 @f_load_global()<br>
+  br i1 %z, label %true, label %false<br>
+true:<br>
+  ret i32 %l<br>
+false:<br>
+  ret i32 0<br>
+}<br>
+<br>
+; But don't sink if there is a store ...<br>
+;<br>
+; CHECK-LABEL: @test2(<br>
+; CHECK: call i32 @f_load_global<br>
+; CHECK-NEXT: store i32<br>
+define i32 @test2(i1 %z) {<br>
+  %l = call i32 @f_load_global()<br>
+  store i32 0, i32* @A<br>
+  br i1 %z, label %true, label %false<br>
+true:<br>
+  ret i32 %l<br>
+false:<br>
+  ret i32 0<br>
+}<br>
+<br>
+; ... or a non-readonly call<br>
+;<br>
+; CHECK-LABEL: @test3(<br>
+; CHECK: call i32 @f_load_global<br>
+; CHECK-NEXT: call void @f_store_global<br>
+define i32 @test3(i1 %z) {<br>
+  %l = call i32 @f_load_global()<br>
+  call void @f_store_global(i32 0)<br>
+  br i1 %z, label %true, label %false<br>
+true:<br>
+  ret i32 %l<br>
+false:<br>
+  ret i32 0<br>
+}<br>
+<br>
+; readnone calls are sunk across stores.<br>
+;<br>
+; CHECK-LABEL: @test4(<br>
+; CHECK: true:<br>
+; CHECK-NEXT: %l = call i32 @f_readnone(<br>
+; CHECK-NEXT: ret i32 %l<br>
+define i32 @test4(i1 %z) {<br>
+  %l = call i32 @f_readnone(i32 0)<br>
+  store i32 0, i32* @A<br>
+  br i1 %z, label %true, label %false<br>
+true:<br>
+  ret i32 %l<br>
+false:<br>
+  ret i32 0<br>
+}<br>
Index: lib/Transforms/Scalar/Sink.cpp<br>
===================================================================<br>
--- lib/Transforms/Scalar/Sink.cpp<br>
+++ lib/Transforms/Scalar/Sink.cpp<br>
@@ -173,11 +173,14 @@<br>
       Inst->mayThrow())<br>
     return false;<br>
<br>
-  // Convergent operations cannot be made control-dependent on additional<br>
-  // values.<br>
   if (auto CS = CallSite(Inst)) {<br>
+    // Convergent operations cannot be made control-dependent on additional<br>
+    // values.<br>
     if (CS.hasFnAttr(Attribute::Convergent))<br>
       return false;<br>
+<br>
+    if (Inst->mayReadFromMemory() && !Stores.empty())<br>
+      return false;<br>
   }<br>
<br>
   return true;<br>
<br>
<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>