diff options
author | Dan Gohman <djg@cray.com> | 2007-07-18 16:29:46 +0000 |
---|---|---|
committer | Dan Gohman <djg@cray.com> | 2007-07-18 16:29:46 +0000 |
commit | f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cc (patch) | |
tree | ebb79ea1ee5e3bc1fdf38541a811a8b804f0679a /test/Transforms/GlobalOpt | |
download | external_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')
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 +} |