[llvm] r236511 - Update BasicAliasAnalysis to understand that nothing aliases with undef values.

Daniel Berlin dberlin at dberlin.org
Tue May 5 11:10:49 PDT 2015


Author: dannyb
Date: Tue May  5 13:10:49 2015
New Revision: 236511

URL: http://llvm.org/viewvc/llvm-project?rev=236511&view=rev
Log:
Update BasicAliasAnalysis to understand that nothing aliases with undef values.
It got this in some cases (if one of them was an identified object), but not in all cases.

This caused stores to undef to block load-forwarding in some cases, etc.

Added test to Transforms/GVN to verify optimization occurs as expected.

Added:
    llvm/trunk/test/Transforms/GVN/basic-undef-test.ll
Modified:
    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp

Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=236511&r1=236510&r2=236511&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Tue May  5 13:10:49 2015
@@ -1389,6 +1389,11 @@ BasicAliasAnalysis::aliasCheck(const Val
   V1 = V1->stripPointerCasts();
   V2 = V2->stripPointerCasts();
 
+  // If V1 or V2 is undef, the result is NoAlias because we can always pick a
+  // value for undef that aliases nothing in the program.
+  if (isa<UndefValue>(V1) || isa<UndefValue>(V2))
+    return NoAlias;
+
   // Are we checking for alias of the same value?
   // Because we look 'through' phi nodes we could look at "Value" pointers from
   // different iterations. We must therefore make sure that this is not the

Added: llvm/trunk/test/Transforms/GVN/basic-undef-test.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/basic-undef-test.ll?rev=236511&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/basic-undef-test.ll (added)
+++ llvm/trunk/test/Transforms/GVN/basic-undef-test.ll Tue May  5 13:10:49 2015
@@ -0,0 +1,15 @@
+; RUN: opt -basicaa -gvn -S < %s | FileCheck %s
+; ModuleID = 'test3.ll'
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+
+define i32 @main(i32 *%foo)  {
+entry:
+; CHECK: load i32, i32* %foo, align 4
+  %0 = load i32, i32* %foo, align 4
+  store i32 5, i32* undef, align 4
+; CHECK-NOT: load i32, i32* %foo, align 4
+  %1 = load i32, i32* %foo, align 4
+; CHECK: add i32 %0, %0
+  %2 = add i32 %0, %1
+  ret i32 %2
+}





More information about the llvm-commits mailing list