aboutsummaryrefslogtreecommitdiffstats
path: root/test/Transforms/GlobalOpt
diff options
context:
space:
mode:
authorDan Gohman <djg@cray.com>2007-07-18 16:29:46 +0000
committerDan Gohman <djg@cray.com>2007-07-18 16:29:46 +0000
commitf17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cc (patch)
treeebb79ea1ee5e3bc1fdf38541a811a8b804f0679a /test/Transforms/GlobalOpt
downloadexternal_llvm-f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cc.zip
external_llvm-f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cc.tar.gz
external_llvm-f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cc.tar.bz2
It's not necessary to do rounding for alloca operations when the requested
alignment is equal to the stack alignment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40004 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/GlobalOpt')
-rw-r--r--test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx17
-rw-r--r--test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll9
-rw-r--r--test/Transforms/GlobalOpt/2005-09-27-Crash.ll28
-rw-r--r--test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll138
-rw-r--r--test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll33
-rw-r--r--test/Transforms/GlobalOpt/2007-04-05-Crash.ll34
-rw-r--r--test/Transforms/GlobalOpt/2007-05-13-Crash.ll74
-rw-r--r--test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll36
-rw-r--r--test/Transforms/GlobalOpt/basictest.llx9
-rw-r--r--test/Transforms/GlobalOpt/constantexpr-dangle.ll13
-rw-r--r--test/Transforms/GlobalOpt/ctor-list-opt.ll97
-rw-r--r--test/Transforms/GlobalOpt/deadglobal-2.llx11
-rw-r--r--test/Transforms/GlobalOpt/deadglobal.llx8
-rw-r--r--test/Transforms/GlobalOpt/dg.exp3
-rw-r--r--test/Transforms/GlobalOpt/globalsra-partial.llx23
-rw-r--r--test/Transforms/GlobalOpt/globalsra.llx19
-rw-r--r--test/Transforms/GlobalOpt/integer-bool.ll23
-rw-r--r--test/Transforms/GlobalOpt/iterate.llx10
-rw-r--r--test/Transforms/GlobalOpt/load-store-global.llx14
-rw-r--r--test/Transforms/GlobalOpt/malloc-promote-1.llx18
-rw-r--r--test/Transforms/GlobalOpt/malloc-promote-2.llx20
-rw-r--r--test/Transforms/GlobalOpt/malloc-promote-3.llx26
-rw-r--r--test/Transforms/GlobalOpt/memcpy.ll17
-rw-r--r--test/Transforms/GlobalOpt/memset.ll23
-rw-r--r--test/Transforms/GlobalOpt/phi-select.llx29
-rw-r--r--test/Transforms/GlobalOpt/storepointer-compare.llx29
-rw-r--r--test/Transforms/GlobalOpt/storepointer.llx20
-rw-r--r--test/Transforms/GlobalOpt/trivialstore.llx17
-rw-r--r--test/Transforms/GlobalOpt/undef-init.llx18
29 files changed, 816 insertions, 0 deletions
diff --git a/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx b/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx
new file mode 100644
index 0000000..8150c52
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll b/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll
new file mode 100644
index 0000000..19458c7
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/2005-09-27-Crash.ll b/test/Transforms/GlobalOpt/2005-09-27-Crash.ll
new file mode 100644
index 0000000..9486877
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll b/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll
new file mode 100644
index 0000000..61df345
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll b/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll
new file mode 100644
index 0000000..cd76681
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/2007-04-05-Crash.ll b/test/Transforms/GlobalOpt/2007-04-05-Crash.ll
new file mode 100644
index 0000000..bf957b4
--- /dev/null
+++ b/test/Transforms/GlobalOpt/2007-04-05-Crash.ll
@@ -0,0 +1,34 @@
+; RUN: llvm-as < %s | opt -globalopt -disable-output
+
+target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
+target triple = "thumb-apple-darwin8"
+@replacementUnichar = internal global i16 -3 ; <i16*> [#uses=2]
+@"L_OBJC_IMAGE_INFO" = internal global [2 x i32] zeroinitializer ; <[2 x i32]*> [#uses=1]
+@llvm.used = appending global [1 x i8*] [ i8* bitcast ([2 x i32]* @"L_OBJC_IMAGE_INFO" to i8*) ] ; <[1 x i8*]*> [#uses=0]
+
+define i16 @__NSCharToUnicharCFWrapper(i8 zext %ch) zext {
+entry:
+ %iftmp.0.0.in.in = select i1 false, i16* @replacementUnichar, i16* null ; <i16*> [#uses=1]
+ %iftmp.0.0.in = load i16* %iftmp.0.0.in.in ; <i16> [#uses=1]
+ ret i16 %iftmp.0.0.in
+}
+
+define void @__NSASCIICharToUnichar() {
+entry:
+ ret void
+}
+
+define void @_NSDefaultCStringEncoding() {
+entry:
+ call void @__NSSetCStringCharToUnichar( )
+ br i1 false, label %cond_true6, label %cond_next8
+
+cond_true6: ; preds = %entry
+ store i16 -2, i16* @replacementUnichar
+ ret void
+
+cond_next8: ; preds = %entry
+ ret void
+}
+
+declare void @__NSSetCStringCharToUnichar()
diff --git a/test/Transforms/GlobalOpt/2007-05-13-Crash.ll b/test/Transforms/GlobalOpt/2007-05-13-Crash.ll
new file mode 100644
index 0000000..22fee77
--- /dev/null
+++ b/test/Transforms/GlobalOpt/2007-05-13-Crash.ll
@@ -0,0 +1,74 @@
+; RUN: llvm-as < %s | opt -globalopt -disable-output
+
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"
+target triple = "i686-apple-darwin8"
+ %struct.SFLMutableListItem = type { i16 }
+ %struct.__CFDictionary = type opaque
+ %struct.__CFString = type opaque
+ %struct.__builtin_CFString = type { i32*, i32, i8*, i32 }
+@_ZZ19SFLGetVisibilityKeyvE19_kSFLLVisibilityKey = internal global %struct.__CFString* null ; <%struct.__CFString**> [#uses=2]
+@_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey = internal global %struct.__CFString* null ; <%struct.__CFString**> [#uses=7]
+internal constant %struct.__builtin_CFString {
+ i32* getelementptr ([0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0),
+ i32 1992,
+ i8* getelementptr ([14 x i8]* @.str, i32 0, i32 0),
+ i32 13 }, section "__DATA,__cfstring" ; <%struct.__builtin_CFString*>:0 [#uses=1]
+@__CFConstantStringClassReference = external global [0 x i32] ; <[0 x i32]*> [#uses=1]
+@.str = internal constant [14 x i8] c"AlwaysVisible\00" ; <[14 x i8]*> [#uses=1]
+@_ZZ21SFLGetNeverVisibleKeyvE21_kSFLLNeverVisibleKey = internal global %struct.__CFString* null ; <%struct.__CFString**> [#uses=2]
+
+define %struct.__CFString* @_Z19SFLGetVisibilityKeyv() {
+entry:
+ %tmp1 = load %struct.__CFString** @_ZZ19SFLGetVisibilityKeyvE19_kSFLLVisibilityKey ; <%struct.__CFString*> [#uses=1]
+ ret %struct.__CFString* %tmp1
+}
+
+define %struct.__CFString* @_Z22SFLGetAlwaysVisibleKeyv() {
+entry:
+ %tmp1 = load %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey ; <%struct.__CFString*> [#uses=1]
+ %tmp2 = icmp eq %struct.__CFString* %tmp1, null ; <i1> [#uses=1]
+ br i1 %tmp2, label %cond_true, label %cond_next
+
+cond_true: ; preds = %entry
+ store %struct.__CFString* bitcast (%struct.__builtin_CFString* @0 to %struct.__CFString*), %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey
+ br label %cond_next
+
+cond_next: ; preds = %entry, %cond_true
+ %tmp4 = load %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey ; <%struct.__CFString*> [#uses=1]
+ ret %struct.__CFString* %tmp4
+}
+
+define %struct.__CFString* @_Z21SFLGetNeverVisibleKeyv() {
+entry:
+ %tmp1 = load %struct.__CFString** @_ZZ21SFLGetNeverVisibleKeyvE21_kSFLLNeverVisibleKey ; <%struct.__CFString*> [#uses=1]
+ ret %struct.__CFString* %tmp1
+}
+
+define %struct.__CFDictionary* @_ZN18SFLMutableListItem18GetPrefsDictionaryEv(%struct.SFLMutableListItem* %this) {
+entry:
+ %tmp4 = getelementptr %struct.SFLMutableListItem* %this, i32 0, i32 0 ; <i16*> [#uses=1]
+ %tmp5 = load i16* %tmp4 ; <i16> [#uses=1]
+ %tmp6 = icmp eq i16 %tmp5, 0 ; <i1> [#uses=1]
+ br i1 %tmp6, label %cond_next22, label %cond_true
+
+cond_true: ; preds = %entry
+ %tmp9 = load %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey ; <%struct.__CFString*> [#uses=1]
+ %tmp10 = icmp eq %struct.__CFString* %tmp9, null ; <i1> [#uses=1]
+ br i1 %tmp10, label %cond_true13, label %cond_next22
+
+cond_true13: ; preds = %cond_true
+ store %struct.__CFString* bitcast (%struct.__builtin_CFString* @0 to %struct.__CFString*), %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey
+ br label %cond_next22
+
+cond_next22: ; preds = %entry, %cond_true13, %cond_true
+ %iftmp.1.0.in = phi %struct.__CFString** [ @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey, %cond_true ], [ @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey, %cond_true13 ], [ @_ZZ21SFLGetNeverVisibleKeyvE21_kSFLLNeverVisibleKey, %entry ] ; <%struct.__CFString**> [#uses=1]
+ %iftmp.1.0 = load %struct.__CFString** %iftmp.1.0.in ; <%struct.__CFString*> [#uses=1]
+ %tmp24 = load %struct.__CFString** @_ZZ19SFLGetVisibilityKeyvE19_kSFLLVisibilityKey ; <%struct.__CFString*> [#uses=1]
+ %tmp2728 = bitcast %struct.__CFString* %tmp24 to i8* ; <i8*> [#uses=1]
+ %tmp2930 = bitcast %struct.__CFString* %iftmp.1.0 to i8* ; <i8*> [#uses=1]
+ call void @_Z20CFDictionaryAddValuePKvS0_( i8* %tmp2728, i8* %tmp2930 )
+ ret %struct.__CFDictionary* undef
+}
+
+declare void @_Z20CFDictionaryAddValuePKvS0_(i8*, i8*)
+
diff --git a/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll b/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll
new file mode 100644
index 0000000..7394f04
--- /dev/null
+++ b/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll
@@ -0,0 +1,36 @@
+; RUN: llvm-as < %s | opt -globalopt -disable-output
+; PR1491
+
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"
+target triple = "i686-pc-linux-gnu"
+ %"struct.__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, int> > >" = type <{ i8 }>
+ %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >" = type { %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >::_Rb_tree_impl<std::less<int>,false>" }
+ %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >::_Rb_tree_impl<std::less<int>,false>" = type { %"struct.__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, int> > >", %"struct.std::_Rb_tree_node_base", i32 }
+ %"struct.std::_Rb_tree_node_base" = type { i32, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* }
+ %"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >" = type { %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >" }
+@someMap = global %"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >" zeroinitializer ; <%"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >"*> [#uses=1]
+@llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_someMap } ] ; <[1 x { i32, void ()* }]*> [#uses=0]
+@llvm.global_dtors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__D_someMap } ] ; <[1 x { i32, void ()* }]*> [#uses=0]
+
+define void @_GLOBAL__I_someMap() {
+entry:
+ call void @_Z41__static_initialization_and_destruction_0ii( i32 1, i32 65535 )
+ ret void
+}
+
+declare void @_GLOBAL__D_someMap()
+
+define void @_Z41__static_initialization_and_destruction_0ii(i32 %__initialize_p, i32 %__priority) {
+entry:
+ %tmp1 = icmp eq i32 %__priority, 65535 ; <i1> [#uses=1]
+ %tmp4 = icmp eq i32 %__initialize_p, 1 ; <i1> [#uses=1]
+ %tmp7 = and i1 %tmp1, %tmp4 ; <i1> [#uses=1]
+ br i1 %tmp7, label %cond_true, label %cond_next
+
+cond_true: ; preds = %entry
+ store i8 0, i8* getelementptr (%"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >"* @someMap, i32 0, i32 0, i32 0, i32 0, i32 0)
+ ret void
+
+cond_next: ; preds = %entry
+ ret void
+}
diff --git a/test/Transforms/GlobalOpt/basictest.llx b/test/Transforms/GlobalOpt/basictest.llx
new file mode 100644
index 0000000..1f97fc0
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/constantexpr-dangle.ll b/test/Transforms/GlobalOpt/constantexpr-dangle.ll
new file mode 100644
index 0000000..6e33ae0
--- /dev/null
+++ b/test/Transforms/GlobalOpt/constantexpr-dangle.ll
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | opt -instcombine -globalopt | llvm-dis | \
+; RUN: grep {internal fastcc float @foo}
+
+define internal float @foo() {
+ ret float 0.000000e+00
+}
+
+define float @bar() {
+ %tmp1 = call float (...)* bitcast (float ()* @foo to float (...)*)( )
+ %tmp2 = mul float %tmp1, 1.000000e+01 ; <float> [#uses=1]
+ ret float %tmp2
+}
+
diff --git a/test/Transforms/GlobalOpt/ctor-list-opt.ll b/test/Transforms/GlobalOpt/ctor-list-opt.ll
new file mode 100644
index 0000000..6270f4f
--- /dev/null
+++ b/test/Transforms/GlobalOpt/ctor-list-opt.ll
@@ -0,0 +1,97 @@
+; 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/test/Transforms/GlobalOpt/deadglobal-2.llx b/test/Transforms/GlobalOpt/deadglobal-2.llx
new file mode 100644
index 0000000..5fa9825
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/deadglobal.llx b/test/Transforms/GlobalOpt/deadglobal.llx
new file mode 100644
index 0000000..a7397bf
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/dg.exp b/test/Transforms/GlobalOpt/dg.exp
new file mode 100644
index 0000000..879685c
--- /dev/null
+++ b/test/Transforms/GlobalOpt/dg.exp
@@ -0,0 +1,3 @@
+load_lib llvm.exp
+
+RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]]
diff --git a/test/Transforms/GlobalOpt/globalsra-partial.llx b/test/Transforms/GlobalOpt/globalsra-partial.llx
new file mode 100644
index 0000000..e060565
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/globalsra.llx b/test/Transforms/GlobalOpt/globalsra.llx
new file mode 100644
index 0000000..a87b954
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/integer-bool.ll b/test/Transforms/GlobalOpt/integer-bool.ll
new file mode 100644
index 0000000..eef2f72
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/iterate.llx b/test/Transforms/GlobalOpt/iterate.llx
new file mode 100644
index 0000000..e4e59c6
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/load-store-global.llx b/test/Transforms/GlobalOpt/load-store-global.llx
new file mode 100644
index 0000000..bf5d3a2
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/malloc-promote-1.llx b/test/Transforms/GlobalOpt/malloc-promote-1.llx
new file mode 100644
index 0000000..068e96f
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/malloc-promote-2.llx b/test/Transforms/GlobalOpt/malloc-promote-2.llx
new file mode 100644
index 0000000..12d4c6d
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/malloc-promote-3.llx b/test/Transforms/GlobalOpt/malloc-promote-3.llx
new file mode 100644
index 0000000..85ce6bd
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/memcpy.ll b/test/Transforms/GlobalOpt/memcpy.ll
new file mode 100644
index 0000000..a110d40
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/memset.ll b/test/Transforms/GlobalOpt/memset.ll
new file mode 100644
index 0000000..336a234
--- /dev/null
+++ b/test/Transforms/GlobalOpt/memset.ll
@@ -0,0 +1,23 @@
+; both globals are write only, delete them.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | \
+; RUN: not grep internal
+
+%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.i32(sbyte*, sbyte*, uint, uint)
+declare void %llvm.memset.i32(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.i32( sbyte* cast ([4 x int]* %G1 to sbyte*), sbyte* %tmp3, uint 16, uint 1)
+ call void %llvm.memset.i32( sbyte* getelementptr ([58 x sbyte]* %G0, int 0, int 0), ubyte 17, uint 58, uint 1)
+ ret void
+}
+
+
diff --git a/test/Transforms/GlobalOpt/phi-select.llx b/test/Transforms/GlobalOpt/phi-select.llx
new file mode 100644
index 0000000..2389c0a
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/storepointer-compare.llx b/test/Transforms/GlobalOpt/storepointer-compare.llx
new file mode 100644
index 0000000..d85d97d
--- /dev/null
+++ b/test/Transforms/GlobalOpt/storepointer-compare.llx
@@ -0,0 +1,29 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | \
+; RUN: 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/test/Transforms/GlobalOpt/storepointer.llx b/test/Transforms/GlobalOpt/storepointer.llx
new file mode 100644
index 0000000..a424d25
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/trivialstore.llx b/test/Transforms/GlobalOpt/trivialstore.llx
new file mode 100644
index 0000000..8b1f1ce
--- /dev/null
+++ b/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/test/Transforms/GlobalOpt/undef-init.llx b/test/Transforms/GlobalOpt/undef-init.llx
new file mode 100644
index 0000000..2f073c2
--- /dev/null
+++ b/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
+}