diff options
author | ed <ed@FreeBSD.org> | 2009-06-02 17:52:33 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2009-06-02 17:52:33 +0000 |
commit | 3277b69d734b9c90b44ebde4ede005717e2c3b2e (patch) | |
tree | 64ba909838c23261cace781ece27d106134ea451 /test/Transforms/GlobalOpt | |
download | FreeBSD-src-3277b69d734b9c90b44ebde4ede005717e2c3b2e.zip FreeBSD-src-3277b69d734b9c90b44ebde4ede005717e2c3b2e.tar.gz |
Import LLVM, at r72732.
Diffstat (limited to 'test/Transforms/GlobalOpt')
51 files changed, 1596 insertions, 0 deletions
diff --git a/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.ll b/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.ll new file mode 100644 index 0000000..5f784e0 --- /dev/null +++ b/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -globalopt + +@V = global float 1.200000e+01 ; <float*> [#uses=1] +@G = internal global i32* null ; <i32**> [#uses=2] + +define i32 @user() { + %P = load i32** @G ; <i32*> [#uses=1] + %Q = load i32* %P ; <i32> [#uses=1] + ret i32 %Q +} + +define void @setter() { + %Vi = bitcast float* @V to i32* ; <i32*> [#uses=1] + store i32* %Vi, i32** @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..80f8243 --- /dev/null +++ b/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output +; PR579 + +@g_40507551 = internal global i16 31038 ; <i16*> [#uses=1] + +define void @main() { + %tmp.4.i.1 = load i8* getelementptr (i8* bitcast (i16* @g_40507551 to i8*), i32 1) ; <i8> [#uses=0] + 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..5eac431 --- /dev/null +++ b/test/Transforms/GlobalOpt/2005-09-27-Crash.ll @@ -0,0 +1,27 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output + %RPyString = type { i32, %arraytype.Char } + %arraytype.Char = type { i32, [0 x i8] } + %arraytype.Signed = type { i32, [0 x i32] } + %functiontype.1 = type %RPyString* (i32) + %structtype.test = type { i32, %arraytype.Signed } +@structinstance.test = internal global { i32, { i32, [2 x i32] } } { i32 41, { i32, [2 x i32] } { i32 2, [2 x i32] [ i32 100, i32 101 ] } } ; <{ i32, { i32, [2 x i32] } }*> [#uses=1] + +define fastcc void @pypy_array_constant() { +block0: + %tmp.9 = getelementptr %structtype.test* bitcast ({ i32, { i32, [2 x i32] } }* @structinstance.test to %structtype.test*), i32 0, i32 0 ; <i32*> [#uses=0] + ret void +} + +define fastcc void @new.varsizestruct.rpy_string() { + unreachable +} + +define void @__entrypoint__pypy_array_constant() { + call fastcc void @pypy_array_constant( ) + ret void +} + +define 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..5559ef1 --- /dev/null +++ b/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll @@ -0,0 +1,135 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output +; PR820 +target datalayout = "e-p:32:32" +target triple = "i686-pc-linux-gnu" + %struct..0FileDescriptor = type { i32 } + %"struct.FlagDescription<int32>" = type { i8*, i32*, i1, i1, i32, i8* } + %"struct.FlagRegisterer<bool>" = type { i8 } + %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", i32 } + %"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 { i32, %"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 { i32*, i32*, i32* } + %"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 { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN7ScannerC2Ev }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__Z11StripStringPSsPKcc }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_ }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN8Hasher325ResetEj }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__Z25ACLRv }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_eventbuf }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__checker_bcad_variable } ] ; <[20 x { i32, void ()* }]*> [#uses=0] + +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() + +define void @_ZN14FlagRegistererIiEC1EPKcRK15FlagDescriptionIiE() { +entry: + call void @_Z12RegisterFlagIiEvPKcRK15FlagDescriptionIT_E( ) + ret void +} + +define void @_Z12RegisterFlagIiEvPKcRK15FlagDescriptionIT_E() { +entry: + call void @_ZN9MutexLockC1EP5Mutex( ) + ret void +} + +declare void @_GLOBAL__I__ZN7ScannerC2Ev() + +declare void @_GLOBAL__I__Z11StripStringPSsPKcc() + +define void @_ZNSt6vectorIiSaIiEEC1ERKS0_() { +entry: + unreachable +} + +declare void @_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_() + +declare void @_GLOBAL__I__ZN8Hasher325ResetEj() + +declare void @_GLOBAL__I__Z25ACLRv() + +define void @_ZN9MutexLockC1EP5Mutex() { +entry: + call void @_ZN5Mutex4LockEv( ) + ret void +} + +define void @_ZN5Mutex4LockEv() { +entry: + call void @_Z22Acquire_CASPViii( ) + ret void +} + +define void @_ZNSt3mapIPKc15FlagDescriptionIiE9StringCmpSaISt4pairIKS1_S3_EEE3endEv(%"struct.std::_Rb_tree_const_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >"* sret %agg.result) { +entry: + unreachable +} + +declare void @_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E() + +define void @_Z14CASPViii() { +entry: + %tmp3 = call i32 asm sideeffect "lock; cmpxchg $1,$2", "={ax},q,m,0,~{dirflag},~{fpsr},~{flags},~{memory}"( i32 0, i32* null, i32 0 ) ; <i32> [#uses=0] + unreachable +} + +declare void @_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E() + +declare void @_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E() + +define void @_Z22Acquire_CASPViii() { +entry: + call void @_Z14CASPViii( ) + unreachable +} + +declare void @_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E() + +declare void @_GLOBAL__I_eventbuf() + +define void @_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E() { +entry: + call void @_Z41__static_initialization_and_destruction_0ii1662( i32 1, i32 65535 ) + ret void +} + +define void @_Z41__static_initialization_and_destruction_0ii1662(i32 %__initialize_p, i32 %__priority) { +entry: + %__initialize_p_addr = alloca i32 ; <i32*> [#uses=2] + %__priority_addr = alloca i32 ; <i32*> [#uses=2] + store i32 %__initialize_p, i32* %__initialize_p_addr + store i32 %__priority, i32* %__priority_addr + %tmp = load i32* %__priority_addr ; <i32> [#uses=1] + %tmp.upgrd.1 = icmp eq i32 %tmp, 65535 ; <i1> [#uses=1] + br i1 %tmp.upgrd.1, label %cond_true, label %cond_next14 + +cond_true: ; preds = %entry + %tmp8 = load i32* %__initialize_p_addr ; <i32> [#uses=1] + %tmp9 = icmp eq i32 %tmp8, 1 ; <i1> [#uses=1] + br i1 %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() + +define 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..39be6c4 --- /dev/null +++ b/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll @@ -0,0 +1,33 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output + + %struct._list = type { i32*, %struct._list* } + %struct._play = type { i32, i32*, %struct._list*, %struct._play* } +@nrow = internal global i32 0 ; <i32*> [#uses=2] + +define void @make_play() { +entry: + br label %cond_true16.i + +cond_true16.i: ; preds = %cond_true16.i, %entry + %low.0.in.i.0 = phi i32* [ @nrow, %entry ], [ null, %cond_true16.i ] ; <i32*> [#uses=1] + %low.0.i = load i32* %low.0.in.i.0 ; <i32> [#uses=0] + br label %cond_true16.i +} + +define void @make_wanted() { +entry: + unreachable +} + +define void @get_good_move() { +entry: + ret void +} + +define void @main() { +entry: + store i32 8, i32* @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..1991d90 --- /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 zeroext %ch) zeroext { +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/2007-11-09-GEP-GEP-Crash.ll b/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll new file mode 100644 index 0000000..0d7d036 --- /dev/null +++ b/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll @@ -0,0 +1,19 @@ +; 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-f128:64:128" +target triple = "powerpc-apple-darwin8" + %struct.empty0 = type { } + %struct.es = type { %struct.empty0 } + %struct.es1 = type { %struct.empty0 } +@aaui1 = internal global [6 x [2 x i32]] [ [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ] ] ; <[6 x [2 x i32]]*> [#uses=1] +@aaui0 = internal global [0 x [2 x i32]] zeroinitializer ; <[0 x [2 x i32]]*> [#uses=1] + +define i8 @func() { +entry: + %tmp10 = getelementptr [2 x i32]* getelementptr ([6 x [2 x i32]]* @aaui1, i32 0, i32 0), i32 5, i32 1 ; <i32*> [#uses=1] + %tmp11 = load i32* %tmp10, align 4 ; <i32> [#uses=1] + %tmp12 = call i32 (...)* @func3( i32* null, i32 0, i32 %tmp11 ) ; <i32> [#uses=0] + ret i8 undef +} + +declare i32 @func3(...) + diff --git a/test/Transforms/GlobalOpt/2008-01-03-Crash.ll b/test/Transforms/GlobalOpt/2008-01-03-Crash.ll new file mode 100644 index 0000000..3d8c77d --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-01-03-Crash.ll @@ -0,0 +1,26 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis +; PR1896 + +@indirect1 = internal global void (i32)* null ; <void (i32)**> [#uses=2] + +declare void @indirectmarked(i32) + +define i32 @main() { +entry: + br i1 false, label %cond_next20.i, label %cond_true.i9 + +cond_true.i9: ; preds = %entry + ret i32 0 + +cond_next20.i: ; preds = %entry + store void (i32)* @indirectmarked, void (i32)** @indirect1, align 4 + br i1 false, label %cond_next21.i.i23.i, label %stack_restore + +stack_restore: ; preds = %cond_next20.i + ret i32 0 + +cond_next21.i.i23.i: ; preds = %cond_next20.i + %tmp6.i4.i = load i32* bitcast (void (i32)** @indirect1 to i32*), align 4 ; <i32> [#uses=0] + ret i32 0 +} + diff --git a/test/Transforms/GlobalOpt/2008-01-13-OutOfRangeSROA.ll b/test/Transforms/GlobalOpt/2008-01-13-OutOfRangeSROA.ll new file mode 100644 index 0000000..aace346 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-01-13-OutOfRangeSROA.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {16 x .31 x double.. zeroinitializer} + +; The 'X' indices could be larger than 31. Do not SROA the outer indices of this array. +@mm = internal global [16 x [31 x double]] zeroinitializer, align 32 + +define void @test(i32 %X) { + %P = getelementptr [16 x [31 x double]]* @mm, i32 0, i32 0, i32 %X + store double 1.0, double* %P + ret void +} + +define double @get(i32 %X) { + %P = getelementptr [16 x [31 x double]]* @mm, i32 0, i32 0, i32 %X + %V = load double* %P + ret double %V +} diff --git a/test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll b/test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll new file mode 100644 index 0000000..0a8dd49 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {volatile load} +@t0.1441 = internal global double 0x3FD5555555555555, align 8 ; <double*> [#uses=1] + +define double @foo() nounwind { +entry: + %tmp1 = volatile load double* @t0.1441, align 8 ; <double> [#uses=2] + %tmp4 = mul double %tmp1, %tmp1 ; <double> [#uses=1] + ret double %tmp4 +} diff --git a/test/Transforms/GlobalOpt/2008-02-16-NestAttr.ll b/test/Transforms/GlobalOpt/2008-02-16-NestAttr.ll new file mode 100644 index 0000000..59996c5 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-02-16-NestAttr.ll @@ -0,0 +1,57 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep { nest } | count 1 + %struct.FRAME.nest = type { i32, i32 (i32)* } + %struct.__builtin_trampoline = type { [10 x i8] } +@.str = internal constant [7 x i8] c"%d %d\0A\00" ; <[7 x i8]*> [#uses=1] + +define i32 @process(i32 (i32)* %func) nounwind { +entry: + %tmp2 = tail call i32 %func( i32 1 ) nounwind ; <i32> [#uses=1] + ret i32 %tmp2 +} + +define internal fastcc i32 @g.1478(%struct.FRAME.nest* nest %CHAIN.1, i32 %m) nounwind { +entry: + %tmp3 = getelementptr %struct.FRAME.nest* %CHAIN.1, i32 0, i32 0 ; <i32*> [#uses=1] + %tmp4 = load i32* %tmp3, align 4 ; <i32> [#uses=1] + %tmp7 = icmp eq i32 %tmp4, %m ; <i1> [#uses=1] + %tmp78 = zext i1 %tmp7 to i32 ; <i32> [#uses=1] + ret i32 %tmp78 +} + +define internal i32 @f.1481(%struct.FRAME.nest* nest %CHAIN.2, i32 %m) nounwind { +entry: + %tmp4 = tail call fastcc i32 @g.1478( %struct.FRAME.nest* nest %CHAIN.2, i32 %m ) nounwind ; <i32> [#uses=1] + %tmp6 = getelementptr %struct.FRAME.nest* %CHAIN.2, i32 0, i32 0 ; <i32*> [#uses=1] + %tmp7 = load i32* %tmp6, align 4 ; <i32> [#uses=1] + %tmp9 = icmp eq i32 %tmp4, %tmp7 ; <i1> [#uses=1] + %tmp910 = zext i1 %tmp9 to i32 ; <i32> [#uses=1] + ret i32 %tmp910 +} + +define i32 @nest(i32 %n) nounwind { +entry: + %TRAMP.316 = alloca [10 x i8] ; <[10 x i8]*> [#uses=1] + %FRAME.0 = alloca %struct.FRAME.nest ; <%struct.FRAME.nest*> [#uses=3] + %TRAMP.316.sub = getelementptr [10 x i8]* %TRAMP.316, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp3 = getelementptr %struct.FRAME.nest* %FRAME.0, i32 0, i32 0 ; <i32*> [#uses=1] + store i32 %n, i32* %tmp3, align 8 + %FRAME.06 = bitcast %struct.FRAME.nest* %FRAME.0 to i8* ; <i8*> [#uses=1] + %tramp = call i8* @llvm.init.trampoline( i8* %TRAMP.316.sub, i8* bitcast (i32 (%struct.FRAME.nest*, i32)* @f.1481 to i8*), i8* %FRAME.06 ) ; <i8*> [#uses=1] + %tmp7 = getelementptr %struct.FRAME.nest* %FRAME.0, i32 0, i32 1 ; <i32 (i32)**> [#uses=1] + %tmp89 = bitcast i8* %tramp to i32 (i32)* ; <i32 (i32)*> [#uses=2] + store i32 (i32)* %tmp89, i32 (i32)** %tmp7, align 4 + %tmp13 = call i32 @process( i32 (i32)* %tmp89 ) nounwind ; <i32> [#uses=1] + ret i32 %tmp13 +} + +declare i8* @llvm.init.trampoline(i8*, i8*, i8*) nounwind + +define i32 @main() nounwind { +entry: + %tmp = tail call i32 @nest( i32 2 ) nounwind ; <i32> [#uses=1] + %tmp1 = tail call i32 @nest( i32 1 ) nounwind ; <i32> [#uses=1] + %tmp3 = tail call i32 (i8*, ...)* @printf( i8* noalias getelementptr ([7 x i8]* @.str, i32 0, i32 0), i32 %tmp1, i32 %tmp ) nounwind ; <i32> [#uses=0] + ret i32 undef +} + +declare i32 @printf(i8*, ...) nounwind diff --git a/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll b/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll new file mode 100644 index 0000000..3464be9 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll @@ -0,0 +1,32 @@ +; Verify that when @G is SROA'd that the new globals have correct +; alignments. Elements 0 and 2 must be 16-byte aligned, and element +; 1 must be at least 8 byte aligned (but could be more). + +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@G.0 = internal global .*align 16} +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@G.1 = internal global .*align 8} +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@G.2 = internal global .*align 16} +; rdar://5891920 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +target triple = "x86_64-apple-darwin8" + +%T = type { double, double, double } + +@G = internal global %T zeroinitializer, align 16 + + +define void @test() { + store double 1.0, double* getelementptr (%T* @G, i32 0, i32 0), align 16 + store double 2.0, double* getelementptr (%T* @G, i32 0, i32 1), align 8 + store double 3.0, double* getelementptr (%T* @G, i32 0, i32 2), align 16 + ret void +} + +define double @test2() { + %V1 = load double* getelementptr (%T* @G, i32 0, i32 0), align 16 + %V2 = load double* getelementptr (%T* @G, i32 0, i32 1), align 8 + %V3 = load double* getelementptr (%T* @G, i32 0, i32 2), align 16 + %R = add double %V1, %V2 + %R2 = add double %R, %V3 + ret double %R2 +} diff --git a/test/Transforms/GlobalOpt/2008-07-17-addrspace.ll b/test/Transforms/GlobalOpt/2008-07-17-addrspace.ll new file mode 100644 index 0000000..735a84d --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-07-17-addrspace.ll @@ -0,0 +1,28 @@ +; This test lets globalopt split the global struct and array into different +; values. This used to crash, because globalopt forgot to put the new var in the +; same address space as the old one. + +; RUN: llvm-as < %s | opt -globalopt | llvm-dis > %t +; Check that the new global values still have their address space +; RUN: cat %t | grep global.*addrspace + +@struct = internal addrspace(1) global { i32, i32 } zeroinitializer +@array = internal addrspace(1) global [ 2 x i32 ] zeroinitializer + +define i32 @foo() { + %A = load i32 addrspace(1) * getelementptr ({ i32, i32 } addrspace(1) * @struct, i32 0, i32 0) + %B = load i32 addrspace(1) * getelementptr ([ 2 x i32 ] addrspace(1) * @array, i32 0, i32 0) + ; Use the loaded values, so they won't get removed completely + %R = add i32 %A, %B + ret i32 %R +} + +; We put stores in a different function, so that the global variables won't get +; optimized away completely. +define void @bar(i32 %R) { + store i32 %R, i32 addrspace(1) * getelementptr ([ 2 x i32 ] addrspace(1) * @array, i32 0, i32 0) + store i32 %R, i32 addrspace(1) * getelementptr ({ i32, i32 } addrspace(1) * @struct, i32 0, i32 0) + ret void +} + + diff --git a/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash-2.ll b/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash-2.ll new file mode 100644 index 0000000..cdc2771 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash-2.ll @@ -0,0 +1,24 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis +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-f80:128:128" +target triple = "i386-apple-darwin7" + %struct.foo = type { i32, i32 } +@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2] + +define void @bar(i32 %Size) nounwind noinline { +entry: + %tmp = malloc [1000000 x %struct.foo] ; <[1000000 x %struct.foo]*> [#uses=1] + %.sub = getelementptr [1000000 x %struct.foo]* %tmp, i32 0, i32 0 ; <%struct.foo*> [#uses=1] + store %struct.foo* %.sub, %struct.foo** @X, align 4 + ret void +} + +define i32 @baz() nounwind readonly noinline { +bb1.thread: + %tmpLD1 = load %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=2] + br label %bb1 + +bb1: ; preds = %bb1, %bb1.thread + %tmp = phi %struct.foo* [ %tmpLD1, %bb1.thread ], [ %tmpLD1, %bb1 ] ; <%struct.foo*> [#uses=1] + %0 = getelementptr %struct.foo* %tmp, i32 1 ; <%struct.foo*> [#uses=0] + br label %bb1 +} diff --git a/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash.ll b/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash.ll new file mode 100644 index 0000000..f284840 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash.ll @@ -0,0 +1,27 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis +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-f80:128:128" +target triple = "i386-apple-darwin7" + %struct.foo = type { i32, i32 } +@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2] + +define void @bar(i32 %Size) nounwind noinline { +entry: + %tmp = malloc [1000000 x %struct.foo] ; <[1000000 x %struct.foo]*> [#uses=1] + %.sub = getelementptr [1000000 x %struct.foo]* %tmp, i32 0, i32 0 ; <%struct.foo*> [#uses=1] + store %struct.foo* %.sub, %struct.foo** @X, align 4 + ret void +} + +define i32 @baz() nounwind readonly noinline { +bb1.thread: + %tmpLD1 = load %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=3] + store %struct.foo* %tmpLD1, %struct.foo** null + br label %bb1 + +bb1: ; preds = %bb1, %bb1.thread + %tmp = phi %struct.foo* [ %tmpLD1, %bb1.thread ], [ %tmpLD1, %bb1 ] ; <%struct.foo*> [#uses=0] + br i1 false, label %bb2, label %bb1 + +bb2: ; preds = %bb1 + ret i32 0 +} diff --git a/test/Transforms/GlobalOpt/2009-01-13-phi-user.ll b/test/Transforms/GlobalOpt/2009-01-13-phi-user.ll new file mode 100644 index 0000000..03ec3b6 --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-01-13-phi-user.ll @@ -0,0 +1,35 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {phi.*@head} +; PR3321 +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +target triple = "x86_64-unknown-linux-gnu" + %struct.node = type { %struct.node*, i32 } +@head = internal global %struct.node* null ; <%struct.node**> [#uses=2] +@node = internal global %struct.node { %struct.node* null, i32 42 }, align 16 ; <%struct.node*> [#uses=1] + +define i32 @f() nounwind { +entry: + store %struct.node* @node, %struct.node** @head, align 8 + br label %bb1 + +bb: ; preds = %bb1 + %0 = getelementptr %struct.node* %t.0, i64 0, i32 1 ; <i32*> [#uses=1] + %1 = load i32* %0, align 4 ; <i32> [#uses=1] + %2 = getelementptr %struct.node* %t.0, i64 0, i32 0 ; <%struct.node**> [#uses=1] + br label %bb1 + +bb1: ; preds = %bb, %entry + %value.0 = phi i32 [ undef, %entry ], [ %1, %bb ] ; <i32> [#uses=1] + %t.0.in = phi %struct.node** [ @head, %entry ], [ %2, %bb ] ; <%struct.node**> [#uses=1] + %t.0 = load %struct.node** %t.0.in ; <%struct.node*> [#uses=3] + %3 = icmp eq %struct.node* %t.0, null ; <i1> [#uses=1] + br i1 %3, label %bb2, label %bb + +bb2: ; preds = %bb1 + ret i32 %value.0 +} + +define i32 @main() nounwind { +entry: + %0 = call i32 @f() nounwind ; <i32> [#uses=1] + ret i32 %0 +} diff --git a/test/Transforms/GlobalOpt/2009-02-15-BitcastAlias.ll b/test/Transforms/GlobalOpt/2009-02-15-BitcastAlias.ll new file mode 100644 index 0000000..e59c8df --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-02-15-BitcastAlias.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | opt -globalopt + +@g = external global i32 + +@a = alias bitcast (i32* @g to i8*) + +define void @f() { + %tmp = load i8* @a + ret void +} diff --git a/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll b/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll new file mode 100644 index 0000000..f042e59 --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {define void @a} + +define internal void @f() { + ret void +} + +@a = alias void ()* @f + +define void @g() { + call void()* @a() + ret void +} diff --git a/test/Transforms/GlobalOpt/2009-03-03-dbg.ll b/test/Transforms/GlobalOpt/2009-03-03-dbg.ll new file mode 100644 index 0000000..1996f62 --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-03-03-dbg.ll @@ -0,0 +1,54 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep global_variable42 +; XFAIL: * + + %llvm.dbg.anchor.type = type { i32, i32 } + %llvm.dbg.basictype.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, i32 } + %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8*, i1, i1, i8*, i32 } + %llvm.dbg.composite.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, { }*, { }*, i32 } + %llvm.dbg.derivedtype.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, { }* } + %llvm.dbg.global_variable.type = type { i32, { }*, { }*, i8*, i8*, i8*, { }*, i32, { }*, i1, i1, { }* } + %llvm.dbg.subprogram.type = type { i32, { }*, { }*, i8*, i8*, i8*, { }*, i32, { }*, i1, i1 } + %llvm.dbg.subrange.type = type { i32, i64, i64 } + %llvm.dbg.variable.type = type { i32, { }*, i8*, { }*, i32, { }* } +@llvm.dbg.compile_units = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 17 }, section "llvm.metadata" ; <%llvm.dbg.anchor.type*> [#uses=1] +@.str = internal constant [4 x i8] c"a.c\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] +@.str1 = internal constant [5 x i8] c"/tmp\00", section "llvm.metadata" ; <[5 x i8]*> [#uses=1] +@.str2 = internal constant [57 x i8] c"4.2.1 (Based on Apple Inc. build 5636) (LLVM build 2099)\00", section "llvm.metadata" ; <[57 x i8]*> [#uses=1] +@llvm.dbg.compile_unit = internal constant %llvm.dbg.compile_unit.type { i32 458769, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.compile_units to { }*), i32 1, i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), i8* getelementptr ([5 x i8]* @.str1, i32 0, i32 0), i8* getelementptr ([57 x i8]* @.str2, i32 0, i32 0), i1 true, i1 false, i8* null, i32 0 }, section "llvm.metadata" ; <%llvm.dbg.compile_unit.type*> [#uses=1] +@.str3 = internal constant [4 x i8] c"int\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] +@llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type { i32 458788, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i8* getelementptr ([4 x i8]* @.str3, i32 0, i32 0), { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 0, i64 32, i64 32, i64 0, i32 0, i32 5 }, section "llvm.metadata" ; <%llvm.dbg.basictype.type*> [#uses=1] +@llvm.dbg.array = internal constant [1 x { }*] [ { }* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to { }*) ], section "llvm.metadata" ; <[1 x { }*]*> [#uses=1] +@llvm.dbg.composite = internal constant %llvm.dbg.composite.type { i32 458773, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i8* null, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 0, i64 0, i64 0, i64 0, i32 0, { }* null, { }* bitcast ([1 x { }*]* @llvm.dbg.array to { }*), i32 0 }, section "llvm.metadata" ; <%llvm.dbg.composite.type*> [#uses=1] +@llvm.dbg.subprograms = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 46 }, section "llvm.metadata" ; <%llvm.dbg.anchor.type*> [#uses=1] +@.str4 = internal constant [5 x i8] c"main\00", section "llvm.metadata" ; <[5 x i8]*> [#uses=1] +@llvm.dbg.subprogram = internal constant %llvm.dbg.subprogram.type { i32 458798, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.subprograms to { }*), { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i8* getelementptr ([5 x i8]* @.str4, i32 0, i32 0), i8* getelementptr ([5 x i8]* @.str4, i32 0, i32 0), i8* null, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 3, { }* bitcast (%llvm.dbg.composite.type* @llvm.dbg.composite to { }*), i1 false, i1 true }, section "llvm.metadata" ; <%llvm.dbg.subprogram.type*> [#uses=1] +@llvm.dbg.derivedtype = internal constant %llvm.dbg.derivedtype.type { i32 458767, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i8* null, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 0, i64 32, i64 32, i64 0, i32 0, { }* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to { }*) }, section "llvm.metadata" ; <%llvm.dbg.derivedtype.type*> [#uses=1] +@.str5 = internal constant [6 x i8] c"i_ptr\00", section "llvm.metadata" ; <[6 x i8]*> [#uses=1] +@llvm.dbg.variable = internal constant %llvm.dbg.variable.type { i32 459008, { }* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to { }*), i8* getelementptr ([6 x i8]* @.str5, i32 0, i32 0), { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 5, { }* bitcast (%llvm.dbg.derivedtype.type* @llvm.dbg.derivedtype to { }*) }, section "llvm.metadata" ; <%llvm.dbg.variable.type*> [#uses=0] +@sillyArray.1433 = internal global [8 x i32] [ i32 2, i32 3, i32 5, i32 7, i32 11, i32 13, i32 17, i32 19 ] ; <[8 x i32]*> [#uses=1] +@llvm.dbg.subrange = internal constant %llvm.dbg.subrange.type { i32 458785, i64 0, i64 7 }, section "llvm.metadata" ; <%llvm.dbg.subrange.type*> [#uses=1] +@llvm.dbg.array6 = internal constant [1 x { }*] [ { }* bitcast (%llvm.dbg.subrange.type* @llvm.dbg.subrange to { }*) ], section "llvm.metadata" ; <[1 x { }*]*> [#uses=1] +@llvm.dbg.composite7 = internal constant %llvm.dbg.composite.type { i32 458753, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i8* null, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 0, i64 256, i64 32, i64 0, i32 0, { }* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to { }*), { }* bitcast ([1 x { }*]* @llvm.dbg.array6 to { }*), i32 0 }, section "llvm.metadata" ; <%llvm.dbg.composite.type*> [#uses=1] +@llvm.dbg.global_variables = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 52 }, section "llvm.metadata" ; <%llvm.dbg.anchor.type*> [#uses=1] +@.str8 = internal constant [16 x i8] c"sillyArray.1433\00", section "llvm.metadata" ; <[16 x i8]*> [#uses=1] +@.str9 = internal constant [11 x i8] c"sillyArray\00", section "llvm.metadata" ; <[11 x i8]*> [#uses=1] +@llvm.dbg.global_variable42 = internal constant %llvm.dbg.global_variable.type { i32 458804, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.global_variables to { }*), { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i8* getelementptr ([16 x i8]* @.str8, i32 0, i32 0), i8* getelementptr ([11 x i8]* @.str9, i32 0, i32 0), i8* null, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*), i32 4, { }* bitcast (%llvm.dbg.composite.type* @llvm.dbg.composite7 to { }*), i1 true, i1 true, { }* bitcast ([8 x i32]* @sillyArray.1433 to { }*) }, section "llvm.metadata" ; <%llvm.dbg.global_variable.type*> [#uses=0] + +define i32 @main() nounwind { +entry: + %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + call void @llvm.dbg.func.start({ }* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to { }*)) + call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) + call void @llvm.dbg.stoppoint(i32 6, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) + call void @llvm.dbg.stoppoint(i32 6, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) + call void @llvm.dbg.region.end({ }* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to { }*)) + ret i32 0 +} + +declare void @llvm.dbg.func.start({ }*) nounwind + +declare void @llvm.dbg.declare({ }*, { }*) nounwind + +declare void @llvm.dbg.stoppoint(i32, i32, { }*) nounwind + +declare void @llvm.dbg.region.end({ }*) nounwind diff --git a/test/Transforms/GlobalOpt/2009-03-05-dbg.ll b/test/Transforms/GlobalOpt/2009-03-05-dbg.ll new file mode 100644 index 0000000..30e9a63 --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-03-05-dbg.ll @@ -0,0 +1,67 @@ +; RUN: llvm-as < %s | opt -globalopt -stats -disable-output |& grep "1 globalopt - Number of global vars shrunk to booleans" +; XFAIL: * + + type { } ; type %0 + %llvm.dbg.anchor.type = type { i32, i32 } + %llvm.dbg.basictype.type = type { i32, %0*, i8*, %0*, i32, i64, i64, i64, i32, i32 } + %llvm.dbg.compile_unit.type = type { i32, %0*, i32, i8*, i8*, i8*, i1, i1, i8*, i32 } + %llvm.dbg.composite.type = type { i32, %0*, i8*, %0*, i32, i64, i64, i64, i32, %0*, %0*, i32 } + %llvm.dbg.global_variable.type = type { i32, %0*, %0*, i8*, i8*, i8*, %0*, i32, %0*, i1, i1, %0* } + %llvm.dbg.subprogram.type = type { i32, %0*, %0*, i8*, i8*, i8*, %0*, i32, %0*, i1, i1 } + %llvm.dbg.variable.type = type { i32, %0*, i8*, %0*, i32, %0* } +@llvm.dbg.compile_units = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 17 }, section "llvm.metadata" ; <%llvm.dbg.anchor.type*> [#uses=1] +@.str = internal constant [5 x i8] c"gs.c\00", section "llvm.metadata" ; <[5 x i8]*> [#uses=1] +@.str1 = internal constant [6 x i8] c"/tmp/\00", section "llvm.metadata" ; <[6 x i8]*> [#uses=1] +@.str2 = internal constant [55 x i8] c"4.2.1 (Based on Apple Inc. build 5641) (LLVM build 00)\00", section "llvm.metadata" ; <[55 x i8]*> [#uses=1] +@llvm.dbg.compile_unit = internal constant %llvm.dbg.compile_unit.type { i32 458769, %0* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.compile_units to %0*), i32 1, i8* getelementptr ([5 x i8]* @.str, i32 0, i32 0), i8* getelementptr ([6 x i8]* @.str1, i32 0, i32 0), i8* getelementptr ([55 x i8]* @.str2, i32 0, i32 0), i1 true, i1 false, i8* null, i32 0 }, section "llvm.metadata" ; <%llvm.dbg.compile_unit.type*> [#uses=1] +@.str3 = internal constant [4 x i8] c"int\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] +@llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type { i32 458788, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i8* getelementptr ([4 x i8]* @.str3, i32 0, i32 0), %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i32 0, i64 32, i64 32, i64 0, i32 0, i32 5 }, section "llvm.metadata" ; <%llvm.dbg.basictype.type*> [#uses=1] +@llvm.dbg.array = internal constant [2 x %0*] [%0* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to %0*), %0* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to %0*)], section "llvm.metadata" ; <[2 x %0*]*> [#uses=1] +@llvm.dbg.composite = internal constant %llvm.dbg.composite.type { i32 458773, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i8* null, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i32 0, i64 0, i64 0, i64 0, i32 0, %0* null, %0* bitcast ([2 x %0*]* @llvm.dbg.array to %0*), i32 0 }, section "llvm.metadata" ; <%llvm.dbg.composite.type*> [#uses=1] +@llvm.dbg.subprograms = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 46 }, section "llvm.metadata" ; <%llvm.dbg.anchor.type*> [#uses=1] +@.str4 = internal constant [4 x i8] c"foo\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] +@llvm.dbg.subprogram = internal constant %llvm.dbg.subprogram.type { i32 458798, %0* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.subprograms to %0*), %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i8* getelementptr ([4 x i8]* @.str4, i32 0, i32 0), i8* getelementptr ([4 x i8]* @.str4, i32 0, i32 0), i8* null, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i32 4, %0* bitcast (%llvm.dbg.composite.type* @llvm.dbg.composite to %0*), i1 false, i1 true }, section "llvm.metadata" ; <%llvm.dbg.subprogram.type*> [#uses=1] +@.str5 = internal constant [2 x i8] c"i\00", section "llvm.metadata" ; <[2 x i8]*> [#uses=1] +@llvm.dbg.variable = internal constant %llvm.dbg.variable.type { i32 459009, %0* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to %0*), i8* getelementptr ([2 x i8]* @.str5, i32 0, i32 0), %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i32 4, %0* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to %0*) }, section "llvm.metadata" ; <%llvm.dbg.variable.type*> [#uses=1] +@Stop = internal global i32 0 ; <i32*> [#uses=4] +@llvm.dbg.global_variables = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 52 }, section "llvm.metadata" ; <%llvm.dbg.anchor.type*> [#uses=1] +@.str6 = internal constant [5 x i8] c"Stop\00", section "llvm.metadata" ; <[5 x i8]*> [#uses=1] +@llvm.dbg.global_variable = internal constant %llvm.dbg.global_variable.type { i32 458804, %0* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.global_variables to %0*), %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i8* getelementptr ([5 x i8]* @.str6, i32 0, i32 0), i8* getelementptr ([5 x i8]* @.str6, i32 0, i32 0), i8* null, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*), i32 2, %0* bitcast (%llvm.dbg.basictype.type* @llvm.dbg.basictype to %0*), i1 true, i1 true, %0* bitcast (i32* @Stop to %0*) }, section "llvm.metadata" ; <%llvm.dbg.global_variable.type*> [#uses=0] + +define i32 @foo(i32 %i) nounwind { +entry: + %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + call void @llvm.dbg.func.start(%0* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to %0*)) + call void @llvm.dbg.stoppoint(i32 5, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + %0 = load i32* @Stop, align 4 ; <i32> [#uses=1] + %1 = icmp eq i32 %0, 1 ; <i1> [#uses=1] + br i1 %1, label %bb, label %bb1 + +bb: ; preds = %entry + call void @llvm.dbg.stoppoint(i32 6, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + store i32 0, i32* @Stop, align 4 + call void @llvm.dbg.stoppoint(i32 7, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + %2 = mul i32 %i, 42 ; <i32> [#uses=1] + br label %bb2 + +bb1: ; preds = %entry + call void @llvm.dbg.stoppoint(i32 9, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + store i32 1, i32* @Stop, align 4 + call void @llvm.dbg.stoppoint(i32 10, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + br label %bb2 + +bb2: ; preds = %bb1, %bb + %.0 = phi i32 [ %i, %bb1 ], [ %2, %bb ] ; <i32> [#uses=1] + call void @llvm.dbg.stoppoint(i32 10, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + call void @llvm.dbg.stoppoint(i32 10, i32 0, %0* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to %0*)) + call void @llvm.dbg.region.end(%0* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to %0*)) + ret i32 %.0 +} + +declare void @llvm.dbg.func.start(%0*) nounwind readnone + +declare void @llvm.dbg.declare(%0*, %0*) nounwind readnone + +declare void @llvm.dbg.stoppoint(i32, i32, %0*) nounwind readnone + +declare void @llvm.dbg.region.end(%0*) nounwind readnone diff --git a/test/Transforms/GlobalOpt/2009-03-06-Anonymous.ll b/test/Transforms/GlobalOpt/2009-03-06-Anonymous.ll new file mode 100644 index 0000000..ea13d29 --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-03-06-Anonymous.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep internal | count 2 + +global i32 0 +define i32* @1() { + ret i32* @0 +} +define i32* @f() { +entry: + call i32* @1() + ret i32* %0 +} diff --git a/test/Transforms/GlobalOpt/2009-03-07-PromotePtrToBool.ll b/test/Transforms/GlobalOpt/2009-03-07-PromotePtrToBool.ll new file mode 100644 index 0000000..8dba5b1 --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-03-07-PromotePtrToBool.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@X = internal global i32} +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-f80:128:128" +target triple = "i386-apple-darwin7" +@X = internal global i32* null ; <i32**> [#uses=2] +@Y = internal global i32 0 ; <i32*> [#uses=1] + +define void @foo() nounwind { +entry: + store i32* @Y, i32** @X, align 4 + ret void +} + +define i32* @get() nounwind { +entry: + %0 = load i32** @X, align 4 ; <i32*> [#uses=1] + ret i32* %0 +} diff --git a/test/Transforms/GlobalOpt/2009-06-01-RecursivePHI.ll b/test/Transforms/GlobalOpt/2009-06-01-RecursivePHI.ll new file mode 100644 index 0000000..0ce16dd --- /dev/null +++ b/test/Transforms/GlobalOpt/2009-06-01-RecursivePHI.ll @@ -0,0 +1,117 @@ +; RUN: llvm-as < %s | opt -globalopt + + %struct.s_annealing_sched = type { i32, float, float, float, float } + %struct.s_bb = type { i32, i32, i32, i32 } + %struct.s_net = type { i8*, i32, i32*, float, float } + %struct.s_placer_opts = type { i32, float, i32, i32, i8*, i32, i32 } +@net = internal global %struct.s_net* null ; <%struct.s_net**> [#uses=4] + +define fastcc void @alloc_and_load_placement_structs(i32 %place_cost_type, i32 %num_regions, float %place_cost_exp, float*** nocapture %old_region_occ_x, float*** nocapture %old_region_occ_y) nounwind ssp { +entry: + br i1 undef, label %bb.i, label %my_malloc.exit + +bb.i: ; preds = %entry + unreachable + +my_malloc.exit: ; preds = %entry + br i1 undef, label %bb.i81, label %my_malloc.exit83 + +bb.i81: ; preds = %my_malloc.exit + unreachable + +my_malloc.exit83: ; preds = %my_malloc.exit + br i1 undef, label %bb.i.i57, label %my_calloc.exit.i + +bb.i.i57: ; preds = %my_malloc.exit83 + unreachable + +my_calloc.exit.i: ; preds = %my_malloc.exit83 + br i1 undef, label %bb.i4.i, label %my_calloc.exit5.i + +bb.i4.i: ; preds = %my_calloc.exit.i + unreachable + +my_calloc.exit5.i: ; preds = %my_calloc.exit.i + %.pre.i58 = load %struct.s_net** @net, align 4 ; <%struct.s_net*> [#uses=1] + br label %bb17.i78 + +bb1.i61: ; preds = %bb4.preheader.i, %bb1.i61 + br i1 undef, label %bb1.i61, label %bb5.i62 + +bb5.i62: ; preds = %bb1.i61 + br i1 undef, label %bb6.i64, label %bb15.preheader.i + +bb15.preheader.i: ; preds = %bb4.preheader.i, %bb5.i62 + br label %bb16.i77 + +bb6.i64: ; preds = %bb5.i62 + br i1 undef, label %bb7.i65, label %bb8.i67 + +bb7.i65: ; preds = %bb6.i64 + unreachable + +bb8.i67: ; preds = %bb6.i64 + br i1 undef, label %bb.i1.i68, label %my_malloc.exit.i70 + +bb.i1.i68: ; preds = %bb8.i67 + unreachable + +my_malloc.exit.i70: ; preds = %bb8.i67 + %0 = load %struct.s_net** @net, align 4 ; <%struct.s_net*> [#uses=1] + br i1 undef, label %bb9.i71, label %bb16.i77 + +bb9.i71: ; preds = %bb9.i71, %my_malloc.exit.i70 + %1 = load %struct.s_net** @net, align 4 ; <%struct.s_net*> [#uses=1] + br i1 undef, label %bb9.i71, label %bb16.i77 + +bb16.i77: ; preds = %bb9.i71, %my_malloc.exit.i70, %bb15.preheader.i + %.pre41.i.rle244 = phi %struct.s_net* [ %.pre41.i, %bb15.preheader.i ], [ %0, %my_malloc.exit.i70 ], [ %1, %bb9.i71 ] ; <%struct.s_net*> [#uses=1] + br label %bb17.i78 + +bb17.i78: ; preds = %bb16.i77, %my_calloc.exit5.i + %.pre41.i = phi %struct.s_net* [ %.pre41.i.rle244, %bb16.i77 ], [ %.pre.i58, %my_calloc.exit5.i ] ; <%struct.s_net*> [#uses=1] + br i1 undef, label %bb4.preheader.i, label %alloc_and_load_unique_pin_list.exit + +bb4.preheader.i: ; preds = %bb17.i78 + br i1 undef, label %bb1.i61, label %bb15.preheader.i + +alloc_and_load_unique_pin_list.exit: ; preds = %bb17.i78 + ret void +} + +define void @read_net(i8* %net_file) nounwind ssp { +entry: + br i1 undef, label %bb3.us.us.i, label %bb6.preheader + +bb6.preheader: ; preds = %entry + br i1 undef, label %bb7, label %bb + +bb3.us.us.i: ; preds = %entry + unreachable + +bb: ; preds = %bb6.preheader + br i1 undef, label %bb.i34, label %bb1.i38 + +bb.i34: ; preds = %bb + unreachable + +bb1.i38: ; preds = %bb + %0 = malloc %struct.s_net, i32 undef ; <%struct.s_net*> [#uses=1] + br i1 undef, label %bb.i1.i39, label %my_malloc.exit2.i + +bb.i1.i39: ; preds = %bb1.i38 + unreachable + +my_malloc.exit2.i: ; preds = %bb1.i38 + store %struct.s_net* %0, %struct.s_net** @net, align 4 + br i1 undef, label %bb.i7.i40, label %my_malloc.exit8.i + +bb.i7.i40: ; preds = %my_malloc.exit2.i + unreachable + +my_malloc.exit8.i: ; preds = %my_malloc.exit2.i + unreachable + +bb7: ; preds = %bb6.preheader + unreachable +} diff --git a/test/Transforms/GlobalOpt/alias-resolve.ll b/test/Transforms/GlobalOpt/alias-resolve.ll new file mode 100644 index 0000000..3cae413 --- /dev/null +++ b/test/Transforms/GlobalOpt/alias-resolve.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis > %t +; RUN: cat %t | grep foo1 | count 1 +; RUN: cat %t | grep foo2 | count 4 +; RUN: cat %t | grep bar1 | count 1 +; RUN: cat %t | grep bar2 | count 4 + +@foo1 = alias void ()* @foo2 +@foo2 = alias weak void()* @bar1 +@bar1 = alias void ()* @bar2 + +declare void @bar2() + +define void @baz() { +entry: + call void @foo1() + call void @foo2() + call void @bar1() + ret void +} diff --git a/test/Transforms/GlobalOpt/basictest.ll b/test/Transforms/GlobalOpt/basictest.ll new file mode 100644 index 0000000..1c3bdbb --- /dev/null +++ b/test/Transforms/GlobalOpt/basictest.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep global + +@X = internal global i32 4 ; <i32*> [#uses=1] + +define i32 @foo() { + %V = load i32* @X ; <i32> [#uses=1] + ret i32 %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-dbg.ll b/test/Transforms/GlobalOpt/ctor-list-opt-dbg.ll new file mode 100644 index 0000000..45fb453 --- /dev/null +++ b/test/Transforms/GlobalOpt/ctor-list-opt-dbg.ll @@ -0,0 +1,98 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep CTOR +@llvm.global_ctors = appending global [10 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @CTOR1 }, { i32, void ()* } { i32 65535, void ()* @CTOR1 }, { i32, void ()* } { i32 65535, void ()* @CTOR2 }, { i32, void ()* } { i32 65535, void ()* @CTOR3 }, { i32, void ()* } { i32 65535, void ()* @CTOR4 }, { i32, void ()* } { i32 65535, void ()* @CTOR5 }, { i32, void ()* } { i32 65535, void ()* @CTOR6 }, { i32, void ()* } { i32 65535, void ()* @CTOR7 }, { i32, void ()* } { i32 65535, void ()* @CTOR8 }, { i32, void ()* } { i32 2147483647, void ()* null } ] ; <[10 x { i32, void ()* }]*> [#uses=0] +@G = global i32 0 ; <i32*> [#uses=1] +@G2 = global i32 0 ; <i32*> [#uses=1] +@G3 = global i32 -123 ; <i32*> [#uses=2] +@X = global { i32, [2 x i32] } { i32 0, [2 x i32] [ i32 17, i32 21 ] } ; <{ i32, [2 x i32] }*> [#uses=2] +@Y = global i32 -1 ; <i32*> [#uses=2] +@Z = global i32 123 ; <i32*> [#uses=1] +@D = global double 0.000000e+00 ; <double*> [#uses=1] +@CTORGV = internal global i1 false ; <i1*> [#uses=2] + + %llvm.dbg.anchor.type = type { i32, i32 } + %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8*, i1, i1, i8* } + +@llvm.dbg.compile_units = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 17 }, section "llvm.metadata" ; + +@.str = internal constant [4 x i8] c"a.c\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] +@.str1 = internal constant [6 x i8] c"/tmp/\00", section "llvm.metadata" ; <[6 x i8]*> [#uses=1] +@.str2 = internal constant [55 x i8] c"4.2.1 (Based on Apple Inc. build 5636) (LLVM build 00)\00", section "llvm.metadata" ; <[55 x i8]*> [#uses=1] +@llvm.dbg.compile_unit = internal constant %llvm.dbg.compile_unit.type { i32 458769, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.compile_units to { }*), i32 1, i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), i8* getelementptr ([6 x i8]* @.str1, i32 0, i32 0), i8* getelementptr ([55 x i8]* @.str2, i32 0, i32 0), i1 true, i1 false, i8* null }, section "llvm.metadata" ; <%llvm.dbg.compile_unit.type*> [#uses=1] + +declare void @llvm.dbg.stoppoint(i32, i32, { }*) nounwind + +define internal void @CTOR1() { + ret void +} + +define internal void @CTOR2() { + %A = add i32 1, 23 ; <i32> [#uses=1] + call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) + store i32 %A, i32* @G + store i1 true, i1* @CTORGV + ret void +} + +define internal void @CTOR3() { + %X = or i1 true, false ; <i1> [#uses=1] + br label %Cont + +Cont: ; preds = %0 + br i1 %X, label %S, label %T + +S: ; preds = %Cont + store i32 24, i32* @G2 + ret void + +T: ; preds = %Cont + ret void +} + +define internal void @CTOR4() { + %X = load i32* @G3 ; <i32> [#uses=1] + %Y = add i32 %X, 123 ; <i32> [#uses=1] + store i32 %Y, i32* @G3 + ret void +} + +define internal void @CTOR5() { + %X.2p = getelementptr { i32, [2 x i32] }* @X, i32 0, i32 1, i32 0 ; <i32*> [#uses=2] + %X.2 = load i32* %X.2p ; <i32> [#uses=1] + %X.1p = getelementptr { i32, [2 x i32] }* @X, i32 0, i32 0 ; <i32*> [#uses=1] + store i32 %X.2, i32* %X.1p + store i32 42, i32* %X.2p + ret void +} + +define internal void @CTOR6() { + %A = alloca i32 ; <i32*> [#uses=2] + %y = load i32* @Y ; <i32> [#uses=1] + store i32 %y, i32* %A + %Av = load i32* %A ; <i32> [#uses=1] + %Av1 = add i32 %Av, 1 ; <i32> [#uses=1] + store i32 %Av1, i32* @Y + ret void +} + +define internal void @CTOR7() { + call void @setto( i32* @Z, i32 0 ) + ret void +} + +define void @setto(i32* %P, i32 %V) { + store i32 %V, i32* %P + ret void +} + +declare double @cos(double) + +define internal void @CTOR8() { + %X = call double @cos( double 1.000000e+00 ) ; <double> [#uses=1] + store double %X, double* @D + ret void +} + +define i1 @accessor() { + %V = load i1* @CTORGV ; <i1> [#uses=1] + ret i1 %V +} diff --git a/test/Transforms/GlobalOpt/ctor-list-opt.ll b/test/Transforms/GlobalOpt/ctor-list-opt.ll new file mode 100644 index 0000000..56aeadb --- /dev/null +++ b/test/Transforms/GlobalOpt/ctor-list-opt.ll @@ -0,0 +1,85 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep CTOR +@llvm.global_ctors = appending global [10 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @CTOR1 }, { i32, void ()* } { i32 65535, void ()* @CTOR1 }, { i32, void ()* } { i32 65535, void ()* @CTOR2 }, { i32, void ()* } { i32 65535, void ()* @CTOR3 }, { i32, void ()* } { i32 65535, void ()* @CTOR4 }, { i32, void ()* } { i32 65535, void ()* @CTOR5 }, { i32, void ()* } { i32 65535, void ()* @CTOR6 }, { i32, void ()* } { i32 65535, void ()* @CTOR7 }, { i32, void ()* } { i32 65535, void ()* @CTOR8 }, { i32, void ()* } { i32 2147483647, void ()* null } ] ; <[10 x { i32, void ()* }]*> [#uses=0] +@G = global i32 0 ; <i32*> [#uses=1] +@G2 = global i32 0 ; <i32*> [#uses=1] +@G3 = global i32 -123 ; <i32*> [#uses=2] +@X = global { i32, [2 x i32] } { i32 0, [2 x i32] [ i32 17, i32 21 ] } ; <{ i32, [2 x i32] }*> [#uses=2] +@Y = global i32 -1 ; <i32*> [#uses=2] +@Z = global i32 123 ; <i32*> [#uses=1] +@D = global double 0.000000e+00 ; <double*> [#uses=1] +@CTORGV = internal global i1 false ; <i1*> [#uses=2] + +define internal void @CTOR1() { + ret void +} + +define internal void @CTOR2() { + %A = add i32 1, 23 ; <i32> [#uses=1] + store i32 %A, i32* @G + store i1 true, i1* @CTORGV + ret void +} + +define internal void @CTOR3() { + %X = or i1 true, false ; <i1> [#uses=1] + br label %Cont + +Cont: ; preds = %0 + br i1 %X, label %S, label %T + +S: ; preds = %Cont + store i32 24, i32* @G2 + ret void + +T: ; preds = %Cont + ret void +} + +define internal void @CTOR4() { + %X = load i32* @G3 ; <i32> [#uses=1] + %Y = add i32 %X, 123 ; <i32> [#uses=1] + store i32 %Y, i32* @G3 + ret void +} + +define internal void @CTOR5() { + %X.2p = getelementptr { i32, [2 x i32] }* @X, i32 0, i32 1, i32 0 ; <i32*> [#uses=2] + %X.2 = load i32* %X.2p ; <i32> [#uses=1] + %X.1p = getelementptr { i32, [2 x i32] }* @X, i32 0, i32 0 ; <i32*> [#uses=1] + store i32 %X.2, i32* %X.1p + store i32 42, i32* %X.2p + ret void +} + +define internal void @CTOR6() { + %A = alloca i32 ; <i32*> [#uses=2] + %y = load i32* @Y ; <i32> [#uses=1] + store i32 %y, i32* %A + %Av = load i32* %A ; <i32> [#uses=1] + %Av1 = add i32 %Av, 1 ; <i32> [#uses=1] + store i32 %Av1, i32* @Y + ret void +} + +define internal void @CTOR7() { + call void @setto( i32* @Z, i32 0 ) + ret void +} + +define void @setto(i32* %P, i32 %V) { + store i32 %V, i32* %P + ret void +} + +declare double @cos(double) + +define internal void @CTOR8() { + %X = call double @cos( double 1.000000e+00 ) ; <double> [#uses=1] + store double %X, double* @D + ret void +} + +define i1 @accessor() { + %V = load i1* @CTORGV ; <i1> [#uses=1] + ret i1 %V +} diff --git a/test/Transforms/GlobalOpt/deadglobal-2.ll b/test/Transforms/GlobalOpt/deadglobal-2.ll new file mode 100644 index 0000000..def6a09 --- /dev/null +++ b/test/Transforms/GlobalOpt/deadglobal-2.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | 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 i32] zeroinitializer + +define void @foo(i32 %X) { + %Ptr = getelementptr [4 x i32]* @G, i32 0, i32 %X + store i32 1, i32* %Ptr + ret void +} diff --git a/test/Transforms/GlobalOpt/deadglobal.ll b/test/Transforms/GlobalOpt/deadglobal.ll new file mode 100644 index 0000000..7a47b8e --- /dev/null +++ b/test/Transforms/GlobalOpt/deadglobal.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep internal + +@G = internal global i32 123 ; <i32*> [#uses=1] + +define void @foo() { + store i32 1, i32* @G + ret void +} + diff --git a/test/Transforms/GlobalOpt/dg.exp b/test/Transforms/GlobalOpt/dg.exp new file mode 100644 index 0000000..f200589 --- /dev/null +++ b/test/Transforms/GlobalOpt/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,c,cpp}]] diff --git a/test/Transforms/GlobalOpt/globalsra-partial.ll b/test/Transforms/GlobalOpt/globalsra-partial.ll new file mode 100644 index 0000000..e52e7fe --- /dev/null +++ b/test/Transforms/GlobalOpt/globalsra-partial.ll @@ -0,0 +1,23 @@ +; In this case, the global can only be broken up by one level. + +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep 12345 + +@G = internal global { i32, [4 x float] } zeroinitializer ; <{ i32, [4 x float] }*> [#uses=3] + +define void @onlystore() { + store i32 12345, i32* getelementptr ({ i32, [4 x float] }* @G, i32 0, i32 0) + ret void +} + +define void @storeinit(i32 %i) { + %Ptr = getelementptr { i32, [4 x float] }* @G, i32 0, i32 1, i32 %i ; <float*> [#uses=1] + store float 1.000000e+00, float* %Ptr + ret void +} + +define float @readval(i32 %i) { + %Ptr = getelementptr { i32, [4 x float] }* @G, i32 0, i32 1, i32 %i ; <float*> [#uses=1] + %V = load float* %Ptr ; <float> [#uses=1] + ret float %V +} + diff --git a/test/Transforms/GlobalOpt/globalsra.ll b/test/Transforms/GlobalOpt/globalsra.ll new file mode 100644 index 0000000..3623555 --- /dev/null +++ b/test/Transforms/GlobalOpt/globalsra.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep global + +@G = internal global { i32, float, { double } } { + i32 1, + float 1.000000e+00, + { double } { double 1.727000e+01 } } ; <{ i32, float, { double } }*> [#uses=3] + +define void @onlystore() { + store i32 123, i32* getelementptr ({ i32, float, { double } }* @G, i32 0, i32 0) + ret void +} + +define float @storeinit() { + store float 1.000000e+00, float* getelementptr ({ i32, float, { double } }* @G, i32 0, i32 1) + %X = load float* getelementptr ({ i32, float, { double } }* @G, i32 0, i32 1) ; <float> [#uses=1] + ret float %X +} + +define double @constantize() { + %X = load double* getelementptr ({ i32, float, { double } }* @G, i32 0, i32 2, i32 0) ; <double> [#uses=1] + ret double %X +} + diff --git a/test/Transforms/GlobalOpt/heap-sra-1.ll b/test/Transforms/GlobalOpt/heap-sra-1.ll new file mode 100644 index 0000000..37e6d47 --- /dev/null +++ b/test/Transforms/GlobalOpt/heap-sra-1.ll @@ -0,0 +1,34 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@X.f0} +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@X.f1} +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-f80:128:128" +target triple = "i386-apple-darwin7" + + %struct.foo = type { i32, i32 } +@X = internal global %struct.foo* null + +define void @bar(i32 %Size) nounwind noinline { +entry: + %.sub = malloc %struct.foo, i32 %Size + store %struct.foo* %.sub, %struct.foo** @X, align 4 + ret void +} + +define i32 @baz() nounwind readonly noinline { +bb1.thread: + %0 = load %struct.foo** @X, align 4 + br label %bb1 + +bb1: ; preds = %bb1, %bb1.thread + %i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] + %sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %3, %bb1 ] + %1 = getelementptr %struct.foo* %0, i32 %i.0.reg2mem.0, i32 0 + %2 = load i32* %1, align 4 + %3 = add i32 %2, %sum.0.reg2mem.0 + %indvar.next = add i32 %i.0.reg2mem.0, 1 + %exitcond = icmp eq i32 %indvar.next, 1200 + br i1 %exitcond, label %bb2, label %bb1 + +bb2: ; preds = %bb1 + ret i32 %3 +} + diff --git a/test/Transforms/GlobalOpt/heap-sra-2.ll b/test/Transforms/GlobalOpt/heap-sra-2.ll new file mode 100644 index 0000000..98f4a50 --- /dev/null +++ b/test/Transforms/GlobalOpt/heap-sra-2.ll @@ -0,0 +1,36 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@X.f0} +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@X.f1} + +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-f80:128:128" +target triple = "i386-apple-darwin7" + %struct.foo = type { i32, i32 } +@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2] + +define void @bar(i32 %Size) nounwind noinline { +entry: + %0 = malloc [1000000 x %struct.foo] + ;%.sub = bitcast [1000000 x %struct.foo]* %0 to %struct.foo* + %.sub = getelementptr [1000000 x %struct.foo]* %0, i32 0, i32 0 ; <%struct.foo*> [#uses=1] + store %struct.foo* %.sub, %struct.foo** @X, align 4 + ret void +} + +define i32 @baz() nounwind readonly noinline { +bb1.thread: + %0 = load %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1] + br label %bb1 + +bb1: ; preds = %bb1, %bb1.thread + %i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=2] + %sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %3, %bb1 ] ; <i32> [#uses=1] + %1 = getelementptr %struct.foo* %0, i32 %i.0.reg2mem.0, i32 0 ; <i32*> [#uses=1] + %2 = load i32* %1, align 4 ; <i32> [#uses=1] + %3 = add i32 %2, %sum.0.reg2mem.0 ; <i32> [#uses=2] + %indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32> [#uses=2] + %exitcond = icmp eq i32 %indvar.next, 1200 ; <i1> [#uses=1] + br i1 %exitcond, label %bb2, label %bb1 + +bb2: ; preds = %bb1 + ret i32 %3 +} + diff --git a/test/Transforms/GlobalOpt/heap-sra-phi.ll b/test/Transforms/GlobalOpt/heap-sra-phi.ll new file mode 100644 index 0000000..5f46a77 --- /dev/null +++ b/test/Transforms/GlobalOpt/heap-sra-phi.ll @@ -0,0 +1,41 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {tmp.f1 = phi i32. } +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {tmp.f0 = phi i32. } + +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-f80:128:128" +target triple = "i386-apple-darwin7" + %struct.foo = type { i32, i32 } +@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2] + +define void @bar(i32 %Size) nounwind noinline { +entry: + %tmp = malloc [1000000 x %struct.foo] ; <[1000000 x %struct.foo]*> [#uses=1] + %.sub = getelementptr [1000000 x %struct.foo]* %tmp, i32 0, i32 0 ; <%struct.foo*> [#uses=1] + store %struct.foo* %.sub, %struct.foo** @X, align 4 + ret void +} + +define i32 @baz() nounwind readonly noinline { +bb1.thread: + %tmpLD1 = load %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1] + br label %bb1 + +bb1: ; preds = %bb1, %bb1.thread + %tmp = phi %struct.foo* [%tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ] ; <i32> [#uses=2] + %i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=2] + %sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %tmp3, %bb1 ] ; <i32> [#uses=1] + %tmp1 = getelementptr %struct.foo* %tmp, i32 %i.0.reg2mem.0, i32 0 ; <i32*> [#uses=1] + %tmp2 = load i32* %tmp1, align 4 ; <i32> [#uses=1] + %tmp6 = add i32 %tmp2, %sum.0.reg2mem.0 ; <i32> [#uses=2] + %tmp4 = getelementptr %struct.foo* %tmp, i32 %i.0.reg2mem.0, i32 1 ; <i32*> [#uses=1] + %tmp5 = load i32 * %tmp4 + %tmp3 = add i32 %tmp5, %tmp6 + %indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32> [#uses=2] + + %tmpLD2 = load %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1] + + %exitcond = icmp eq i32 %indvar.next, 1200 ; <i1> [#uses=1] + br i1 %exitcond, label %bb2, label %bb1 + +bb2: ; preds = %bb1 + ret i32 %tmp3 +} diff --git a/test/Transforms/GlobalOpt/integer-bool.ll b/test/Transforms/GlobalOpt/integer-bool.ll new file mode 100644 index 0000000..9fbbe35 --- /dev/null +++ b/test/Transforms/GlobalOpt/integer-bool.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | 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 i32 0 ; <i32*> [#uses=3] + +define void @set1() { + store i32 0, i32* @G + ret void +} + +define void @set2() { + store i32 1, i32* @G + ret void +} + +define i1 @get() { + %A = load i32* @G ; <i32> [#uses=1] + %C = icmp slt i32 %A, 2 ; <i1> [#uses=1] + ret i1 %C +} + diff --git a/test/Transforms/GlobalOpt/iterate.ll b/test/Transforms/GlobalOpt/iterate.ll new file mode 100644 index 0000000..d764c5d --- /dev/null +++ b/test/Transforms/GlobalOpt/iterate.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep %G + +@G = internal global i32 0 ; <i32*> [#uses=1] +@H = internal global { i32* } { i32* @G } ; <{ i32* }*> [#uses=1] + +define i32 @loadg() { + %G = load i32** getelementptr ({ i32* }* @H, i32 0, i32 0) ; <i32*> [#uses=1] + %GV = load i32* %G ; <i32> [#uses=1] + ret i32 %GV +} + diff --git a/test/Transforms/GlobalOpt/load-store-global.ll b/test/Transforms/GlobalOpt/load-store-global.ll new file mode 100644 index 0000000..d89d226 --- /dev/null +++ b/test/Transforms/GlobalOpt/load-store-global.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep G + +@G = internal global i32 17 ; <i32*> [#uses=3] + +define void @foo() { + %V = load i32* @G ; <i32> [#uses=1] + store i32 %V, i32* @G + ret void +} + +define i32 @bar() { + %X = load i32* @G ; <i32> [#uses=1] + ret i32 %X +} + diff --git a/test/Transforms/GlobalOpt/malloc-promote-1.ll b/test/Transforms/GlobalOpt/malloc-promote-1.ll new file mode 100644 index 0000000..fea4dbd --- /dev/null +++ b/test/Transforms/GlobalOpt/malloc-promote-1.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep global + +@G = internal global i32* null ; <i32**> [#uses=3] + +define void @init() { + %P = malloc i32 ; <i32*> [#uses=1] + store i32* %P, i32** @G + %GV = load i32** @G ; <i32*> [#uses=1] + store i32 0, i32* %GV + ret void +} + +define i32 @get() { + %GV = load i32** @G ; <i32*> [#uses=1] + %V = load i32* %GV ; <i32> [#uses=1] + ret i32 %V +} + diff --git a/test/Transforms/GlobalOpt/malloc-promote-2.ll b/test/Transforms/GlobalOpt/malloc-promote-2.ll new file mode 100644 index 0000000..1b33632 --- /dev/null +++ b/test/Transforms/GlobalOpt/malloc-promote-2.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep malloc + +@G = internal global i32* null ; <i32**> [#uses=3] + +define void @init() { + %P = malloc i32, i32 100 ; <i32*> [#uses=1] + store i32* %P, i32** @G + %GV = load i32** @G ; <i32*> [#uses=1] + %GVe = getelementptr i32* %GV, i32 40 ; <i32*> [#uses=1] + store i32 20, i32* %GVe + ret void +} + +define i32 @get() { + %GV = load i32** @G ; <i32*> [#uses=1] + %GVe = getelementptr i32* %GV, i32 40 ; <i32*> [#uses=1] + %V = load i32* %GVe ; <i32> [#uses=1] + ret i32 %V +} + diff --git a/test/Transforms/GlobalOpt/malloc-promote-3.ll b/test/Transforms/GlobalOpt/malloc-promote-3.ll new file mode 100644 index 0000000..26ce8fd --- /dev/null +++ b/test/Transforms/GlobalOpt/malloc-promote-3.ll @@ -0,0 +1,26 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep malloc + +@G = internal global i32* null ; <i32**> [#uses=4] + +define void @init() { + %P = malloc i32, i32 100 ; <i32*> [#uses=1] + store i32* %P, i32** @G + %GV = load i32** @G ; <i32*> [#uses=1] + %GVe = getelementptr i32* %GV, i32 40 ; <i32*> [#uses=1] + store i32 20, i32* %GVe + ret void +} + +define i32 @get() { + %GV = load i32** @G ; <i32*> [#uses=1] + %GVe = getelementptr i32* %GV, i32 40 ; <i32*> [#uses=1] + %V = load i32* %GVe ; <i32> [#uses=1] + ret i32 %V +} + +define i1 @check() { + %GV = load i32** @G ; <i32*> [#uses=1] + %V = icmp eq i32* %GV, null ; <i1> [#uses=1] + ret i1 %V +} + diff --git a/test/Transforms/GlobalOpt/memcpy.ll b/test/Transforms/GlobalOpt/memcpy.ll new file mode 100644 index 0000000..b51aedb --- /dev/null +++ b/test/Transforms/GlobalOpt/memcpy.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | \ +; RUN: grep {G1 = internal constant} + +@G1 = internal global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <[58 x i8]*> [#uses=1] + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +define void @foo() { + %Blah = alloca [58 x i8] ; <[58 x i8]*> [#uses=1] + %tmp.0 = getelementptr [58 x i8]* %Blah, i32 0, i32 0 ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %tmp.0, i8* getelementptr ([58 x i8]* @G1, i32 0, i32 0), i32 58, i32 1 ) + ret void +} + + diff --git a/test/Transforms/GlobalOpt/memset.ll b/test/Transforms/GlobalOpt/memset.ll new file mode 100644 index 0000000..0ee851f --- /dev/null +++ b/test/Transforms/GlobalOpt/memset.ll @@ -0,0 +1,21 @@ +; both globals are write only, delete them. + +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | \ +; RUN: not grep internal + +@G0 = internal global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <[58 x i8]*> [#uses=1] +@G1 = internal global [4 x i32] [ i32 1, i32 2, i32 3, i32 4 ] ; <[4 x i32]*> [#uses=1] + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +declare void @llvm.memset.i32(i8*, i8, i32, i32) + +define void @foo() { + %Blah = alloca [58 x i8] ; <[58 x i8]*> [#uses=1] + %tmp3 = bitcast [58 x i8]* %Blah to i8* ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* bitcast ([4 x i32]* @G1 to i8*), i8* %tmp3, i32 16, i32 1 ) + call void @llvm.memset.i32( i8* getelementptr ([58 x i8]* @G0, i32 0, i32 0), i8 17, i32 58, i32 1 ) + ret void +} + + diff --git a/test/Transforms/GlobalOpt/phi-select.ll b/test/Transforms/GlobalOpt/phi-select.ll new file mode 100644 index 0000000..da1314f7 --- /dev/null +++ b/test/Transforms/GlobalOpt/phi-select.ll @@ -0,0 +1,31 @@ +; Test that PHI nodes and select instructions do not necessarily make stuff +; non-constant. + +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep global + +@X = internal global i32 4 ; <i32*> [#uses=2] +@Y = internal global i32 5 ; <i32*> [#uses=2] + +define i32 @test1(i1 %C) { + %P = select i1 %C, i32* @X, i32* @Y ; <i32*> [#uses=1] + %V = load i32* %P ; <i32> [#uses=1] + ret i32 %V +} + +define i32 @test2(i1 %C) { +; <label>:0 + br i1 %C, label %T, label %Cont + +T: ; preds = %0 + br label %Cont + +Cont: ; preds = %T, %0 + %P = phi i32* [ @X, %0 ], [ @Y, %T ] ; <i32*> [#uses=1] + %V = load i32* %P ; <i32> [#uses=1] + ret i32 %V +} + + + + + diff --git a/test/Transforms/GlobalOpt/storepointer-compare.ll b/test/Transforms/GlobalOpt/storepointer-compare.ll new file mode 100644 index 0000000..86eff51 --- /dev/null +++ b/test/Transforms/GlobalOpt/storepointer-compare.ll @@ -0,0 +1,30 @@ +; RUN: llvm-as < %s | 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 ; <void ()**> [#uses=2] + +define internal void @Actual() { + ret void +} + +define void @init() { + store void ()* @Actual, void ()** @G + ret void +} + +define void @doit() { + %FP = load void ()** @G ; <void ()*> [#uses=2] + %CC = icmp eq void ()* %FP, null ; <i1> [#uses=1] + br i1 %CC, label %isNull, label %DoCall + +DoCall: ; preds = %0 + call void %FP( ) + ret void + +isNull: ; preds = %0 + ret void +} + diff --git a/test/Transforms/GlobalOpt/storepointer.ll b/test/Transforms/GlobalOpt/storepointer.ll new file mode 100644 index 0000000..d57a6ac --- /dev/null +++ b/test/Transforms/GlobalOpt/storepointer.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep global + +@G = internal global void ()* null ; <void ()**> [#uses=2] + +define internal void @Actual() { + ret void +} + +define void @init() { + store void ()* @Actual, void ()** @G + ret void +} + +define void @doit() { + %FP = load void ()** @G ; <void ()*> [#uses=1] + call void %FP( ) + ret void +} + diff --git a/test/Transforms/GlobalOpt/trivialstore.ll b/test/Transforms/GlobalOpt/trivialstore.ll new file mode 100644 index 0000000..a662565 --- /dev/null +++ b/test/Transforms/GlobalOpt/trivialstore.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep G + +@G = internal global i32 17 ; <i32*> [#uses=3] + +define void @foo() { + store i32 17, i32* @G + ret void +} + +define i32 @bar() { + %X = load i32* @G ; <i32> [#uses=1] + ret i32 %X +} + +define internal void @dead() { + store i32 123, i32* @G + ret void +} + diff --git a/test/Transforms/GlobalOpt/undef-init.ll b/test/Transforms/GlobalOpt/undef-init.ll new file mode 100644 index 0000000..bb483fc --- /dev/null +++ b/test/Transforms/GlobalOpt/undef-init.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | not grep store + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__Z3foov } ] ; <[1 x { i32, void ()* }]*> [#uses=0] +@X.0 = internal global i32 undef ; <i32*> [#uses=2] + +define i32 @_Z3foov() { +entry: + %tmp.1 = load i32* @X.0 ; <i32> [#uses=1] + ret i32 %tmp.1 +} + +define internal void @_GLOBAL__I__Z3foov() { +entry: + store i32 1, i32* @X.0 + ret void +} + |