[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / fast-isel-x86.ll
blobb076537bfd6da9c4727033bc2c301934aea21b43
1 ; RUN: llc -fast-isel -O0 -mcpu=generic -mtriple=i386-apple-darwin10 -relocation-model=pic < %s | FileCheck %s
2 ; RUN: llc -fast-isel -O0 -mcpu=generic -mtriple=i386-apple-darwin10 -relocation-model=pic < %s -pass-remarks-missed=isel 2>&1 >/dev/null | FileCheck -check-prefix=STDERR -allow-empty %s
4 ; This should use flds to set the return value.
5 ; CHECK-LABEL: test0:
6 ; CHECK: flds
7 ; CHECK: retl
8 @G = external global float
9 define float @test0() nounwind {
10   %t = load float, ptr @G
11   ret float %t
14 ; This should pop 4 bytes on return.
15 ; CHECK-LABEL: test1:
16 ; CHECK: retl $4
17 define void @test1(ptr sret({i32, i32, i32, i32}) %p) nounwind {
18   store {i32, i32, i32, i32} zeroinitializer, ptr %p
19   ret void
22 ; This should pop 8 bytes on return.
23 ; CHECK-LABEL: thiscallfun:
24 ; CHECK: retl $8
25 define x86_thiscallcc i32 @thiscallfun(ptr %this, i32 %a, i32 %b) nounwind {
26 ; STDERR-NOT: FastISel missed terminator: ret i32 12345
27   ret i32 12345
30 ; Here, the callee pop doesn't fit the 16 bit immediate -- see x86-big-ret.ll
31 ; This checks that -fast-isel doesn't miscompile this.
32 ; CHECK-LABEL: thiscall_large:
33 ; CHECK:      popl %ecx
34 ; CHECK-NEXT: addl $65536, %esp
35 ; CHECK-NEXT: pushl %ecx
36 ; CHECK-NEXT: retl
37 define x86_thiscallcc void @thiscall_large(ptr %this, ptr byval([65533 x i8]) %b) nounwind {
38   ret void
41 ; This should pop 4 bytes on return.
42 ; CHECK-LABEL: stdcallfun:
43 ; CHECK: retl $4
44 define x86_stdcallcc i32 @stdcallfun(i32 %a) nounwind {
45 ; STDERR-NOT: FastISel missed terminator: ret i32 54321
46   ret i32 54321
49 ; Properly initialize the pic base.
50 ; CHECK-LABEL: test2:
51 ; CHECK-NOT: HHH
52 ; CHECK: call{{.*}}L5$pb
53 ; CHECK-NEXT: L5$pb:
54 ; CHECK-NEXT: pop
55 ; CHECK: HHH
56 ; CHECK: retl
57 @HHH = external global i32
58 define i32 @test2() nounwind {
59   %t = load i32, ptr @HHH
60   ret i32 %t
63 ; Check that we fast-isel sret, and handle the callee-pops behavior correctly.
64 %struct.a = type { i64, i64, i64 }
65 define void @test3() nounwind ssp {
66 entry:
67   %tmp = alloca %struct.a, align 8
68   call void @test3sret(ptr sret(%struct.a) %tmp)
69   ret void
70 ; CHECK-LABEL: test3:
71 ; CHECK: subl $44
72 ; CHECK: leal 16(%esp)
73 ; CHECK: calll _test3sret
74 ; CHECK: addl $40
76 declare void @test3sret(ptr sret(%struct.a))
78 ; Check that fast-isel sret works with fastcc (and does not callee-pop)
79 define void @test4() nounwind ssp {
80 entry:
81   %tmp = alloca %struct.a, align 8
82   call fastcc void @test4fastccsret(ptr sret(%struct.a) %tmp)
83   ret void
84 ; CHECK-LABEL: test4:
85 ; CHECK: subl $28
86 ; CHECK: movl %esp, %ecx
87 ; CHECK: calll _test4fastccsret
88 ; CHECK: addl $28
90 declare fastcc void @test4fastccsret(ptr sret(%struct.a))