mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-31 07:52:55 +01:00
3b3ee53886
reserving a physical register ($gp or $28) for that purpose. This will completely eliminate loads that restore the value of $gp after every function call, if the register allocator assigns a callee-saved register, or eliminate unnecessary loads if it assigns a temporary register. example: .cpload $25 // set $gp. ... .cprestore 16 // store $gp to stack slot 16($sp). ... jalr $25 // function call. clobbers $gp. lw $gp, 16($sp) // not emitted if callee-saved reg is chosen. ... lw $2, 4($gp) ... jalr $25 // function call. lw $gp, 16($sp) // not emitted if $gp is not live after this instruction. ... llvm-svn: 151402
23 lines
611 B
LLVM
23 lines
611 B
LLVM
; RUN: llc < %s -march=mipsel -mips-fix-global-base-reg=false | FileCheck %s
|
|
|
|
@g0 = external global i32
|
|
@g1 = external global i32
|
|
@g2 = external global i32
|
|
|
|
define void @foo1() nounwind {
|
|
entry:
|
|
; CHECK-NOT: .cpload
|
|
; CHECK-NOT: .cprestore
|
|
; CHECK: lui $[[R0:[0-9]+]], %hi(_gp_disp)
|
|
; CHECK: addiu $[[R1:[0-9]+]], $[[R0]], %lo(_gp_disp)
|
|
; CHECK: addu $[[GP:[0-9]+]], $[[R1]], $25
|
|
; CHECK: lw ${{[0-9]+}}, %call16(foo2)($[[GP]])
|
|
|
|
tail call void @foo2(i32* @g0) nounwind
|
|
tail call void @foo2(i32* @g1) nounwind
|
|
tail call void @foo2(i32* @g2) nounwind
|
|
ret void
|
|
}
|
|
|
|
declare void @foo2(i32*)
|