summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorJames Molloy <james.molloy@arm.com>2015-11-19 18:04:33 +0000
committerJames Molloy <james.molloy@arm.com>2015-11-19 18:04:33 +0000
commit1d695a09ddd39d4163f9d08d250309865be7630f (patch)
treee2234f231e552b58ead2598ac1c8c661da18251b /llvm/test/Transforms
parentc7157bfd55dd04788af6abb04d0d2910634a9aa3 (diff)
downloadbcm5719-llvm-1d695a09ddd39d4163f9d08d250309865be7630f.tar.gz
bcm5719-llvm-1d695a09ddd39d4163f9d08d250309865be7630f.zip
[GlobalOpt] Localize some globals that have non-instruction users
We currently bail out of global localization if the global has non-instruction users. However, often these can be simple bitcasts or constant-GEPs, which we can easily turn into instructions before localizing. Be a bit more aggressive. llvm-svn: 253584
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/GlobalOpt/localize-constexpr.ll28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/localize-constexpr.ll b/llvm/test/Transforms/GlobalOpt/localize-constexpr.ll
new file mode 100644
index 00000000000..6754533a50c
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/localize-constexpr.ll
@@ -0,0 +1,28 @@
+; RUN: opt -S < %s -globalopt | FileCheck %s
+
+@G = internal global i32 42
+
+define i8 @f() norecurse {
+; CHECK-LABEL: @f
+; CHECK: alloca
+; CHECK-NOT: @G
+; CHECK: }
+ store i32 42, i32* @G
+ %a = load i8, i8* bitcast (i32* @G to i8*)
+ ret i8 %a
+}
+
+@H = internal global i32 42
+@Halias = internal alias i32, i32* @H
+
+; @H can't be localized because @Halias uses it, and @Halias can't be converted to an instruction.
+define i8 @g() norecurse {
+; CHECK-LABEL: @g
+; CHECK-NOT: alloca
+; CHECK: @H
+; CHECK: }
+ store i32 42, i32* @H
+ %a = load i8, i8* bitcast (i32* @H to i8*)
+ ret i8 %a
+}
+
OpenPOWER on IntegriCloud