mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
[X86] Call frame optimization - allow stack-relative movs to be folded into a push
Since we track esp precisely, there's no reason not to allow this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228924 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
44926033f6
commit
fb107d8bf0
@ -469,12 +469,6 @@ MachineInstr *X86CallFrameOptimization::canFoldIntoRegPush(
|
||||
DefMI->getParent() != FrameSetup->getParent())
|
||||
return nullptr;
|
||||
|
||||
// Be careful with movs that load from a stack slot, since it may get
|
||||
// resolved incorrectly.
|
||||
// TODO: Again, we already have the infrastructure, so this should work.
|
||||
if (!DefMI->getOperand(1).isReg())
|
||||
return nullptr;
|
||||
|
||||
// Now, make sure everything else up until the ADJCALLSTACK is a sequence
|
||||
// of MOVs. To be less conservative would require duplicating a lot of the
|
||||
// logic from PeepholeOptimizer.
|
||||
|
@ -103,7 +103,8 @@ entry:
|
||||
; NORMAL-NEXT: addl $16, %esp
|
||||
define void @test3(i32 %k) optsize {
|
||||
entry:
|
||||
call void @good(i32 %k, i32 2, i32 3, i32 4)
|
||||
%f = add i32 %k, 1
|
||||
call void @good(i32 %f, i32 2, i32 3, i32 4)
|
||||
ret void
|
||||
}
|
||||
|
||||
@ -200,21 +201,20 @@ entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
; But we don't want to fold stack-relative loads into the push,
|
||||
; because the offset will be wrong
|
||||
; Fold stack-relative loads into the push, with correct offset
|
||||
; In particular, at the second push, %b was at 12(%esp) and
|
||||
; %a wast at 8(%esp), but the second push bumped %esp, so %a
|
||||
; is now it at 12(%esp)
|
||||
; NORMAL-LABEL: test8:
|
||||
; NORMAL-NOT: subl {{.*}} %esp
|
||||
; NORMAL: movl 4(%esp), [[EAX:%e..]]
|
||||
; NORMAL-NEXT: pushl $4
|
||||
; NORMAL-NEXT: pushl [[EAX]]
|
||||
; NORMAL-NEXT: pushl $2
|
||||
; NORMAL: pushl $4
|
||||
; NORMAL-NEXT: pushl 12(%esp)
|
||||
; NORMAL-NEXT: pushl 12(%esp)
|
||||
; NORMAL-NEXT: pushl $1
|
||||
; NORMAL-NEXT: call
|
||||
; NORMAL-NEXT: addl $16, %esp
|
||||
define void @test8(i32* %ptr) optsize {
|
||||
define void @test8(i32 %a, i32 %b) optsize {
|
||||
entry:
|
||||
%val = ptrtoint i32* %ptr to i32
|
||||
call void @good(i32 1, i32 2, i32 %val, i32 4)
|
||||
call void @good(i32 1, i32 %a, i32 %b, i32 4)
|
||||
ret void
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user