summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/GlobalOpt/globalsra-struct.ll
diff options
context:
space:
mode:
authorChristian Bruel <christian.bruel@st.com>2019-05-23 05:53:10 +0000
committerChristian Bruel <christian.bruel@st.com>2019-05-23 05:53:10 +0000
commit4a7da98bd9283e2e6aa635031d2f131493c8ad1a (patch)
tree2ff08590e70f08fc03533a362a29a80e2ea624e1 /llvm/test/Transforms/GlobalOpt/globalsra-struct.ll
parent202dc1291eae2add93207cbf788a64f4341b1c59 (diff)
downloadbcm5719-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.ll18
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
+}
OpenPOWER on IntegriCloud