mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
Adds an instruction itinerary to all x86 instructions, giving each a default latency of 1, using the InstrItinClass IIC_DEFAULT. Sets specific latencies for Atom for the instructions in files X86InstrCMovSetCC.td, X86InstrArithmetic.td, X86InstrControl.td, and X86InstrShiftRotate.td. The Atom latencies for the remainder of the x86 instructions will be set in subsequent patches. Adds a test to verify that the scheduler is working. Also changes the scheduling preference to "Hybrid" for i386 Atom, while leaving x86_64 as ILP. Patch by Preston Gurd! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149558 91177308-0d34-0410-b5e6-96231b3b80d8
56 lines
2.1 KiB
LLVM
56 lines
2.1 KiB
LLVM
; RUN: llc -mcpu=generic -mtriple=i386-apple-darwin -tailcallopt < %s | FileCheck %s
|
|
; Check that lowered argumens do not overwrite the return address before it is moved.
|
|
; Bug 6225
|
|
;
|
|
; If a call is a fastcc tail call and tail call optimization is enabled, the
|
|
; caller frame is replaced by the callee frame. This can require that arguments are
|
|
; placed on the former return address stack slot. Special care needs to be taken
|
|
; taken that the return address is moved / or stored in a register before
|
|
; lowering of arguments potentially overwrites the value.
|
|
;
|
|
; Move return address (76(%esp)) to a temporary register (%ebp)
|
|
; CHECK: movl 76(%esp), [[REGISTER:%[a-z]+]]
|
|
; Overwrite return addresss
|
|
; CHECK: movl [[EBX:%[a-z]+]], 76(%esp)
|
|
; Move return address from temporary register (%ebp) to new stack location (60(%esp))
|
|
; CHECK: movl [[REGISTER]], 60(%esp)
|
|
|
|
%tupl_p = type [9 x i32]*
|
|
|
|
declare fastcc void @l297(i32 %r10, i32 %r9, i32 %r8, i32 %r7, i32 %r6, i32 %r5, i32 %r3, i32 %r2) noreturn nounwind
|
|
declare fastcc void @l298(i32 %r10, i32 %r9, i32 %r4) noreturn nounwind
|
|
|
|
define fastcc void @l186(%tupl_p %r1) noreturn nounwind {
|
|
entry:
|
|
%ptr1 = getelementptr %tupl_p %r1, i32 0, i32 0
|
|
%r2 = load i32* %ptr1
|
|
%ptr3 = getelementptr %tupl_p %r1, i32 0, i32 1
|
|
%r3 = load i32* %ptr3
|
|
%ptr5 = getelementptr %tupl_p %r1, i32 0, i32 2
|
|
%r4 = load i32* %ptr5
|
|
%ptr7 = getelementptr %tupl_p %r1, i32 0, i32 3
|
|
%r5 = load i32* %ptr7
|
|
%ptr9 = getelementptr %tupl_p %r1, i32 0, i32 4
|
|
%r6 = load i32* %ptr9
|
|
%ptr11 = getelementptr %tupl_p %r1, i32 0, i32 5
|
|
%r7 = load i32* %ptr11
|
|
%ptr13 = getelementptr %tupl_p %r1, i32 0, i32 6
|
|
%r8 = load i32* %ptr13
|
|
%ptr15 = getelementptr %tupl_p %r1, i32 0, i32 7
|
|
%r9 = load i32* %ptr15
|
|
%ptr17 = getelementptr %tupl_p %r1, i32 0, i32 8
|
|
%r10 = load i32* %ptr17
|
|
%cond = icmp eq i32 %r10, 3
|
|
br i1 %cond, label %true, label %false
|
|
|
|
true:
|
|
tail call fastcc void @l297(i32 %r10, i32 %r9, i32 %r8, i32 %r7, i32 %r6, i32 %r5, i32 %r3, i32 %r2) noreturn nounwind
|
|
ret void
|
|
|
|
false:
|
|
tail call fastcc void @l298(i32 %r10, i32 %r9, i32 %r4) noreturn nounwind
|
|
ret void
|
|
}
|
|
|
|
|