summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/GlobalOpt
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/GlobalOpt')
-rw-r--r--llvm/test/Transforms/GlobalOpt/.cvsignore3
-rw-r--r--llvm/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx17
-rw-r--r--llvm/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll9
-rw-r--r--llvm/test/Transforms/GlobalOpt/2005-09-27-Crash.ll28
-rw-r--r--llvm/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll138
-rw-r--r--llvm/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll33
-rw-r--r--llvm/test/Transforms/GlobalOpt/basictest.llx9
-rw-r--r--llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll98
-rw-r--r--llvm/test/Transforms/GlobalOpt/deadglobal-2.llx11
-rw-r--r--llvm/test/Transforms/GlobalOpt/deadglobal.llx8
-rw-r--r--llvm/test/Transforms/GlobalOpt/dg.exp3
-rw-r--r--llvm/test/Transforms/GlobalOpt/globalsra-partial.llx23
-rw-r--r--llvm/test/Transforms/GlobalOpt/globalsra.llx19
-rw-r--r--llvm/test/Transforms/GlobalOpt/integer-bool.ll23
-rw-r--r--llvm/test/Transforms/GlobalOpt/iterate.llx10
-rw-r--r--llvm/test/Transforms/GlobalOpt/load-store-global.llx14
-rw-r--r--llvm/test/Transforms/GlobalOpt/malloc-promote-1.llx18
-rw-r--r--llvm/test/Transforms/GlobalOpt/malloc-promote-2.llx20
-rw-r--r--llvm/test/Transforms/GlobalOpt/malloc-promote-3.llx26
-rw-r--r--llvm/test/Transforms/GlobalOpt/memcpy.ll17
-rw-r--r--llvm/test/Transforms/GlobalOpt/memset.ll21
-rw-r--r--llvm/test/Transforms/GlobalOpt/phi-select.llx29
-rw-r--r--llvm/test/Transforms/GlobalOpt/storepointer-compare.llx28
-rw-r--r--llvm/test/Transforms/GlobalOpt/storepointer.llx20
-rw-r--r--llvm/test/Transforms/GlobalOpt/trivialstore.llx17
-rw-r--r--llvm/test/Transforms/GlobalOpt/undef-init.llx18
26 files changed, 660 insertions, 0 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/.cvsignore b/llvm/test/Transforms/GlobalOpt/.cvsignore
new file mode 100644
index 00000000000..7f2443f2f31
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/.cvsignore
@@ -0,0 +1,3 @@
+Output
+*.log
+*.sum
diff --git a/llvm/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx b/llvm/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx
new file mode 100644
index 00000000000..8150c52bc7b
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx
@@ -0,0 +1,17 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt
+
+%V = global float 12.0
+%G = internal global int* null
+
+int %user() {
+ %P = load int** %G
+ %Q = load int* %P
+ ret int %Q
+}
+
+void %setter() {
+ %Vi = cast float* %V to int*
+ store int* %Vi, int** %G
+ ret void
+}
+
diff --git a/llvm/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll b/llvm/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll
new file mode 100644
index 00000000000..19458c78859
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll
@@ -0,0 +1,9 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output
+; PR579
+
+%g_40507551 = internal global short 31038 ; <short*> [#uses=1]
+
+void %main() {
+ %tmp.4.i.1 = load ubyte* getelementptr (ubyte* cast (short* %g_40507551 to ubyte*), int 1)
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/2005-09-27-Crash.ll b/llvm/test/Transforms/GlobalOpt/2005-09-27-Crash.ll
new file mode 100644
index 00000000000..948687724f5
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/2005-09-27-Crash.ll
@@ -0,0 +1,28 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output
+ %RPyString = type { int, %arraytype.Char }
+ %arraytype.Char = type { int, [0 x sbyte] }
+ %arraytype.Signed = type { int, [0 x int] }
+ %functiontype.1 = type %RPyString* (int)
+ %structtype.test = type { int, %arraytype.Signed }
+%structinstance.test = internal global { int, { int, [2 x int] } } { int 41, { int, [2 x int] } { int 2, [2 x int] [ int 100, int 101 ] } } ; <{ int, { int, [2 x int] } }*> [#uses=1]
+
+implementation ; Functions:
+
+fastcc void %pypy_array_constant() {
+block0:
+ %tmp.9 = getelementptr %structtype.test* cast ({ int, { int, [2 x int] } }* %structinstance.test to %structtype.test*), int 0, uint 0 ; <int*> [#uses=0]
+ ret void
+}
+
+fastcc void %new.varsizestruct.rpy_string() {
+ unreachable
+}
+
+void %__entrypoint__pypy_array_constant() {
+ call fastcc void %pypy_array_constant( )
+ ret void
+}
+
+void %__entrypoint__raised_LLVMException() {
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll b/llvm/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll
new file mode 100644
index 00000000000..61df34533df
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll
@@ -0,0 +1,138 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output
+; PR820
+target endian = little
+target pointersize = 32
+target triple = "i686-pc-linux-gnu"
+ %struct..0FileDescriptor = type { int }
+ "struct.FlagDescription<int32>" = type { ubyte*, int*, bool, bool, int, ubyte* }
+ "struct.FlagRegisterer<bool>" = type { ubyte }
+ %struct.MutexLock = type { %struct..0FileDescriptor* }
+ "struct.std::DisabledRangeMap" = type { "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >" }
+ "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >" = type { "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >::_Rb_tree_impl<StringCmp,false>" }
+ "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >::_Rb_tree_impl<StringCmp,false>" = type { "struct.FlagRegisterer<bool>", "struct.std::_Rb_tree_node_base", uint }
+ "struct.std::_Rb_tree_const_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" = type { "struct.std::_Rb_tree_node_base"* }
+ "struct.std::_Rb_tree_node_base" = type { uint, "struct.std::_Rb_tree_node_base"*, "struct.std::_Rb_tree_node_base"*, "struct.std::_Rb_tree_node_base"* }
+ "struct.std::_Vector_base<int,std::allocator<int> >" = type { "struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" }
+ "struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" = type { int*, int*, int* }
+ "struct.std::vector<int,std::allocator<int> >" = type { "struct.std::_Vector_base<int,std::allocator<int> >" }
+%registry_lock = external global %struct..0FileDescriptor ; <%struct..0FileDescriptor*> [#uses=0]
+%_ZN61FLAG__foo_int32_44FLAGS_E = external global "struct.FlagRegisterer<bool>" ; <"struct.FlagRegisterer<bool>"*> [#uses=0]
+%llvm.global_ctors = appending global [20 x { int, void ()* }] [ { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN7ScannerC2Ev }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__Z11StripStringPSsPKcc }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_ }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN8Hasher325ResetEj }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__Z25ACLRv }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I_eventbuf }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__checker_bcad_variable } ] ; <[20 x { int, void ()* }]*> [#uses=0]
+
+implementation ; Functions:
+
+declare void %_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E()
+
+declare void %_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E()
+
+declare void %_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv()
+
+declare void %_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E()
+
+declare void %_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E()
+
+void %_ZN14FlagRegistererIiEC1EPKcRK15FlagDescriptionIiE() {
+entry:
+ call void %_Z12RegisterFlagIiEvPKcRK15FlagDescriptionIT_E( )
+ ret void
+}
+
+void %_Z12RegisterFlagIiEvPKcRK15FlagDescriptionIT_E() {
+entry:
+ call void %_ZN9MutexLockC1EP5Mutex( )
+ ret void
+}
+
+declare void %_GLOBAL__I__ZN7ScannerC2Ev()
+
+declare void %_GLOBAL__I__Z11StripStringPSsPKcc()
+
+void %_ZNSt6vectorIiSaIiEEC1ERKS0_() {
+entry:
+ unreachable
+}
+
+declare void %_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_()
+
+declare void %_GLOBAL__I__ZN8Hasher325ResetEj()
+
+declare void %_GLOBAL__I__Z25ACLRv()
+
+void %_ZN9MutexLockC1EP5Mutex() {
+entry:
+ call void %_ZN5Mutex4LockEv( )
+ ret void
+}
+
+void %_ZN5Mutex4LockEv() {
+entry:
+ call void %_Z22Acquire_CASPViii( )
+ ret void
+}
+
+csretcc void %_ZNSt3mapIPKc15FlagDescriptionIiE9StringCmpSaISt4pairIKS1_S3_EEE3endEv("struct.std::_Rb_tree_const_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >"* %agg.result) {
+entry:
+ unreachable
+}
+
+declare void %_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E()
+
+void %_Z14CASPViii() {
+entry:
+ %tmp3 = call int asm sideeffect "lock; cmpxchg $1,$2", "={ax},q,m,0,~{dirflag},~{fpsr},~{flags},~{memory}"( int 0, int* null, int 0 ) ; <int> [#uses=0]
+ unreachable
+}
+
+declare void %_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E()
+
+declare void %_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E()
+
+void %_Z22Acquire_CASPViii() {
+entry:
+ call void %_Z14CASPViii( )
+ unreachable
+}
+
+declare void %_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E()
+
+declare void %_GLOBAL__I_eventbuf()
+
+void %_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E() {
+entry:
+ call void %_Z41__static_initialization_and_destruction_0ii1662( int 1, int 65535 )
+ ret void
+}
+
+void %_Z41__static_initialization_and_destruction_0ii1662(int %__initialize_p, int %__priority) {
+entry:
+ %__initialize_p_addr = alloca int ; <int*> [#uses=2]
+ %__priority_addr = alloca int ; <int*> [#uses=2]
+ store int %__initialize_p, int* %__initialize_p_addr
+ store int %__priority, int* %__priority_addr
+ %tmp = load int* %__priority_addr ; <int> [#uses=1]
+ %tmp = seteq int %tmp, 65535 ; <bool> [#uses=1]
+ br bool %tmp, label %cond_true, label %cond_next14
+
+cond_true: ; preds = %entry
+ %tmp8 = load int* %__initialize_p_addr ; <int> [#uses=1]
+ %tmp9 = seteq int %tmp8, 1 ; <bool> [#uses=1]
+ br bool %tmp9, label %cond_true10, label %cond_next14
+
+cond_true10: ; preds = %cond_true
+ call void %_ZN14FlagRegistererIiEC1EPKcRK15FlagDescriptionIiE( )
+ ret void
+
+cond_next14: ; preds = %cond_true, %entry
+ ret void
+}
+
+declare void %_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E()
+
+void %_ZN9__gnu_cxx13new_allocatorIPNS_15_Hashtable_nodeIjEEEC2Ev() {
+entry:
+ unreachable
+}
+
+declare void %_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE()
+
+declare void %_GLOBAL__I__checker_bcad_variable()
diff --git a/llvm/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll b/llvm/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll
new file mode 100644
index 00000000000..cd76681a101
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll
@@ -0,0 +1,33 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output
+ %struct._list = type { int*, %struct._list* }
+ %struct._play = type { int, int*, %struct._list*, %struct._play* }
+%nrow = internal global int 0 ; <int*> [#uses=2]
+
+implementation ; Functions:
+
+void %make_play() {
+entry:
+ br label %cond_true16.i
+
+cond_true16.i: ; preds = %cond_true16.i, %entry
+ %low.0.in.i.0 = phi int* [ %nrow, %entry ], [ null, %cond_true16.i ] ; <int*> [#uses=1]
+ %low.0.i = load int* %low.0.in.i.0 ; <int> [#uses=0]
+ br label %cond_true16.i
+}
+
+void %make_wanted() {
+entry:
+ unreachable
+}
+
+void %get_good_move() {
+entry:
+ ret void
+}
+
+void %main() {
+entry:
+ store int 8, int* %nrow
+ tail call void %make_play( )
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/basictest.llx b/llvm/test/Transforms/GlobalOpt/basictest.llx
new file mode 100644
index 00000000000..1f97fc03aab
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/basictest.llx
@@ -0,0 +1,9 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global
+
+%X = internal global int 4
+
+
+int %foo() {
+ %V = load int* %X
+ ret int %V
+}
diff --git a/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll b/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll
new file mode 100644
index 00000000000..8f75deb61b6
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll
@@ -0,0 +1,98 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output &&
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep CTOR
+
+%llvm.global_ctors = appending global [10 x { int, void ()* }] [
+ { int, void ()* } { int 65535, void ()* %CTOR1 },
+ { int, void ()* } { int 65535, void ()* %CTOR1 },
+ { int, void ()* } { int 65535, void ()* %CTOR2 },
+ { int, void ()* } { int 65535, void ()* %CTOR3 },
+ { int, void ()* } { int 65535, void ()* %CTOR4 },
+ { int, void ()* } { int 65535, void ()* %CTOR5 },
+ { int, void ()* } { int 65535, void ()* %CTOR6 },
+ { int, void ()* } { int 65535, void ()* %CTOR7 },
+ { int, void ()* } { int 65535, void ()* %CTOR8 },
+ { int, void ()* } { int 2147483647, void ()* null }
+]
+
+%G = global int 0
+%G2 = global int 0
+%G3 = global int -123
+%X = global {int, [2 x int]} { int 0, [2 x int] [ int 17, int 21] }
+%Y = global int -1
+%Z = global int 123
+%D = global double 0.0
+
+%CTORGV = internal global bool false ;; Should become constant after eval
+
+implementation
+
+internal void %CTOR1() { ;; noop ctor, remove.
+ ret void
+}
+
+internal void %CTOR2() { ;; evaluate the store
+ %A = add int 1, 23
+ store int %A, int* %G
+ store bool true, bool* %CTORGV
+ ret void
+}
+
+internal void %CTOR3() {
+ %X = or bool true, false
+ br label %Cont
+Cont:
+ br bool %X, label %S, label %T
+S:
+ store int 24, int* %G2
+ ret void
+T:
+ ret void
+}
+
+internal void %CTOR4() {
+ %X = load int* %G3
+ %Y = add int %X, 123
+ store int %Y, int* %G3
+ ret void
+}
+
+internal void %CTOR5() {
+ %X.2p = getelementptr {int,[2 x int]}* %X, int 0, uint 1, int 0
+ %X.2 = load int* %X.2p
+ %X.1p = getelementptr {int,[2 x int]}* %X, int 0, uint 0
+ store int %X.2, int* %X.1p
+ store int 42, int* %X.2p
+ ret void
+}
+
+internal void %CTOR6() {
+ %A = alloca int
+ %y = load int* %Y
+ store int %y, int* %A
+ %Av = load int* %A
+ %Av1 = add int %Av, 1
+ store int %Av1, int* %Y
+ ret void
+}
+
+internal void %CTOR7() {
+ call void %setto(int* %Z, int 0)
+ ret void
+}
+
+void %setto(int* %P, int %V) {
+ store int %V, int* %P
+ ret void
+}
+
+declare double %cos(double)
+
+internal void %CTOR8() {
+ %X = call double %cos(double 1.0)
+ store double %X, double* %D
+ ret void
+}
+bool %accessor() {
+ %V = load bool* %CTORGV ;; constant true
+ ret bool %V
+}
diff --git a/llvm/test/Transforms/GlobalOpt/deadglobal-2.llx b/llvm/test/Transforms/GlobalOpt/deadglobal-2.llx
new file mode 100644
index 00000000000..5fa98250a4a
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/deadglobal-2.llx
@@ -0,0 +1,11 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep internal
+
+; This is a harder case to delete as the GEP has a variable index.
+
+%G = internal global [4 x int] zeroinitializer
+
+void %foo(int %X) {
+ %Ptr = getelementptr [4 x int]* %G, int 0, int %X
+ store int 1, int* %Ptr
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/deadglobal.llx b/llvm/test/Transforms/GlobalOpt/deadglobal.llx
new file mode 100644
index 00000000000..a7397bf0fd9
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/deadglobal.llx
@@ -0,0 +1,8 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep internal
+
+%G = internal global int 123
+
+void %foo() {
+ store int 1, int* %G
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/dg.exp b/llvm/test/Transforms/GlobalOpt/dg.exp
new file mode 100644
index 00000000000..142de8a6c8f
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/dg.exp
@@ -0,0 +1,3 @@
+load_lib llvm-dg.exp
+
+llvm-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] $objdir $srcdir $subdir $target_triplet $llvmgcc $llvmgxx $prcontext $llvmgcc_version
diff --git a/llvm/test/Transforms/GlobalOpt/globalsra-partial.llx b/llvm/test/Transforms/GlobalOpt/globalsra-partial.llx
new file mode 100644
index 00000000000..e060565b114
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/globalsra-partial.llx
@@ -0,0 +1,23 @@
+; In this case, the global can only be broken up by one level.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep 12345
+
+%G = internal global { int, [4 x float] } zeroinitializer
+
+void %onlystore() {
+ store int 12345, int* getelementptr ({ int, [4 x float] }* %G, int 0, uint 0)
+ ret void
+}
+
+void %storeinit(int %i) {
+ %Ptr = getelementptr { int, [4 x float] }* %G, int 0, uint 1, int %i
+ store float 1.0, float* %Ptr
+ ret void
+}
+
+float %readval(int %i) {
+ %Ptr = getelementptr { int, [4 x float] }* %G, int 0, uint 1, int %i
+ %V = load float* %Ptr
+ ret float %V
+}
+
diff --git a/llvm/test/Transforms/GlobalOpt/globalsra.llx b/llvm/test/Transforms/GlobalOpt/globalsra.llx
new file mode 100644
index 00000000000..a87b954988c
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/globalsra.llx
@@ -0,0 +1,19 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global
+
+%G = internal global { int, float, {double} } { int 1, float 1.0, {double} {double 17.27} }
+
+void %onlystore() {
+ store int 123, int* getelementptr ({ int, float, {double} }* %G, int 0, uint 0)
+ ret void
+}
+
+float %storeinit() {
+ store float 1.0, float* getelementptr ({ int, float, {double} }* %G, int 0, uint 1)
+ %X = load float* getelementptr ({ int, float, {double} }* %G, int 0, uint 1)
+ ret float %X
+}
+
+double %constantize() {
+ %X = load double* getelementptr ({ int, float, {double} }* %G, int 0, uint 2, uint 0)
+ ret double %X
+}
diff --git a/llvm/test/Transforms/GlobalOpt/integer-bool.ll b/llvm/test/Transforms/GlobalOpt/integer-bool.ll
new file mode 100644
index 00000000000..29cb4f5d34c
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/integer-bool.ll
@@ -0,0 +1,23 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -instcombine | \
+; RUN: llvm-dis | grep 'ret i1 true'
+
+;; check that global opt turns integers that only hold 0 or 1 into bools.
+
+%G = internal global int 0 ;; This only holds 0 or 1.
+
+implementation
+
+void %set1() {
+ store int 0, int* %G
+ ret void
+}
+void %set2() {
+ store int 1, int* %G
+ ret void
+}
+
+bool %get() {
+ %A = load int* %G
+ %C = setlt int %A, 2 ;; always true
+ ret bool %C
+}
diff --git a/llvm/test/Transforms/GlobalOpt/iterate.llx b/llvm/test/Transforms/GlobalOpt/iterate.llx
new file mode 100644
index 00000000000..e4e59c63a40
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/iterate.llx
@@ -0,0 +1,10 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep %G
+
+%G = internal global int 0
+%H = internal global { int* } { int* %G }
+
+int %loadg() {
+ %G = load int** getelementptr ({int*}* %H, int 0, uint 0)
+ %GV = load int* %G
+ ret int %GV
+}
diff --git a/llvm/test/Transforms/GlobalOpt/load-store-global.llx b/llvm/test/Transforms/GlobalOpt/load-store-global.llx
new file mode 100644
index 00000000000..bf5d3a256ac
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/load-store-global.llx
@@ -0,0 +1,14 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep G
+
+%G = internal global int 17
+
+void %foo() {
+ %V = load int* %G
+ store int %V, int* %G ;; Doesn't change the value
+ ret void
+}
+int %bar() {
+ %X = load int* %G
+ ret int %X
+}
+
diff --git a/llvm/test/Transforms/GlobalOpt/malloc-promote-1.llx b/llvm/test/Transforms/GlobalOpt/malloc-promote-1.llx
new file mode 100644
index 00000000000..068e96fc2c4
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/malloc-promote-1.llx
@@ -0,0 +1,18 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global
+
+%G = internal global int* null
+
+void %init() {
+ %P = malloc int
+ store int* %P, int** %G
+
+ %GV = load int** %G
+ store int 0, int* %GV
+ ret void
+}
+
+int %get() {
+ %GV = load int** %G
+ %V = load int* %GV
+ ret int %V
+}
diff --git a/llvm/test/Transforms/GlobalOpt/malloc-promote-2.llx b/llvm/test/Transforms/GlobalOpt/malloc-promote-2.llx
new file mode 100644
index 00000000000..12d4c6d5bb2
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/malloc-promote-2.llx
@@ -0,0 +1,20 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep malloc
+
+%G = internal global int* null
+
+void %init() {
+ %P = malloc int, uint 100
+ store int* %P, int** %G
+
+ %GV = load int** %G
+ %GVe = getelementptr int* %GV, int 40
+ store int 20, int* %GVe
+ ret void
+}
+
+int %get() {
+ %GV = load int** %G
+ %GVe = getelementptr int* %GV, int 40
+ %V = load int* %GVe
+ ret int %V
+}
diff --git a/llvm/test/Transforms/GlobalOpt/malloc-promote-3.llx b/llvm/test/Transforms/GlobalOpt/malloc-promote-3.llx
new file mode 100644
index 00000000000..85ce6bdbc86
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/malloc-promote-3.llx
@@ -0,0 +1,26 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep malloc
+
+%G = internal global int* null
+
+void %init() {
+ %P = malloc int, uint 100
+ store int* %P, int** %G
+
+ %GV = load int** %G
+ %GVe = getelementptr int* %GV, int 40
+ store int 20, int* %GVe
+ ret void
+}
+
+int %get() {
+ %GV = load int** %G
+ %GVe = getelementptr int* %GV, int 40
+ %V = load int* %GVe
+ ret int %V
+}
+
+bool %check() { ;; Return true if init has been called
+ %GV = load int** %G
+ %V = seteq int* %GV, null
+ ret bool %V
+}
diff --git a/llvm/test/Transforms/GlobalOpt/memcpy.ll b/llvm/test/Transforms/GlobalOpt/memcpy.ll
new file mode 100644
index 00000000000..ea4483f3861
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/memcpy.ll
@@ -0,0 +1,17 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | \
+; RUN: grep 'G1 = internal constant'
+
+%G1 = internal global [58 x sbyte] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00"
+
+implementation
+
+declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint)
+
+void %foo() {
+ %Blah = alloca [58 x sbyte] ; <[58 x sbyte]*> [#uses=2]
+ %tmp.0 = getelementptr [58 x sbyte]* %Blah, int 0, int 0 ; <sbyte*> [#uses=1]
+ call void %llvm.memcpy.i32( sbyte* %tmp.0, sbyte* getelementptr ([58 x sbyte]* %G1, int 0, int 0), uint 58, uint 1 )
+ ret void
+}
+
+
diff --git a/llvm/test/Transforms/GlobalOpt/memset.ll b/llvm/test/Transforms/GlobalOpt/memset.ll
new file mode 100644
index 00000000000..5159d2861e4
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/memset.ll
@@ -0,0 +1,21 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep internal
+; both globals are write only, delete them.
+
+%G0 = internal global [58 x sbyte] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00"
+
+%G1 = internal global [4 x int] [ int 1, int 2, int 3, int 4]
+
+implementation ; Functions:
+
+declare void %llvm.memcpy(sbyte*, sbyte*, uint, uint)
+declare void %llvm.memset(sbyte*, ubyte, uint, uint)
+
+void %foo() {
+ %Blah = alloca [58 x sbyte] ; <[58 x sbyte]*> [#uses=2]
+ %tmp3 = cast [58 x sbyte]* %Blah to sbyte*
+ call void %llvm.memcpy( sbyte* cast ([4 x int]* %G1 to sbyte*), sbyte* %tmp3, uint 16, uint 1)
+ call void %llvm.memset( sbyte* getelementptr ([58 x sbyte]* %G0, int 0, int 0), uint 17, uint 58, uint 1)
+ ret void
+}
+
+
diff --git a/llvm/test/Transforms/GlobalOpt/phi-select.llx b/llvm/test/Transforms/GlobalOpt/phi-select.llx
new file mode 100644
index 00000000000..2389c0a8bca
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/phi-select.llx
@@ -0,0 +1,29 @@
+; Test that PHI nodes and select instructions do not necessarily make stuff
+; non-constant.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global
+
+%X = internal global int 4
+%Y = internal global int 5
+
+int %test1(bool %C) {
+ %P = select bool %C, int* %X, int* %Y
+ %V = load int* %P
+ ret int %V
+}
+
+
+int %test2(bool %C) {
+ br bool %C, label %T, label %Cont
+T:
+ br label %Cont
+Cont:
+ %P = phi int* [%X, %0], [%Y, %T]
+ %V = load int* %P
+ ret int %V
+}
+
+
+
+
+
diff --git a/llvm/test/Transforms/GlobalOpt/storepointer-compare.llx b/llvm/test/Transforms/GlobalOpt/storepointer-compare.llx
new file mode 100644
index 00000000000..5340feed387
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/storepointer-compare.llx
@@ -0,0 +1,28 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | grep 'call void %Actual'
+
+; Check that a comparison does not prevent an indirect call from being made
+; direct. The global will still remain, but indirect call elim is still good.
+
+%G = internal global void ()* null
+
+implementation
+
+internal void %Actual() {
+ ret void
+}
+
+void %init() {
+ store void()* %Actual, void()** %G
+ ret void
+}
+
+void %doit() {
+ %FP = load void()** %G
+ %CC = seteq void()* %FP, null
+ br bool %CC, label %isNull, label %DoCall
+DoCall:
+ call void %FP()
+ ret void
+isNull:
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/storepointer.llx b/llvm/test/Transforms/GlobalOpt/storepointer.llx
new file mode 100644
index 00000000000..a424d255bd7
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/storepointer.llx
@@ -0,0 +1,20 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global
+
+%G = internal global void ()* null
+
+implementation
+
+internal void %Actual() {
+ ret void
+}
+
+void %init() {
+ store void()* %Actual, void()** %G
+ ret void
+}
+
+void %doit() {
+ %FP = load void()** %G
+ call void %FP()
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/trivialstore.llx b/llvm/test/Transforms/GlobalOpt/trivialstore.llx
new file mode 100644
index 00000000000..8b1f1ce5250
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/trivialstore.llx
@@ -0,0 +1,17 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep G
+
+%G = internal global int 17
+
+void %foo() {
+ store int 17, int* %G ;; Doesn't change the value
+ ret void
+}
+int %bar() {
+ %X = load int* %G
+ ret int %X
+}
+
+internal void %dead() {
+ store int 123, int* %G
+ ret void
+}
diff --git a/llvm/test/Transforms/GlobalOpt/undef-init.llx b/llvm/test/Transforms/GlobalOpt/undef-init.llx
new file mode 100644
index 00000000000..2f073c2ff04
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/undef-init.llx
@@ -0,0 +1,18 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep store
+
+%llvm.global_ctors = appending global [1 x { int, void ()* }] [ { int, void ()* } { int 65535, void ()* %_GLOBAL__I__Z3foov } ] ; <[1 x { int, void ()* }]*> [#uses=0]
+%X.0 = internal global int undef ; <int*> [#uses=2]
+
+implementation ; Functions:
+
+int %_Z3foov() {
+entry:
+ %tmp.1 = load int* %X.0 ; <int> [#uses=1]
+ ret int %tmp.1
+}
+
+internal void %_GLOBAL__I__Z3foov() {
+entry:
+ store int 1, int* %X.0
+ ret void
+}
OpenPOWER on IntegriCloud