forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This commit is to improve global merge pass and support global symbol merge. The global symbol merge is not enabled by default. For aarch64, we need some more back-end fix to make it really benifit ADRP CSE. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210640 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Jiangning Liu
committed
Jun 11, 2014
1 parent
4c3b0b7
commit f847ccb
Showing
9 changed files
with
284 additions
and
75 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O0 | FileCheck --check-prefix=NO-MERGE %s | ||
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -O0 -global-merge-on-external=true | FileCheck --check-prefix=NO-MERGE %s | ||
|
||
; RUN: llc < %s -mtriple=aarch64-apple-ios -O0 | FileCheck %s --check-prefix=CHECK-APPLE-IOS-NO-MERGE | ||
; RUN: llc < %s -mtriple=aarch64-apple-ios -O0 -global-merge-on-external=true | FileCheck %s --check-prefix=CHECK-APPLE-IOS-NO-MERGE | ||
|
||
; FIXME: add O1/O2 test for aarch64-none-linux-gnu and aarch64-apple-ios | ||
|
||
@m = internal global i32 0, align 4 | ||
@n = internal global i32 0, align 4 | ||
|
||
define void @f1(i32 %a1, i32 %a2) { | ||
; CHECK-LABEL: f1: | ||
; CHECK: adrp x{{[0-9]+}}, _MergedGlobals | ||
; CHECK-NOT: adrp | ||
|
||
; CHECK-APPLE-IOS-LABEL: f1: | ||
; CHECK-APPLE-IOS: adrp x{{[0-9]+}}, __MergedGlobals | ||
; CHECK-APPLE-IOS-NOT: adrp | ||
store i32 %a1, i32* @m, align 4 | ||
store i32 %a2, i32* @n, align 4 | ||
ret void | ||
} | ||
|
||
; CHECK: .local _MergedGlobals | ||
; CHECK: .comm _MergedGlobals,8,8 | ||
; NO-MERGE-NOT: .local _MergedGlobals | ||
|
||
; CHECK-APPLE-IOS: .zerofill __DATA,__bss,__MergedGlobals,8,3 | ||
; CHECK-APPLE-IOS-NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,8,3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
; RUN: llc %s -O0 -o - | FileCheck -check-prefix=NO-MERGE %s | ||
; RUN: llc %s -O0 -o - -enable-global-merge=false | FileCheck -check-prefix=NO-MERGE %s | ||
; RUN: llc %s -O0 -o - -enable-global-merge=true | FileCheck -check-prefix=NO-MERGE %s | ||
; RUN: llc %s -O1 -o - | FileCheck -check-prefix=MERGE %s | ||
; RUN: llc %s -O1 -o - -enable-global-merge=false | FileCheck -check-prefix=NO-MERGE %s | ||
; RUN: llc %s -O1 -o - -enable-global-merge=true | FileCheck -check-prefix=MERGE %s | ||
|
||
; MERGE-NOT: .zerofill __DATA,__bss,_bar,20,2 | ||
; MERGE-NOT: .zerofill __DATA,__bss,_baz,20,2 | ||
; MERGE-NOT: .zerofill __DATA,__bss,_foo,20,2 | ||
; MERGE: .zerofill __DATA,__bss,__MergedGlobals,60,4 | ||
; MERGE-NOT: .zerofill __DATA,__bss,_bar,20,2 | ||
; MERGE-NOT: .zerofill __DATA,__bss,_baz,20,2 | ||
; MERGE-NOT: .zerofill __DATA,__bss,_foo,20,2 | ||
|
||
; NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,60,4 | ||
; NO-MERGE: .zerofill __DATA,__bss,_bar,20,2 | ||
; NO-MERGE: .zerofill __DATA,__bss,_baz,20,2 | ||
; NO-MERGE: .zerofill __DATA,__bss,_foo,20,2 | ||
; NO-MERGE-NOT: .zerofill __DATA,__bss,__MergedGlobals,60,4 | ||
|
||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" | ||
target triple = "thumbv7-apple-ios3.0.0" | ||
|
||
@bar = internal global [5 x i32] zeroinitializer, align 4 | ||
@baz = internal global [5 x i32] zeroinitializer, align 4 | ||
@foo = internal global [5 x i32] zeroinitializer, align 4 | ||
|
||
; Function Attrs: nounwind ssp | ||
define internal void @initialize() #0 { | ||
%1 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %1, i32* getelementptr inbounds ([5 x i32]* @bar, i32 0, i32 0), align 4, !tbaa !1 | ||
%2 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %2, i32* getelementptr inbounds ([5 x i32]* @baz, i32 0, i32 0), align 4, !tbaa !1 | ||
%3 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %3, i32* getelementptr inbounds ([5 x i32]* @bar, i32 0, i32 1), align 4, !tbaa !1 | ||
%4 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %4, i32* getelementptr inbounds ([5 x i32]* @baz, i32 0, i32 1), align 4, !tbaa !1 | ||
%5 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %5, i32* getelementptr inbounds ([5 x i32]* @bar, i32 0, i32 2), align 4, !tbaa !1 | ||
%6 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %6, i32* getelementptr inbounds ([5 x i32]* @baz, i32 0, i32 2), align 4, !tbaa !1 | ||
%7 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %7, i32* getelementptr inbounds ([5 x i32]* @bar, i32 0, i32 3), align 4, !tbaa !1 | ||
%8 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %8, i32* getelementptr inbounds ([5 x i32]* @baz, i32 0, i32 3), align 4, !tbaa !1 | ||
%9 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %9, i32* getelementptr inbounds ([5 x i32]* @bar, i32 0, i32 4), align 4, !tbaa !1 | ||
%10 = tail call i32 bitcast (i32 (...)* @calc to i32 ()*)() #3 | ||
store i32 %10, i32* getelementptr inbounds ([5 x i32]* @baz, i32 0, i32 4), align 4, !tbaa !1 | ||
ret void | ||
} | ||
|
||
declare i32 @calc(...) #1 | ||
|
||
; Function Attrs: nounwind ssp | ||
define internal void @calculate() #0 { | ||
%1 = load <4 x i32>* bitcast ([5 x i32]* @bar to <4 x i32>*), align 4 | ||
%2 = load <4 x i32>* bitcast ([5 x i32]* @baz to <4 x i32>*), align 4 | ||
%3 = mul <4 x i32> %2, %1 | ||
store <4 x i32> %3, <4 x i32>* bitcast ([5 x i32]* @foo to <4 x i32>*), align 4 | ||
%4 = load i32* getelementptr inbounds ([5 x i32]* @bar, i32 0, i32 4), align 4, !tbaa !1 | ||
%5 = load i32* getelementptr inbounds ([5 x i32]* @baz, i32 0, i32 4), align 4, !tbaa !1 | ||
%6 = mul nsw i32 %5, %4 | ||
store i32 %6, i32* getelementptr inbounds ([5 x i32]* @foo, i32 0, i32 4), align 4, !tbaa !1 | ||
ret void | ||
} | ||
|
||
; Function Attrs: nounwind readnone ssp | ||
define internal i32* @returnFoo() #2 { | ||
ret i32* getelementptr inbounds ([5 x i32]* @foo, i32 0, i32 0) | ||
} | ||
|
||
attributes #0 = { nounwind ssp "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } | ||
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } | ||
attributes #2 = { nounwind readnone ssp "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } | ||
attributes #3 = { nounwind } | ||
|
||
!llvm.ident = !{!0} | ||
|
||
!0 = metadata !{metadata !"LLVM version 3.4 "} | ||
!1 = metadata !{metadata !2, metadata !2, i64 0} | ||
!2 = metadata !{metadata !"int", metadata !3, i64 0} | ||
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0} | ||
!4 = metadata !{metadata !"Simple C/C++ TBAA"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
; RUN: opt %s -mtriple=aarch64-none-linux-gnu -global-merge -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-none-linux-gnu -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
|
||
; RUN: opt %s -mtriple=aarch64-linux-gnuabi -global-merge -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-linux-gnuabi -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
|
||
; RUN: opt %s -mtriple=aarch64-apple-ios -global-merge -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-apple-ios -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
|
||
@m = internal global i32 0, align 4 | ||
@n = internal global i32 0, align 4 | ||
|
||
; CHECK: @_MergedGlobals = internal global { i32, i32 } zeroinitializer | ||
|
||
define void @f1(i32 %a1, i32 %a2) { | ||
; CHECK-LABEL: @f1 | ||
; CHECK: getelementptr inbounds ({ i32, i32 }* @_MergedGlobals, i32 0, i32 0) | ||
; CHECK: getelementptr inbounds ({ i32, i32 }* @_MergedGlobals, i32 0, i32 1) | ||
store i32 %a1, i32* @m, align 4 | ||
store i32 %a2, i32* @n, align 4 | ||
ret void | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
; RUN: opt %s -mtriple=aarch64-none-linux-gnu -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-linux-gnuabi -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-apple-ios -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
|
||
@x = global i32 0, align 4 | ||
@y = global i32 0, align 4 | ||
@z = global i32 0, align 4 | ||
|
||
; CHECK: @_MergedGlobals_x = global { i32, i32, i32 } zeroinitializer | ||
; CHECK: @x = alias getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 0) | ||
; CHECK: @y = alias getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 1) | ||
; CHECK: @z = alias getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 2) | ||
|
||
define void @f1(i32 %a1, i32 %a2) { | ||
; CHECK-LABEL: @f1 | ||
; CHECK: getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 0) | ||
; CHECK: getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 1) | ||
store i32 %a1, i32* @x, align 4 | ||
store i32 %a2, i32* @y, align 4 | ||
ret void | ||
} | ||
|
||
define void @g1(i32 %a1, i32 %a2) { | ||
; CHECK-LABEL: @g1 | ||
; CHECK: getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 1) | ||
; CHECK: getelementptr inbounds ({ i32, i32, i32 }* @_MergedGlobals_x, i32 0, i32 2) | ||
store i32 %a1, i32* @y, align 4 | ||
store i32 %a2, i32* @z, align 4 | ||
ret void | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
; RUN: opt %s -mtriple=aarch64-none-linux-gnu -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-linux-gnuabi -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
; RUN: opt %s -mtriple=aarch64-apple-ios -global-merge -global-merge-on-external -S -o - | FileCheck %s | ||
|
||
@x = global [1000 x i32] zeroinitializer, align 1 | ||
@y = global [1000 x i32] zeroinitializer, align 1 | ||
@z = internal global i32 1, align 4 | ||
|
||
; CHECK: @_MergedGlobals_x = global { i32, [1000 x i32] } { i32 1, [1000 x i32] zeroinitializer } | ||
; CHECK: @_MergedGlobals_y = global { [1000 x i32] } zeroinitializer | ||
|
||
; CHECK: @x = alias getelementptr inbounds ({ i32, [1000 x i32] }* @_MergedGlobals_x, i32 0, i32 1) | ||
; CHECK: @y = alias getelementptr inbounds ({ [1000 x i32] }* @_MergedGlobals_y, i32 0, i32 0) | ||
|
||
define void @f1(i32 %a1, i32 %a2, i32 %a3) { | ||
; CHECK-LABEL: @f1 | ||
; CHECK: %x3 = getelementptr inbounds [1000 x i32]* getelementptr inbounds ({ i32, [1000 x i32] }* @_MergedGlobals_x, i32 0, i32 1), i32 0, i64 3 | ||
; CHECK: %y3 = getelementptr inbounds [1000 x i32]* getelementptr inbounds ({ [1000 x i32] }* @_MergedGlobals_y, i32 0, i32 0), i32 0, i64 3 | ||
; CHECK: store i32 %a3, i32* getelementptr inbounds ({ i32, [1000 x i32] }* @_MergedGlobals_x, i32 0, i32 0), align 4 | ||
|
||
%x3 = getelementptr inbounds [1000 x i32]* @x, i32 0, i64 3 | ||
%y3 = getelementptr inbounds [1000 x i32]* @y, i32 0, i64 3 | ||
store i32 %a1, i32* %x3, align 4 | ||
store i32 %a2, i32* %y3, align 4 | ||
store i32 %a3, i32* @z, align 4 | ||
ret void | ||
} |
Oops, something went wrong.