diff options
author | Shuxin Yang <shuxin.llvm@gmail.com> | 2013-03-06 17:48:48 +0000 |
---|---|---|
committer | Shuxin Yang <shuxin.llvm@gmail.com> | 2013-03-06 17:48:48 +0000 |
commit | 985dac65791b9f6f631bdd51c18fe66592a67469 (patch) | |
tree | 9265b2aa99cf3753755535652b74ad4683c4bcaf /test/Analysis | |
parent | 186d8a3d67ccd2b2401c5d7d4e2cc15c4d1fdeae (diff) |
Memory Dependence Analysis (not mem-dep test) take advantage of "invariant.load" metadata.
The "invariant.load" metadata indicates the memory unit being accessed is immutable.
A load annotated with this metadata can be moved across any store.
As I am not sure if it is legal to move such loads across barrier/fence, this
change dose not allow such transformation.
rdar://11311484
Thank Arnold for code review.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176562 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/BasicAA/invariant_load.ll | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/test/Analysis/BasicAA/invariant_load.ll b/test/Analysis/BasicAA/invariant_load.ll new file mode 100644 index 0000000000..cd6ddb92d2 --- /dev/null +++ b/test/Analysis/BasicAA/invariant_load.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -basicaa -gvn -S | FileCheck %s + +; The input *.ll is obtained by manually annotating "invariant.load" to the +; two loads. With "invariant.load" metadata, the second load is redundant. +; +; int foo(int *p, char *q) { +; *q = (char)*p; +; return *p + 1; +; } + +define i32 @foo(i32* nocapture %p, i8* nocapture %q) { +entry: + %0 = load i32* %p, align 4, !tbaa !0, !invariant.load !3 + %conv = trunc i32 %0 to i8 + store i8 %conv, i8* %q, align 1, !tbaa !1 + %1 = load i32* %p, align 4, !tbaa !0, !invariant.load !3 + %add = add nsw i32 %1, 1 + ret i32 %add + +; CHECK: foo +; CHECK: %0 = load i32* %p +; CHECK: store i8 %conv, i8* %q, +; CHECK: %add = add nsw i32 %0, 1 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{} |