1 Pull in r198910 from upstream llvm trunk (by Venkatraman Govindaraju):
3 [Sparc] Emit retl/ret instead of jmp instruction. It improves the readability of the assembly generated.
5 Introduced here: http://svn.freebsd.org/changeset/base/262261
7 Index: test/CodeGen/SPARC/ctpop.ll
8 ===================================================================
9 --- test/CodeGen/SPARC/ctpop.ll
10 +++ test/CodeGen/SPARC/ctpop.ll
11 @@ -9,12 +9,12 @@ declare i32 @llvm.ctpop.i32(i32)
17 ; V9-NEXT: popc %o0, %o0
20 ; SPARC64: srl %o0, 0, %o0
23 ; SPARC64: popc %o0, %o0
25 define i32 @test(i32 %X) {
26 Index: test/CodeGen/SPARC/2011-01-11-Call.ll
27 ===================================================================
28 --- test/CodeGen/SPARC/2011-01-11-Call.ll
29 +++ test/CodeGen/SPARC/2011-01-11-Call.ll
47 define void @test() nounwind {
48 @@ -36,7 +36,7 @@ declare void @bar(...)
54 ; V8-NEXT: restore %g0, %o0, %o0
56 ; V9-LABEL: test_tail_call_with_return
57 @@ -43,7 +43,7 @@ declare void @bar(...)
63 ; V9-NEXT: restore %g0, %o0, %o0
65 define i32 @test_tail_call_with_return() nounwind {
66 Index: test/CodeGen/SPARC/leafproc.ll
67 ===================================================================
68 --- test/CodeGen/SPARC/leafproc.ll
69 +++ test/CodeGen/SPARC/leafproc.ll
71 ; RUN: llc -march=sparc -disable-sparc-leaf-proc=0 < %s | FileCheck %s
73 ; CHECK-LABEL: func_nobody:
77 define void @func_nobody() {
79 @@ -10,7 +10,7 @@ entry:
82 ; CHECK-LABEL: return_int_const:
85 ; CHECK-NEXT: or %g0, 1729, %o0
86 define i32 @return_int_const() {
88 @@ -19,7 +19,7 @@ entry:
90 ; CHECK-LABEL: return_double_const:
94 ; CHECK-NEXT: ldd {{.*}}, %f0
96 define double @return_double_const() {
97 @@ -29,7 +29,7 @@ entry:
99 ; CHECK-LABEL: leaf_proc_with_args:
100 ; CHECK: add {{%o[0-1]}}, {{%o[0-1]}}, [[R:%[go][0-7]]]
103 ; CHECK-NEXT: add [[R]], %o2, %o0
105 define i32 @leaf_proc_with_args(i32 %a, i32 %b, i32 %c) {
106 @@ -42,7 +42,7 @@ entry:
107 ; CHECK-LABEL: leaf_proc_with_args_in_stack:
108 ; CHECK-DAG: ld [%sp+92], {{%[go][0-7]}}
109 ; CHECK-DAG: ld [%sp+96], {{%[go][0-7]}}
112 ; CHECK-NEXT: add {{.*}}, %o0
113 define i32 @leaf_proc_with_args_in_stack(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) {
115 @@ -63,7 +63,7 @@ entry:
116 ; CHECK: or %g0, 2, [[R2:%[go][0-7]]]
117 ; CHECK: st [[R2]], [%sp+100]
118 ; CHECK: ld {{.+}}, %o0
121 ; CHECK-NEXT: add %sp, 104, %sp
123 define i32 @leaf_proc_with_local_array(i32 %a, i32 %b, i32 %c) {
124 Index: test/CodeGen/SPARC/fp128.ll
125 ===================================================================
126 --- test/CodeGen/SPARC/fp128.ll
127 +++ test/CodeGen/SPARC/fp128.ll
128 @@ -45,7 +45,7 @@ entry:
129 ; HARD: std %f{{.+}}, [%[[S1:.+]]]
130 ; HARD-DAG: ldd [%[[S0]]], %f{{.+}}
131 ; HARD-DAG: ldd [%[[S1]]], %f{{.+}}
135 ; SOFT-LABEL: f128_spill
136 ; SOFT: std %f{{.+}}, [%[[S0:.+]]]
137 @@ -52,7 +52,7 @@ entry:
138 ; SOFT: std %f{{.+}}, [%[[S1:.+]]]
139 ; SOFT-DAG: ldd [%[[S0]]], %f{{.+}}
140 ; SOFT-DAG: ldd [%[[S1]]], %f{{.+}}
144 define void @f128_spill(fp128* noalias sret %scalar.result, fp128* byval %a) {
146 @@ -132,13 +132,13 @@ entry:
153 ; SOFT-LABEL: fp128_unaligned
160 define void @fp128_unaligned(fp128* %a, fp128* %b, fp128* %c) {
162 Index: test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
163 ===================================================================
164 --- test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
165 +++ test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
166 @@ -9,18 +9,18 @@ define i8* @frameaddr() nounwind readnone {
168 ;V8-LABEL: frameaddr:
169 ;V8: save %sp, -96, %sp
172 ;V8: restore %g0, %fp, %o0
174 ;V9-LABEL: frameaddr:
175 ;V9: save %sp, -96, %sp
178 ;V9: restore %g0, %fp, %o0
180 ;SPARC64-LABEL: frameaddr
181 ;SPARC64: save %sp, -128, %sp
182 ;SPARC64: add %fp, 2047, %i0
185 ;SPARC64: restore %g0, %g0, %g0
187 %0 = tail call i8* @llvm.frameaddress(i32 0)
188 Index: test/CodeGen/SPARC/constpool.ll
189 ===================================================================
190 --- test/CodeGen/SPARC/constpool.ll
191 +++ test/CodeGen/SPARC/constpool.ll
192 @@ -12,7 +12,7 @@ entry:
195 ; abs32: sethi %hi(.LCPI0_0), %[[R:[gilo][0-7]]]
198 ; abs32: ld [%[[R]]+%lo(.LCPI0_0)], %f
201 @@ -20,7 +20,7 @@ entry:
202 ; abs44: sethi %h44(.LCPI0_0), %[[R1:[gilo][0-7]]]
203 ; abs44: add %[[R1]], %m44(.LCPI0_0), %[[R2:[gilo][0-7]]]
204 ; abs44: sllx %[[R2]], 12, %[[R3:[gilo][0-7]]]
207 ; abs44: ld [%[[R3]]+%l44(.LCPI0_0)], %f1
210 @@ -30,7 +30,7 @@ entry:
211 ; abs64: sethi %hh(.LCPI0_0), %[[R3:[gilo][0-7]]]
212 ; abs64: add %[[R3]], %hm(.LCPI0_0), %[[R4:[gilo][0-7]]]
213 ; abs64: sllx %[[R4]], 32, %[[R5:[gilo][0-7]]]
216 ; abs64: ld [%[[R5]]+%[[R2]]], %f1
219 @@ -40,7 +40,7 @@ entry:
220 ; v8pic32: add %[[R1]], %lo(.LCPI0_0), %[[Goffs:[gilo][0-7]]]
221 ; v8pic32: ld [%[[GOT:[gilo][0-7]]]+%[[Goffs]]], %[[Gaddr:[gilo][0-7]]]
222 ; v8pic32: ld [%[[Gaddr]]], %f0
223 -; v8pic32: jmp %i7+8
228 @@ -51,7 +51,7 @@ entry:
229 ; v9pic32: add %[[R1]], %lo(.LCPI0_0), %[[Goffs:[gilo][0-7]]]
230 ; v9pic32: ldx [%[[GOT:[gilo][0-7]]]+%[[Goffs]]], %[[Gaddr:[gilo][0-7]]]
231 ; v9pic32: ld [%[[Gaddr]]], %f1
232 -; v9pic32: jmp %i7+8
237 Index: test/CodeGen/SPARC/globals.ll
238 ===================================================================
239 --- test/CodeGen/SPARC/globals.ll
240 +++ test/CodeGen/SPARC/globals.ll
241 @@ -14,7 +14,7 @@ define zeroext i8 @loadG() {
244 ; abs32: sethi %hi(G), %[[R:[gilo][0-7]]]
247 ; abs32: ldub [%[[R]]+%lo(G)], %o0
250 @@ -22,7 +22,7 @@ define zeroext i8 @loadG() {
251 ; abs44: sethi %h44(G), %[[R1:[gilo][0-7]]]
252 ; abs44: add %[[R1]], %m44(G), %[[R2:[gilo][0-7]]]
253 ; abs44: sllx %[[R2]], 12, %[[R3:[gilo][0-7]]]
256 ; abs44: ldub [%[[R3]]+%l44(G)], %o0
259 @@ -32,7 +32,7 @@ define zeroext i8 @loadG() {
260 ; abs64: sethi %hh(G), %[[R3:[gilo][0-7]]]
261 ; abs64: add %[[R3]], %hm(G), %[[R4:[gilo][0-7]]]
262 ; abs64: sllx %[[R4]], 32, %[[R5:[gilo][0-7]]]
265 ; abs64: ldub [%[[R5]]+%[[R2]]], %o0
268 @@ -42,7 +42,7 @@ define zeroext i8 @loadG() {
269 ; v8pic32: add %[[R1]], %lo(G), %[[Goffs:[gilo][0-7]]]
270 ; v8pic32: ld [%[[GOT:[gilo][0-7]]]+%[[Goffs]]], %[[Gaddr:[gilo][0-7]]]
271 ; v8pic32: ldub [%[[Gaddr]]], %i0
272 -; v8pic32: jmp %i7+8
277 @@ -52,6 +52,6 @@ define zeroext i8 @loadG() {
278 ; v9pic32: add %[[R1]], %lo(G), %[[Goffs:[gilo][0-7]]]
279 ; v9pic32: ldx [%[[GOT:[gilo][0-7]]]+%[[Goffs]]], %[[Gaddr:[gilo][0-7]]]
280 ; v9pic32: ldub [%[[Gaddr]]], %i0
281 -; v9pic32: jmp %i7+8
285 Index: test/CodeGen/SPARC/rem.ll
286 ===================================================================
287 --- test/CodeGen/SPARC/rem.ll
288 +++ test/CodeGen/SPARC/rem.ll
290 ; CHECK-LABEL: test1:
291 ; CHECK: sdivx %o0, %o1, %o2
292 ; CHECK-NEXT: mulx %o2, %o1, %o1
293 -; CHECK-NEXT: jmp %o7+8
295 ; CHECK-NEXT: sub %o0, %o1, %o0
297 define i64 @test1(i64 %X, i64 %Y) {
298 @@ -14,7 +14,7 @@ define i64 @test1(i64 %X, i64 %Y) {
299 ; CHECK-LABEL: test2:
300 ; CHECK: udivx %o0, %o1, %o2
301 ; CHECK-NEXT: mulx %o2, %o1, %o1
302 -; CHECK-NEXT: jmp %o7+8
304 ; CHECK-NEXT: sub %o0, %o1, %o0
306 define i64 @test2(i64 %X, i64 %Y) {
307 Index: test/CodeGen/SPARC/2011-01-19-DelaySlot.ll
308 ===================================================================
309 --- test/CodeGen/SPARC/2011-01-19-DelaySlot.ll
310 +++ test/CodeGen/SPARC/2011-01-19-DelaySlot.ll
311 @@ -7,7 +7,7 @@ entry:
317 ; CHECK-NEXT: restore
318 %0 = tail call i32 @bar(i32 %a) nounwind
320 @@ -18,7 +18,7 @@ entry:
326 ; CHECK-NEXT: restore
327 %0 = tail call i32 %f(i32 %a, i32 %b) nounwind
329 @@ -47,7 +47,7 @@ bb:
331 bb5: ; preds = %bb, %entry
332 %a_addr.1.lcssa = phi i32 [ %a, %entry ], [ %a_addr.0, %bb ]
336 ret i32 %a_addr.1.lcssa
338 @@ -110,7 +110,7 @@ declare i32 @func(i32*)
339 define i32 @restore_add(i32 %a, i32 %b) {
341 ;CHECK-LABEL: restore_add:
344 ;CHECK: restore %o0, %i1, %o0
345 %0 = tail call i32 @bar(i32 %a) nounwind
346 %1 = add nsw i32 %0, %b
347 @@ -120,7 +120,7 @@ entry:
348 define i32 @restore_add_imm(i32 %a) {
350 ;CHECK-LABEL: restore_add_imm:
353 ;CHECK: restore %o0, 20, %o0
354 %0 = tail call i32 @bar(i32 %a) nounwind
355 %1 = add nsw i32 %0, 20
356 @@ -130,7 +130,7 @@ entry:
357 define i32 @restore_or(i32 %a) {
359 ;CHECK-LABEL: restore_or:
362 ;CHECK: restore %g0, %o0, %o0
363 %0 = tail call i32 @bar(i32 %a) nounwind
365 @@ -140,7 +140,7 @@ define i32 @restore_or_imm(i32 %a) {
367 ;CHECK-LABEL: restore_or_imm:
368 ;CHECK: or %o0, 20, %i0
371 ;CHECK: restore %g0, %g0, %g0
372 %0 = tail call i32 @bar(i32 %a) nounwind
374 Index: test/CodeGen/SPARC/64bit.ll
375 ===================================================================
376 --- test/CodeGen/SPARC/64bit.ll
377 +++ test/CodeGen/SPARC/64bit.ll
379 ; CHECK: or %g0, %i1, %i0
384 ; OPT: or %g0, %o1, %o0
385 define i64 @ret2(i64 %a, i64 %b) {
387 @@ -15,7 +15,7 @@ define i64 @ret2(i64 %a, i64 %b) {
388 ; CHECK: sllx %i0, 7, %i0
390 ; OPT-LABEL: shl_imm:
393 ; OPT: sllx %o0, 7, %o0
394 define i64 @shl_imm(i64 %a) {
396 @@ -26,7 +26,7 @@ define i64 @shl_imm(i64 %a) {
397 ; CHECK: srax %i0, %i1, %i0
399 ; OPT-LABEL: sra_reg:
402 ; OPT: srax %o0, %o1, %o0
403 define i64 @sra_reg(i64 %a, i64 %b) {
405 @@ -42,7 +42,7 @@ define i64 @sra_reg(i64 %a, i64 %b) {
406 ; CHECK: or %g0, 0, %i0
411 ; OPT: or %g0, 0, %o0
412 define i64 @ret_imm0() {
414 @@ -52,7 +52,7 @@ define i64 @ret_imm0() {
415 ; CHECK: or %g0, -4096, %i0
420 ; OPT: or %g0, -4096, %o0
421 define i64 @ret_simm13() {
423 @@ -64,7 +64,7 @@ define i64 @ret_simm13() {
430 define i64 @ret_sethi() {
432 @@ -76,7 +76,7 @@ define i64 @ret_sethi() {
435 ; OPT: sethi 4, [[R:%[go][0-7]]]
438 ; OPT: or [[R]], 1, %o0
440 define i64 @ret_sethi_or() {
441 @@ -89,7 +89,7 @@ define i64 @ret_sethi_or() {
444 ; OPT: sethi 4, [[R:%[go][0-7]]]
447 ; OPT: xor [[R]], -4, %o0
449 define i64 @ret_nimm33() {
450 Index: lib/Target/Sparc/SparcInstrAliases.td
451 ===================================================================
452 --- lib/Target/Sparc/SparcInstrAliases.td
453 +++ lib/Target/Sparc/SparcInstrAliases.td
454 @@ -128,3 +128,9 @@ def : InstAlias<"jmp $addr", (JMPLri G0, MEMri:$ad
455 // call addr -> jmpl addr, %o7
456 def : InstAlias<"call $addr", (JMPLrr O7, MEMrr:$addr)>;
457 def : InstAlias<"call $addr", (JMPLri O7, MEMri:$addr)>;
460 +def : InstAlias<"retl", (RETL 8)>;
463 +def : InstAlias<"ret", (RET 8)>;