From eb040cc55f670fbb9087a5d5bf2bd1b3aa1dd403 Mon Sep 17 00:00:00 2001 From: James Molloy Date: Mon, 25 Apr 2016 10:48:29 +0000 Subject: [GlobalOpt] Allow constant globals to be SRA'd The current logic assumes that any constant global will never be SRA'd. I presume this is because normally constant globals can be pushed into their uses and deleted. However, that sometimes can't happen (which is where you really want SRA, so the elements that can be eliminated, are!). There seems to be no reason why we can't SRA constants too, so let's do it. llvm-svn: 267393 --- llvm/test/Transforms/GlobalOpt/globalsra.ll | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'llvm/test/Transforms/GlobalOpt/globalsra.ll') diff --git a/llvm/test/Transforms/GlobalOpt/globalsra.ll b/llvm/test/Transforms/GlobalOpt/globalsra.ll index d593fcd9e15..7d43c382d9e 100644 --- a/llvm/test/Transforms/GlobalOpt/globalsra.ll +++ b/llvm/test/Transforms/GlobalOpt/globalsra.ll @@ -22,3 +22,24 @@ define double @constantize() { ret double %X } +@G2 = internal constant { i32, float, { double } } { + i32 1, + float 1.000000e+00, + { double } { double 1.727000e+01 } } ; <{ i32, float, { double } }*> [#uses=3] + +define void @onlystore2() { + store i32 123, i32* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 0) + ret void +} + +define float @storeinit2() { + store float 1.000000e+00, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 1) + %X = load float, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 1) ; [#uses=1] + ret float %X +} + +define double @constantize2() { + %X = load double, double* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 2, i32 0) ; [#uses=1] + ret double %X +} + -- cgit v1.2.3