OSDN Git Service

AArch64CollectLOH: Rewrite as block-local analysis.
[android-x86/external-llvm.git] / test / CodeGen / AArch64 / loh.mir
1 # RUN: llc -o /dev/null %s -mtriple=aarch64-apple-ios -run-pass=aarch64-collect-loh -debug-only=aarch64-collect-loh 2>&1 | FileCheck %s
2 --- |
3   define void @func0() { ret void }
4
5   declare void @extfunc()
6
7   @g0 = external global i32
8   @g1 = external global i32
9   @g2 = external global i32
10   @g3 = external global i32
11   @g4 = external global i32
12   @g5 = external global i32
13 ...
14 ---
15 # Check various LOH variants. Remember that the algorithms walks the basic
16 # blocks backwards.
17 # CHECK-LABEL: ********** AArch64 Collect LOH **********
18 # CHECK-LABEL: Looking in function func0
19 name: func0
20 body: |
21   bb.0:
22     ; CHECK: Adding MCLOH_AdrpAdrp:
23     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g3>
24     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g4>
25     ; CHECK-NEXT: Adding MCLOH_AdrpAdrp:
26     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g2>
27     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g3>
28     ; CHECK-NEXT: Adding MCLOH_AdrpAdrp:
29     ; CHECK-NEXT: %X0<def> = ADRP <ga:@g0>
30     ; CHECK-NEXT: %X0<def> = ADRP <ga:@g1>
31     %x0 = ADRP target-flags(aarch64-page) @g0
32     %x0 = ADRP target-flags(aarch64-page) @g1
33     %x1 = ADRP target-flags(aarch64-page) @g2
34     %x1 = ADRP target-flags(aarch64-page) @g3
35     %x1 = ADRP target-flags(aarch64-page) @g4    
36
37   bb.1:
38     ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
39     ; CHECK-NEXT: %X20<def> = ADRP <ga:@g0>
40     ; CHECK-NEXT: %X3<def> = ADDXri %X20, <ga:@g0>
41     ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
42     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g0>
43     ; CHECK-NEXT: %X1<def> = ADDXri %X1, <ga:@g0>
44     %x1 = ADRP target-flags(aarch64-page) @g0
45     %x9 = SUBXri %x11, 5, 0 ; should not affect MCLOH formation
46     %x1 = ADDXri %x1, target-flags(aarch64-pageoff) @g0, 0
47     %x20 = ADRP target-flags(aarch64-page) @g0
48     BL @extfunc, csr_aarch64_aapcs ; should not clobber X20
49     %x3 = ADDXri %x20, target-flags(aarch64-pageoff) @g0, 0
50
51   bb.2:
52     ; CHECK-NOT: MCLOH_AdrpAdd
53     %x9 = ADRP target-flags(aarch64-page) @g0
54     BL @extfunc, csr_aarch64_aapcs ; clobbers x9
55     %x9 = ADDXri %x9, target-flags(aarch64-pageoff) @g0, 0    
56   
57   bb.3:
58     ; CHECK-NOT: MCLOH_AdrpAdd
59     %x10 = ADRP target-flags(aarch64-page) @g0
60     HINT 0, implicit def dead %x10 ; clobbers x10
61     %x10 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0    
62
63   bb.4:
64     ; Cannot produce a LOH for multiple users
65     ; CHECK-NOT: MCLOH_AdrpAdd
66     %x10 = ADRP target-flags(aarch64-page) @g0
67     HINT 0, implicit def dead %x10 ; clobbers x10
68     %x11 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0    
69     %x12 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
70
71   bb.5:
72     ; CHECK-NEXT: Adding MCLOH_AdrpLdr:
73     ; CHECK-NEXT: %X5<def> = ADRP <ga:@g2>
74     ; CHECK-NEXT: %S6<def> = LDRSui %X5, <ga:@g2>
75     ; CHECK-NEXT: Adding MCLOH_AdrpLdr:
76     ; CHECK-NEXT: %X4<def> = ADRP <ga:@g2>
77     ; CHECK-NEXT: %X4<def> = LDRXui %X4, <ga:@g2>
78     %x4 = ADRP target-flags(aarch64-page) @g2
79     %x4 = LDRXui %x4, target-flags(aarch64-pageoff) @g2
80     %x5 = ADRP target-flags(aarch64-page) @g2
81     %s6 = LDRSui %x5, target-flags(aarch64-pageoff) @g2
82
83   bb.6:
84     ; CHECK-NEXT: Adding MCLOH_AdrpLdrGot:
85     ; CHECK-NEXT: %X5<def> = ADRP <ga:@g2>
86     ; CHECK-NEXT: %X6<def> = LDRXui %X5, <ga:@g2>
87     ; CHECK-NEXT: Adding MCLOH_AdrpLdrGot:
88     ; CHECK-NEXT: %X4<def> = ADRP <ga:@g2>
89     ; CHECK-NEXT: %X4<def> = LDRXui %X4, <ga:@g2>
90     %x4 = ADRP target-flags(aarch64-page, aarch64-got) @g2
91     %x4 = LDRXui %x4, target-flags(aarch64-pageoff, aarch64-got) @g2
92     %x5 = ADRP target-flags(aarch64-page, aarch64-got) @g2
93     %x6 = LDRXui %x5, target-flags(aarch64-pageoff, aarch64-got) @g2
94
95   bb.7:
96     ; CHECK-NOT: Adding MCLOH_AdrpLdrGot:
97     ; This sequence makes no sense and should not produce a LdrGot
98     %x11 = ADRP target-flags(aarch64-page, aarch64-got) @g5
99     %s11 = LDRSui %x4, target-flags(aarch64-pageoff, aarch64-got) @g5
100
101   bb.8:
102     ; CHECK-NEXT: Adding MCLOH_AdrpAddLdr:
103     ; CHECK-NEXT: %X7<def> = ADRP <ga:@g3>[TF=1]
104     ; CHECK-NEXT: %X8<def> = ADDXri %X7, <ga:@g3>
105     ; CHECK-NEXT: %D1<def> = LDRDui %X8, 8
106     %x7 = ADRP target-flags(aarch64-page) @g3
107     %x8 = ADDXri %x7, target-flags(aarch64-pageoff) @g3, 0
108     %d1 = LDRDui %x8, 8
109
110   bb.9:
111     ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
112     ; CHECK-NEXT: %X3<def> = ADRP <ga:@g3>
113     ; CHECK-NEXT: %X3<def> = ADDXri %X3, <ga:@g3>
114     ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
115     ; CHECK-NEXT: %X5<def> = ADRP <ga:@g3>
116     ; CHECK-NEXT: %X2<def> = ADDXri %X5, <ga:@g3>
117     ; CHECK-NEXT: Adding MCLOH_AdrpAddStr:
118     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g3>
119     ; CHECK-NEXT: %X1<def> = ADDXri %X1, <ga:@g3>
120     ; CHECK-NEXT: STRXui %X2, %X1, 16
121     %x1 = ADRP target-flags(aarch64-page) @g3
122     %x1 = ADDXri %x1, target-flags(aarch64-pageoff) @g3, 0
123     STRXui %x2, %x1, 16
124
125     ; This sequence should just produce an AdrpAdd (not AdrpAddStr)
126     %x5 = ADRP target-flags(aarch64-page) @g3
127     %x2 = ADDXri %x5, target-flags(aarch64-pageoff) @g3, 0
128     STRXui %x2, %x11, 16
129
130     ; This sequence should just produce an AdrpAdd (not AdrpAddStr)
131     %x3 = ADRP target-flags(aarch64-page) @g3
132     %x3 = ADDXri %x3, target-flags(aarch64-pageoff) @g3, 0
133     STRXui %x3, %x3, 16
134
135   bb.10:
136     ; CHECK-NEXT: Adding MCLOH_AdrpLdr:
137     ; CHECK-NEXT: %X2<def> = ADRP <ga:@g3>
138     ; CHECK-NEXT: %X2<def> = LDRXui %X2, <ga:@g3>
139     ; CHECK-NEXT: Adding MCLOH_AdrpLdrGotLdr:
140     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g4>
141     ; CHECK-NEXT: %X1<def> = LDRXui %X1, <ga:@g4>
142     ; CHECK-NEXT: %X1<def> = LDRXui %X1, 24
143     %x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4
144     %x1 = LDRXui %x1, target-flags(aarch64-pageoff, aarch64-got) @g4
145     %x1 = LDRXui %x1, 24
146     ; Should just produce a MCLOH_AdrpLdr (not MCLOH_AdrpLdrGotLdr)
147     %x2 = ADRP target-flags(aarch64-page) @g3
148     %x2 = LDRXui %x2, target-flags(aarch64-pageoff) @g3
149     %x2 = LDRXui %x2, 24
150
151   bb.11:
152     ; CHECK-NEXT: Adding MCLOH_AdrpLdr
153     ; CHECK-NEXT: %X5<def> = ADRP <ga:@g1>
154     ; CHECK-NEXT: %X5<def> = LDRXui %X5, <ga:@g1>
155     ; CHECK-NEXT: Adding MCLOH_AdrpLdrGotStr:
156     ; CHECK-NEXT: %X1<def> = ADRP <ga:@g4>
157     ; CHECK-NEXT: %X1<def> = LDRXui %X1, <ga:@g4>
158     ; CHECK-NEXT: STRXui %X4, %X1, 32
159     %x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4
160     %x1 = LDRXui %x1, target-flags(aarch64-pageoff, aarch64-got) @g4
161     STRXui %x4, %x1, 32   
162     ; Should just produce a MCLOH_AdrpLdr (not MCLOH_AdrpLdrGotStr)
163     %x5 = ADRP target-flags(aarch64-page) @g1
164     %x5 = LDRXui %x5, target-flags(aarch64-pageoff) @g1
165     STRXui %x11, %x5, 32
166
167   bb.12:
168     successors: %bb.13
169     ; Cannot produce a LOH for multiple users
170     ; CHECK-NOT: MCLOH_AdrpAdd
171     %x10 = ADRP target-flags(aarch64-page) @g0
172     HINT 0, implicit def dead %x10 ; clobbers x10
173     %x11 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
174     B %bb.13
175
176   bb.13:
177     liveins: %x10
178     %x12 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
179 ...