1; RUN: llc -fast-isel -O0 -mcpu=generic -mtriple=i386-apple-darwin10 -relocation-model=pic < %s | FileCheck %s
2
3; This should use flds to set the return value.
4; CHECK-LABEL: test0:
5; CHECK: flds
6; CHECK: retl
7@G = external global float
8define float @test0() nounwind {
9  %t = load float* @G
10  ret float %t
11}
12
13; This should pop 4 bytes on return.
14; CHECK-LABEL: test1:
15; CHECK: retl $4
16define void @test1({i32, i32, i32, i32}* sret %p) nounwind {
17  store {i32, i32, i32, i32} zeroinitializer, {i32, i32, i32, i32}* %p
18  ret void
19}
20
21; Properly initialize the pic base.
22; CHECK-LABEL: test2:
23; CHECK-NOT: HHH
24; CHECK: call{{.*}}L2$pb
25; CHECK-NEXT: L2$pb:
26; CHECK-NEXT: pop
27; CHECK: HHH
28; CHECK: retl
29@HHH = external global i32
30define i32 @test2() nounwind {
31  %t = load i32* @HHH
32  ret i32 %t
33}
34
35; Check that we fast-isel sret, and handle the callee-pops behavior correctly.
36%struct.a = type { i64, i64, i64 }
37define void @test3() nounwind ssp {
38entry:
39  %tmp = alloca %struct.a, align 8
40  call void @test3sret(%struct.a* sret %tmp)
41  ret void
42; CHECK-LABEL: test3:
43; CHECK: subl $44
44; CHECK: leal 16(%esp)
45; CHECK: calll _test3sret
46; CHECK: addl $40
47}
48declare void @test3sret(%struct.a* sret)
49
50; Check that fast-isel sret works with fastcc (and does not callee-pop)
51define void @test4() nounwind ssp {
52entry:
53  %tmp = alloca %struct.a, align 8
54  call fastcc void @test4fastccsret(%struct.a* sret %tmp)
55  ret void
56; CHECK-LABEL: test4:
57; CHECK: subl $28
58; CHECK: leal (%esp), %ecx
59; CHECK: calll _test4fastccsret
60; CHECK: addl $28
61}
62declare fastcc void @test4fastccsret(%struct.a* sret)
63
64
65; Check that fast-isel cleans up when it fails to lower a call instruction.
66define void @test5() {
67entry:
68  %call = call i32 @test5dllimport(i32 42)
69  ret void
70; CHECK-LABEL: test5:
71; Local value area is still there:
72; CHECK: movl $42, {{%[a-z]+}}
73; Fast-ISel's arg push is not here:
74; CHECK-NOT: movl $42, (%esp)
75; SDag-ISel's arg push:
76; CHECK: movl %esp, [[REGISTER:%[a-z]+]]
77; CHECK: movl $42, ([[REGISTER]])
78; CHECK: movl __imp__test5dllimport
79}
80declare dllimport i32 @test5dllimport(i32)
81