annotate test/CodeGen/ARM/swiftself.ll @ 128:c347d3398279 default tip

fix
author mir3636
date Wed, 06 Dec 2017 14:37:17 +0900
parents 803732b1fca8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 ; RUN: llc -verify-machineinstrs -mtriple=armv7k-apple-ios8.0 -mcpu=cortex-a7 -o - %s | FileCheck --check-prefix=CHECK --check-prefix=OPT --check-prefix=TAILCALL %s
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 ; RUN: llc -O0 -verify-machineinstrs -mtriple=armv7k-apple-ios8.0 -mcpu=cortex-a7 -o - %s | FileCheck %s
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 ; RUN: llc -verify-machineinstrs -mtriple=armv7-apple-ios -o - %s | FileCheck --check-prefix=CHECK --check-prefix=OPT %s
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 ; RUN: llc -O0 -verify-machineinstrs -mtriple=armv7-apple-ios -o - %s | FileCheck %s
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 ; Parameter with swiftself should be allocated to r10.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 ; CHECK-LABEL: swiftself_param:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 ; CHECK: mov r0, r10
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 define i8 *@swiftself_param(i8* swiftself %addr0) "no-frame-pointer-elim"="true" {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 ret i8 *%addr0
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 ; Check that r10 is used to pass a swiftself argument.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 ; CHECK-LABEL: call_swiftself:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 ; CHECK: mov r10, r0
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 ; CHECK: bl {{_?}}swiftself_param
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 define i8 *@call_swiftself(i8* %arg) "no-frame-pointer-elim"="true" {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 %res = call i8 *@swiftself_param(i8* swiftself %arg)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 ret i8 *%res
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 ; r10 should be saved by the callee even if used for swiftself
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 ; CHECK-LABEL: swiftself_clobber:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 ; CHECK: push {r10}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 ; ...
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 ; CHECK: pop {r10}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 define i8 *@swiftself_clobber(i8* swiftself %addr0) "no-frame-pointer-elim"="true" {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 call void asm sideeffect "", "~{r10}"()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 ret i8 *%addr0
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 ; Demonstrate that we do not need any movs when calling multiple functions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 ; with swiftself argument.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 ; CHECK-LABEL: swiftself_passthrough:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 ; OPT-NOT: mov{{.*}}r10
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 ; OPT: bl {{_?}}swiftself_param
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 ; OPT-NOT: mov{{.*}}r10
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 ; OPT-NEXT: bl {{_?}}swiftself_param
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 define void @swiftself_passthrough(i8* swiftself %addr0) "no-frame-pointer-elim"="true" {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 call i8 *@swiftself_param(i8* swiftself %addr0)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 call i8 *@swiftself_param(i8* swiftself %addr0)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 ret void
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 ; We can use a tail call if the callee swiftself is the same as the caller one.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 ; CHECK-LABEL: swiftself_tail:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 ; TAILCALL: b {{_?}}swiftself_param
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 ; TAILCALL-NOT: pop
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 define i8* @swiftself_tail(i8* swiftself %addr0) "no-frame-pointer-elim"="true" {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 call void asm sideeffect "", "~{r10}"()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 %res = tail call i8* @swiftself_param(i8* swiftself %addr0)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 ret i8* %res
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 ; We can not use a tail call if the callee swiftself is not the same as the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 ; caller one.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 ; CHECK-LABEL: swiftself_notail:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 ; CHECK: mov r10, r0
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 ; CHECK: bl {{_?}}swiftself_param
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 ; CHECK: pop
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 define i8* @swiftself_notail(i8* swiftself %addr0, i8* %addr1) nounwind "no-frame-pointer-elim"="true" {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 %res = tail call i8* @swiftself_param(i8* swiftself %addr1)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 ret i8* %res
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
66
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67 ; We cannot pretend that 'r0' is alive across the thisreturn_attribute call as
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 ; we normally would. We marked the first parameter with swiftself which means it
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 ; will no longer be passed in r0.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 declare swiftcc i8* @thisreturn_attribute(i8* returned swiftself)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 ; OPT-LABEL: swiftself_nothisreturn:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 ; OPT-DAG: mov [[CSREG:r[1-9].*]], r0
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
73 ; OPT-DAG: ldr r10, [r10]
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
74 ; OPT: bl {{_?}}thisreturn_attribute
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
75 ; OPT: str r0, {{\[}}[[CSREG]]
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
76 define hidden swiftcc void @swiftself_nothisreturn(i8** noalias nocapture sret, i8** noalias nocapture readonly swiftself) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
77 entry:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 %2 = load i8*, i8** %1, align 8
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79 %3 = tail call swiftcc i8* @thisreturn_attribute(i8* swiftself %2)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
80 store i8* %3, i8** %0, align 8
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
81 ret void
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
82 }