[GlobalOpt] recognize dead struct fields and propagate values
authorChristian Bruel <christian.bruel@st.com>
Thu, 23 May 2019 05:53:10 +0000 (05:53 +0000)
committerChristian Bruel <christian.bruel@st.com>
Thu, 23 May 2019 05:53:10 +0000 (05:53 +0000)
commit4a7da98bd9283e2e6aa635031d2f131493c8ad1a
tree2ff08590e70f08fc03533a362a29a80e2ea624e1
parent202dc1291eae2add93207cbf788a64f4341b1c59
[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
llvm/lib/Transforms/IPO/GlobalOpt.cpp
llvm/test/Transforms/GlobalOpt/globalsra-multigep.ll
llvm/test/Transforms/GlobalOpt/globalsra-struct.ll [new file with mode: 0644]