Update BasicAliasAnalysis to understand that nothing aliases with undef values.
authorDaniel Berlin <dberlin@dberlin.org>
Tue, 5 May 2015 18:10:49 +0000 (18:10 +0000)
committerDaniel Berlin <dberlin@dberlin.org>
Tue, 5 May 2015 18:10:49 +0000 (18:10 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236511 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicAliasAnalysis.cpp
test/Transforms/GVN/basic-undef-test.ll [new file with mode: 0644]

index 2767e41bee04b769651dbdfbb9b8d633bbbe527a..9fe744604b1f09940c2ae04dced2c641a3afa91d 100644 (file)
@@ -1389,6 +1389,11 @@ BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size,
   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
diff --git a/test/Transforms/GVN/basic-undef-test.ll b/test/Transforms/GVN/basic-undef-test.ll
new file mode 100644 (file)
index 0000000..4f94095
--- /dev/null
@@ -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
+}