diff options
| author | Sergei Larin <slarin@codeaurora.org> | 2016-01-22 21:18:20 +0000 |
|---|---|---|
| committer | Sergei Larin <slarin@codeaurora.org> | 2016-01-22 21:18:20 +0000 |
| commit | 94be2dee7ec126ed833599c7c7b88f045b02dcd1 (patch) | |
| tree | 1ce11622610fcb978c5d41b6f7fe63f1cb6e51a3 /llvm/test/Transforms/GlobalOpt | |
| parent | aa5d08d04bcb05a6fb34e22aa47d73d0f2641b8f (diff) | |
| download | bcm5719-llvm-94be2dee7ec126ed833599c7c7b88f045b02dcd1.tar.gz bcm5719-llvm-94be2dee7ec126ed833599c7c7b88f045b02dcd1.zip | |
Make sure that any new and optimized objects created during GlobalOPT copy all the attributes from the base object.
Summary:
Make sure that any new and optimized objects created during GlobalOPT copy all the attributes from the base object.
A good example of improper behavior in the current implementation is section information associated with the GlobalObject. If a section was set for it, and GlobalOpt is creating/modifying a new object based on this one (often copying the original name), without this change new object will be placed in a default section, resulting in inappropriate properties of the new variable.
The argument here is that if customer specified a section for a variable, any changes to it that compiler does should not cause it to change that section allocation.
Moreover, any other properties worth representation in copyAttributesFrom() should also be propagated.
Reviewers: jmolloy, joker-eph, joker.eph
Subscribers: slarin, joker.eph, rafael, tobiasvk, llvm-commits
Differential Revision: http://reviews.llvm.org/D16074
llvm-svn: 258556
Diffstat (limited to 'llvm/test/Transforms/GlobalOpt')
| -rw-r--r-- | llvm/test/Transforms/GlobalOpt/GSROA-section.ll | 30 | ||||
| -rw-r--r-- | llvm/test/Transforms/GlobalOpt/MallocSROA-section.ll | 28 | ||||
| -rw-r--r-- | llvm/test/Transforms/GlobalOpt/SROA-section.ll | 27 |
3 files changed, 85 insertions, 0 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/GSROA-section.ll b/llvm/test/Transforms/GlobalOpt/GSROA-section.ll new file mode 100644 index 00000000000..a439fa0797d --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/GSROA-section.ll @@ -0,0 +1,30 @@ +; This test lets globalopt split the global struct and array into different +; values. The pass needs to preserve section attribute. + +; RUN: opt < %s -globalopt -S | FileCheck %s +; Check that the new global values still have their section assignment. +; CHECK: @struct +; CHECK: section ".foo" +; CHECK: @array +; CHECK-NOT: section ".foo" + +@struct = internal global { i32, i32 } zeroinitializer, section ".foo" +@array = internal global [ 2 x i32 ] zeroinitializer + +define i32 @foo() { + %A = load i32, i32* getelementptr ({ i32, i32 }, { i32, i32 }* @struct, i32 0, i32 0) + %B = load i32, i32* getelementptr ([ 2 x i32 ], [ 2 x i32 ]* @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* getelementptr ([ 2 x i32 ], [ 2 x i32 ]* @array, i32 0, i32 0) + store i32 %R, i32* getelementptr ({ i32, i32 }, { i32, i32 }* @struct, i32 0, i32 0) + ret void +} + + diff --git a/llvm/test/Transforms/GlobalOpt/MallocSROA-section.ll b/llvm/test/Transforms/GlobalOpt/MallocSROA-section.ll new file mode 100644 index 00000000000..75b3cfec137 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/MallocSROA-section.ll @@ -0,0 +1,28 @@ +; RUN: opt -globalopt -S < %s | FileCheck %s +; CHECK: @Y.f0 +; CHECK: section ".foo" +; CHECK: @Y.f1 +; CHECK: section ".foo" + +%struct.xyz = type { double, i32 } + +@Y = internal global %struct.xyz* null ,section ".foo" ; <%struct.xyz**> [#uses=2] +@numf2s = external global i32 ; <i32*> [#uses=1] + +define void @init_net() { +entry: + %0 = load i32, i32* @numf2s, align 4 ; <i32> [#uses=1] + %mallocsize2 = shl i32 %0, 4 ; <i32> [#uses=1] + %malloccall3 = tail call i8* @malloc(i32 %mallocsize2) ; <i8*> [#uses=1] + %1 = bitcast i8* %malloccall3 to %struct.xyz* ; <%struct.xyz*> [#uses=1] + store %struct.xyz* %1, %struct.xyz** @Y, align 8 + ret void +} + +define void @load_train() { +entry: + %0 = load %struct.xyz*, %struct.xyz** @Y, align 8 ; <%struct.xyz*> [#uses=0] + ret void +} + +declare noalias i8* @malloc(i32) diff --git a/llvm/test/Transforms/GlobalOpt/SROA-section.ll b/llvm/test/Transforms/GlobalOpt/SROA-section.ll new file mode 100644 index 00000000000..1589608a67a --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/SROA-section.ll @@ -0,0 +1,27 @@ +; Verify that section assignment is copied during SROA +; RUN: opt < %s -globalopt -S | FileCheck %s +; CHECK: @G.0 +; CHECK: section ".foo" +; CHECK: @G.1 +; CHECK: section ".foo" +; CHECK: @G.2 +; CHECK: section ".foo" + +%T = type { double, double, double } +@G = internal global %T zeroinitializer, align 16, section ".foo" + +define void @test() { + store double 1.0, double* getelementptr (%T, %T* @G, i32 0, i32 0), align 16 + store double 2.0, double* getelementptr (%T, %T* @G, i32 0, i32 1), align 8 + store double 3.0, double* getelementptr (%T, %T* @G, i32 0, i32 2), align 16 + ret void +} + +define double @test2() { + %V1 = load double, double* getelementptr (%T, %T* @G, i32 0, i32 0), align 16 + %V2 = load double, double* getelementptr (%T, %T* @G, i32 0, i32 1), align 8 + %V3 = load double, double* getelementptr (%T, %T* @G, i32 0, i32 2), align 16 + %R = fadd double %V1, %V2 + %R2 = fadd double %R, %V3 + ret double %R2 +} |

