blob: c369df0c02220a101d68d560cdd9f55a07352b34 [file] [log] [blame]
Sanne Woudaa9941852017-02-03 11:15:53 +00001; RUN: llc %s -o - -mtriple=thumbv8m.base | FileCheck %s
2
Momchil Velikovdc86e142017-11-14 10:36:52 +00003declare i32 @g(...)
4
5declare i32 @h0(i32, i32, i32, i32)
6define hidden i32 @f0() {
7 %1 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
8 %2 = tail call i32 @h0(i32 %1, i32 1, i32 2, i32 3)
9 ret i32 %2
10; CHECK-LABEL: f0
Momchil Velikovbd2c7eb2017-11-27 10:13:14 +000011; CHECK: ldr [[POP:r[4567]]], [sp, #4]
Momchil Velikovdc86e142017-11-14 10:36:52 +000012; CHECK-NEXT: mov lr, [[POP]]
13; CHECK-NEXT: pop {{.*}}[[POP]]
14; CHECK-NEXT: add sp, #4
15; CHECK-NEXT: b h0
Sanne Woudaa9941852017-02-03 11:15:53 +000016}
17
Momchil Velikovdc86e142017-11-14 10:36:52 +000018declare i32 @h1(i32)
19define hidden i32 @f1() {
20 %1 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
21 %2 = tail call i32 @h1(i32 %1)
22 ret i32 %2
23; CHECK-LABEL: f1
24; CHECK: pop {r7}
25; CHECK: pop {r1}
26; CHECK: mov lr, r1
27; CHECK: b h1
Sanne Woudaa9941852017-02-03 11:15:53 +000028}
29
Momchil Velikovdc86e142017-11-14 10:36:52 +000030declare i32 @h2(i32, i32, i32, i32, i32)
31define hidden i32 @f2(i32, i32, i32, i32, i32) {
32 %6 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
33 %7 = icmp eq i32 %6, 0
34 br i1 %7, label %10, label %8
35
36 %9 = tail call i32 @h2(i32 %6, i32 %1, i32 %2, i32 %3, i32 %4)
37 br label %10
38
39 %11 = phi i32 [ %9, %8 ], [ -1, %5 ]
40 ret i32 %11
41; CHECK-LABEL: f2
Momchil Velikovbd2c7eb2017-11-27 10:13:14 +000042; CHECK: ldr [[POP:r[4567]]], [sp, #12]
Momchil Velikovdc86e142017-11-14 10:36:52 +000043; CHECK-NEXT: mov lr, [[POP]]
44; CHECK-NEXT: pop {{.*}}[[POP]]
45; CHECK-NEXT: add sp, #4
46; CHECK-NEXT: b h2
47}