[PATCH] D16225: [BasicAliasAnalysis] Take into account operand bundles in the getModRefInfo function

Igor Laevsky via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 15 07:37:40 PST 2016


igor-laevsky created this revision.
igor-laevsky added reviewers: reames, hfinkel, sanjoy.
igor-laevsky added a subscriber: llvm-commits.
igor-laevsky set the repository for this revision to rL LLVM.

In the getModRefInfo we were checking aliasing only for the actual call arguments. For cases when aliasing value was only used in the operand bundle we were returning NoModRef result (which is incorrect).

Repository:
  rL LLVM

http://reviews.llvm.org/D16225

Files:
  lib/Analysis/BasicAliasAnalysis.cpp
  test/Transforms/DeadStoreElimination/operand-bundles.ll

Index: test/Transforms/DeadStoreElimination/operand-bundles.ll
===================================================================
--- test/Transforms/DeadStoreElimination/operand-bundles.ll
+++ test/Transforms/DeadStoreElimination/operand-bundles.ll
@@ -0,0 +1,31 @@
+; RUN: opt < %s -basicaa -dse -S | FileCheck %s
+
+declare noalias i8* @malloc(i64) "malloc-like"
+
+declare void @foo()
+declare void @bar(i8*)
+
+define void @test() {
+  %obj = call i8* @malloc(i64 8)
+  store i8 0, i8* %obj
+  ; don't remove store. %obj should be treated like it will be read by the @foo.
+  ; CHECK: store i8 0, i8* %obj
+  call void @foo() ["deopt" (i8* %obj)]
+  ret void
+}
+
+define void @test1() {
+  %obj = call i8* @malloc(i64 8)
+  store i8 0, i8* %obj
+  ; CHECK: store i8 0, i8* %obj
+  call void @bar(i8* nocapture %obj)
+  ret void
+}
+
+define void @test2() {
+  %obj = call i8* @malloc(i64 8)
+  store i8 0, i8* %obj
+  ; CHECK-NOT: store i8 0, i8* %obj
+  call void @foo()
+  ret void
+}
Index: lib/Analysis/BasicAliasAnalysis.cpp
===================================================================
--- lib/Analysis/BasicAliasAnalysis.cpp
+++ lib/Analysis/BasicAliasAnalysis.cpp
@@ -718,7 +718,7 @@
       isNonEscapingLocalObject(Object)) {
     bool PassedAsArg = false;
     unsigned ArgNo = 0;
-    for (ImmutableCallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end();
+    for (auto CI = CS.data_operands_begin(), CE = CS.data_operands_end();
          CI != CE; ++CI, ++ArgNo) {
       // Only look at the no-capture or byval pointer arguments.  If this
       // pointer were passed to arguments that were neither of these, then it


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16225.44988.patch
Type: text/x-patch
Size: 1652 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160115/66617743/attachment.bin>


More information about the llvm-commits mailing list