diff options
author | Christian Bruel <christian.bruel@st.com> | 2019-05-23 05:53:10 +0000 |
---|---|---|
committer | Christian Bruel <christian.bruel@st.com> | 2019-05-23 05:53:10 +0000 |
commit | 4a7da98bd9283e2e6aa635031d2f131493c8ad1a (patch) | |
tree | 2ff08590e70f08fc03533a362a29a80e2ea624e1 /llvm/test/Transforms/GlobalOpt/globalsra-struct.ll | |
parent | 202dc1291eae2add93207cbf788a64f4341b1c59 (diff) | |
download | bcm5719-llvm-4a7da98bd9283e2e6aa635031d2f131493c8ad1a.tar.gz bcm5719-llvm-4a7da98bd9283e2e6aa635031d2f131493c8ad1a.zip |
[GlobalOpt] recognize dead struct fields and propagate values
Summary:
Allow struct fields SRA and dead stores. This works by considering fields accesses from getElementPtr to be considered as a possible pointer root that can be cleaned up.
We check that the variable can be SRA by recursively checking the sub expressions with the new isSafeSubSROAGEP function.
basically this allows the array in following C code to be optimized out
struct Expr {
int a[2];
int b;
};
static struct Expr e;
int foo (int i)
{
e.b = 2;
e.a[i] = 1;
return e.b;
}
Reviewers: greened, bkramer, nicholas, jmolloy
Reviewed By: jmolloy
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61911
llvm-svn: 361460
Diffstat (limited to 'llvm/test/Transforms/GlobalOpt/globalsra-struct.ll')
-rw-r--r-- | llvm/test/Transforms/GlobalOpt/globalsra-struct.ll | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/globalsra-struct.ll b/llvm/test/Transforms/GlobalOpt/globalsra-struct.ll new file mode 100644 index 00000000000..957fba81068 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/globalsra-struct.ll @@ -0,0 +1,18 @@ +; RUN: opt < %s -globalopt -S | FileCheck %s + +%struct.Expr = type { [1 x i32], i32 } + +@e = internal global %struct.Expr zeroinitializer, align 4 +; CHECK-NOT: @e = internal global %struct.Expr zeroinitializer, align 4 + +define dso_local i32 @foo(i32 %i) { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32, i32* %i.addr, align 4 + %arrayidx = getelementptr inbounds [1 x i32], [1 x i32]* getelementptr inbounds (%struct.Expr, %struct.Expr* @e, i32 0, i32 0), i32 0, i32 %0 + store i32 57005, i32* %arrayidx, align 4 + %1 = load i32, i32* getelementptr inbounds (%struct.Expr, %struct.Expr* @e, i32 0, i32 1), align 4 + ret i32 %1 +; CHECK: ret i32 0 +} |