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.
[AsmPrinter][TLOF] Reintroduce AArch64 test
Follow up from r231505. Fix the non-determinism by using a MapVector and reintroduce the AArch64 testcase. Defer deleting the got candidates up to the end and remove them in a bulk, avoiding linear time removal of each element. Thanks to Renato Golin for trying it out on other platforms. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231830 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
7761008
commit 84e6358
Showing
3 changed files
with
106 additions
and
12 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,92 @@ | ||
; RUN: llc -mtriple=arm64-apple-darwin %s -o - | FileCheck %s | ||
|
||
; GOT equivalent globals references can be replaced by the GOT entry of the | ||
; final symbol instead. | ||
|
||
%struct.data = type { i32, %struct.anon } | ||
%struct.anon = type { i32, i32 } | ||
|
||
@localfoo = global i32 42 | ||
@localgotequiv = private unnamed_addr constant i32* @localfoo | ||
|
||
@extfoo = external global i32 | ||
@extgotequiv = private unnamed_addr constant i32* @extfoo | ||
|
||
; Don't replace GOT equivalent usage within instructions and emit the GOT | ||
; equivalent since it can't be replaced by the GOT entry. @bargotequiv is | ||
; used by an instruction inside @t0. | ||
; | ||
; CHECK: l_bargotequiv: | ||
; CHECK-NEXT: .quad _extbar | ||
@extbar = external global i32 | ||
@bargotequiv = private unnamed_addr constant i32* @extbar | ||
|
||
@table = global [4 x %struct.data] [ | ||
; CHECK-LABEL: _table | ||
%struct.data { i32 1, %struct.anon { i32 2, i32 3 } }, | ||
; Test GOT equivalent usage inside nested constant arrays. | ||
|
||
; CHECK: .long 5 | ||
; CHECK-NOT: .long _localgotequiv-(_table+20) | ||
; CHECK-NEXT: Ltmp1: | ||
; CHECK-NEXT: .long _localfoo@GOT-Ltmp1 | ||
%struct.data { i32 4, %struct.anon { i32 5, | ||
i32 trunc (i64 sub (i64 ptrtoint (i32** @localgotequiv to i64), | ||
i64 ptrtoint (i32* getelementptr inbounds ([4 x %struct.data]* @table, i32 0, i64 1, i32 1, i32 1) to i64)) | ||
to i32)} | ||
}, | ||
|
||
; CHECK: .long 5 | ||
; CHECK-NOT: _extgotequiv-(_table+32) | ||
; CHECK-NEXT: Ltmp2: | ||
; CHECK-NEXT: _extfoo@GOT-Ltmp2 | ||
%struct.data { i32 4, %struct.anon { i32 5, | ||
i32 trunc (i64 sub (i64 ptrtoint (i32** @extgotequiv to i64), | ||
i64 ptrtoint (i32* getelementptr inbounds ([4 x %struct.data]* @table, i32 0, i64 2, i32 1, i32 1) to i64)) | ||
to i32)} | ||
}, | ||
; Test support for arbitrary constants into the GOTPCREL offset, which is | ||
; supported on x86-64 but not on ARM64 | ||
|
||
; CHECK: .long 5 | ||
; CHECK-NEXT: .long (l_extgotequiv-(_table+44))+24 | ||
%struct.data { i32 4, %struct.anon { i32 5, | ||
i32 add (i32 trunc (i64 sub (i64 ptrtoint (i32** @extgotequiv to i64), | ||
i64 ptrtoint (i32* getelementptr inbounds ([4 x %struct.data]* @table, i32 0, i64 3, i32 1, i32 1) to i64)) | ||
to i32), i32 24)} | ||
} | ||
], align 16 | ||
|
||
; Test multiple uses of GOT equivalents. | ||
|
||
; CHECK-LABEL: _delta | ||
; CHECK: Ltmp3: | ||
; CHECK-NEXT: .long _extfoo@GOT-Ltmp3 | ||
@delta = global i32 trunc (i64 sub (i64 ptrtoint (i32** @extgotequiv to i64), | ||
i64 ptrtoint (i32* @delta to i64)) | ||
to i32) | ||
|
||
; CHECK-LABEL: _deltaplus: | ||
; CHECK: .long (l_localgotequiv-_deltaplus)+55 | ||
@deltaplus = global i32 add (i32 trunc (i64 sub (i64 ptrtoint (i32** @localgotequiv to i64), | ||
i64 ptrtoint (i32* @deltaplus to i64)) | ||
to i32), i32 55) | ||
|
||
define i32 @t0(i32 %a) { | ||
%x = add i32 trunc (i64 sub (i64 ptrtoint (i32** @bargotequiv to i64), | ||
i64 ptrtoint (i32 (i32)* @t0 to i64)) | ||
to i32), %a | ||
ret i32 %x | ||
} | ||
|
||
; Check that these got equivalent symbols are emitted on ARM64. Since ARM64 | ||
; does not support encoding an extra offset with @GOT, we still need to emit the | ||
; equivalents for use by such IR constructs. Check them at the end of the test | ||
; since they will start out as GOT equivalent candidates, but they are actually | ||
; needed and are therefore emitted at the end. | ||
|
||
; CHECK-LABEL: l_localgotequiv: | ||
; CHECK-NEXT: .quad _localfoo | ||
|
||
; CHECK-LABEL: l_extgotequiv: | ||
; CHECK-NEXT: .quad _extfoo |