diff options
| author | James Molloy <james.molloy@arm.com> | 2015-10-28 10:41:29 +0000 |
|---|---|---|
| committer | James Molloy <james.molloy@arm.com> | 2015-10-28 10:41:29 +0000 |
| commit | c67dec690f7a26522c22bdec569a888788a315d6 (patch) | |
| tree | 5731c7ecf60286df5a8c0a729bf589ea73bde88f /llvm/test/Analysis/GlobalsModRef | |
| parent | 89ea433bd63f8d027fc66d6dbc4153464a65ec10 (diff) | |
| download | bcm5719-llvm-c67dec690f7a26522c22bdec569a888788a315d6.tar.gz bcm5719-llvm-c67dec690f7a26522c22bdec569a888788a315d6.zip | |
[GlobalsAA] An indirect global that is initialized is not fair game
When checking if an indirect global (a global with pointer type) is only assigned by allocation functions, first check if the global is itself initialized. If it is, it's not only assigned by allocation functions.
This fixes PR25309. Thanks to David Majnemer for reducing the test case!
llvm-svn: 251508
Diffstat (limited to 'llvm/test/Analysis/GlobalsModRef')
| -rw-r--r-- | llvm/test/Analysis/GlobalsModRef/pr25309.ll | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/test/Analysis/GlobalsModRef/pr25309.ll b/llvm/test/Analysis/GlobalsModRef/pr25309.ll new file mode 100644 index 00000000000..ce3b498c802 --- /dev/null +++ b/llvm/test/Analysis/GlobalsModRef/pr25309.ll @@ -0,0 +1,27 @@ +; RUN: opt -globals-aa -gvn < %s -S | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; @o and @m are initialized to @i, so they should not be classed as +; indirect globals referring only to allocation functions. +@o = internal global i32* @i, align 8 +@m = internal global i32* @i, align 8 +@i = internal global i32 0, align 4 + +; CHECK-LABEL: @f +define i1 @f() { +entry: + %0 = load i32*, i32** @o, align 8 + store i32 0, i32* %0, align 4 + %1 = load volatile i32*, i32** @m, align 8 + store i32 1, i32* %1, align 4 + ; CHECK: %[[a:.*]] = load i32* + %2 = load i32*, i32** @o, align 8 + ; CHECK: %[[b:.*]] = load i32, i32* %[[a]] + %3 = load i32, i32* %2, align 4 + ; CHECK: %[[c:.*]] = icmp ne i32 %[[b]], 0 + %tobool.i = icmp ne i32 %3, 0 + ; CHECK: ret i1 %[[c]] + ret i1 %tobool.i +}
\ No newline at end of file |

