From 7a5c0e599c95eed4df347643579d038fcb6e1eac Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Tue, 5 May 2015 18:10:49 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236511 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/BasicAliasAnalysis.cpp | 5 +++++ test/Transforms/GVN/basic-undef-test.ll | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/Transforms/GVN/basic-undef-test.ll diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 2767e41bee0..9fe744604b1 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -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(V1) || isa(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 index 00000000000..4f940956780 --- /dev/null +++ b/test/Transforms/GVN/basic-undef-test.ll @@ -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 +} -- 2.34.1