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