xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/2010-02-19-TailCallRetAddrBug.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=generic -mtriple=i386-apple-darwin -tailcallopt -enable-misched=false < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Check that lowered argumens do not overwrite the return address before it is moved.
3*9880d681SAndroid Build Coastguard Worker; Bug 6225
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; If a call is a fastcc tail call and tail call optimization is enabled, the
6*9880d681SAndroid Build Coastguard Worker; caller frame is replaced by the callee frame. This can require that arguments are
7*9880d681SAndroid Build Coastguard Worker; placed on the former return address stack slot. Special care needs to be taken
8*9880d681SAndroid Build Coastguard Worker; taken that the return address is moved / or stored in a register before
9*9880d681SAndroid Build Coastguard Worker; lowering of arguments potentially overwrites the value.
10*9880d681SAndroid Build Coastguard Worker;
11*9880d681SAndroid Build Coastguard Worker; Move return address (76(%esp)) to a temporary register (%ebp)
12*9880d681SAndroid Build Coastguard Worker; CHECK: movl 76(%esp), [[REGISTER:%[a-z]+]]
13*9880d681SAndroid Build Coastguard Worker; Overwrite return addresss
14*9880d681SAndroid Build Coastguard Worker; CHECK: movl [[EBX:%[a-z]+]], 76(%esp)
15*9880d681SAndroid Build Coastguard Worker; Move return address from temporary register (%ebp) to new stack location (60(%esp))
16*9880d681SAndroid Build Coastguard Worker; CHECK: movl [[REGISTER]], 60(%esp)
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker%tupl = type [9 x i32]
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdeclare fastcc void @l297(i32 %r10, i32 %r9, i32 %r8, i32 %r7, i32 %r6, i32 %r5, i32 %r3, i32 %r2) noreturn nounwind
21*9880d681SAndroid Build Coastguard Workerdeclare fastcc void @l298(i32 %r10, i32 %r9, i32 %r4) noreturn nounwind
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine fastcc void @l186(%tupl* %r1) noreturn nounwind {
24*9880d681SAndroid Build Coastguard Workerentry:
25*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr %tupl, %tupl* %r1, i32 0, i32 0
26*9880d681SAndroid Build Coastguard Worker  %r2 = load i32, i32* %ptr1
27*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr %tupl, %tupl* %r1, i32 0, i32 1
28*9880d681SAndroid Build Coastguard Worker  %r3 = load i32, i32* %ptr3
29*9880d681SAndroid Build Coastguard Worker  %ptr5 = getelementptr %tupl, %tupl* %r1, i32 0, i32 2
30*9880d681SAndroid Build Coastguard Worker  %r4 = load i32, i32* %ptr5
31*9880d681SAndroid Build Coastguard Worker  %ptr7 = getelementptr %tupl, %tupl* %r1, i32 0, i32 3
32*9880d681SAndroid Build Coastguard Worker  %r5 = load i32, i32* %ptr7
33*9880d681SAndroid Build Coastguard Worker  %ptr9 = getelementptr %tupl, %tupl* %r1, i32 0, i32 4
34*9880d681SAndroid Build Coastguard Worker  %r6 = load i32, i32* %ptr9
35*9880d681SAndroid Build Coastguard Worker  %ptr11 = getelementptr %tupl, %tupl* %r1, i32 0, i32 5
36*9880d681SAndroid Build Coastguard Worker  %r7 = load i32, i32* %ptr11
37*9880d681SAndroid Build Coastguard Worker  %ptr13 = getelementptr %tupl, %tupl* %r1, i32 0, i32 6
38*9880d681SAndroid Build Coastguard Worker  %r8 = load i32, i32* %ptr13
39*9880d681SAndroid Build Coastguard Worker  %ptr15 = getelementptr %tupl, %tupl* %r1, i32 0, i32 7
40*9880d681SAndroid Build Coastguard Worker  %r9 = load i32, i32* %ptr15
41*9880d681SAndroid Build Coastguard Worker  %ptr17 = getelementptr %tupl, %tupl* %r1, i32 0, i32 8
42*9880d681SAndroid Build Coastguard Worker  %r10 = load i32, i32* %ptr17
43*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i32 %r10, 3
44*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %true, label %false
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workertrue:
47*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @l297(i32 %r10, i32 %r9, i32 %r8, i32 %r7, i32 %r6, i32 %r5, i32 %r3, i32 %r2) noreturn nounwind
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerfalse:
51*9880d681SAndroid Build Coastguard Worker  tail call fastcc void @l298(i32 %r10, i32 %r9, i32 %r4) noreturn nounwind
52*9880d681SAndroid Build Coastguard Worker  ret void
53*9880d681SAndroid Build Coastguard Worker}
54