xref: /llvm-project/llvm/test/CodeGen/PowerPC/tailcall-speculatable-callee.ll (revision eb7d16ea25649909373e324e6ebf36774cabdbfa)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3; RUN:   -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s
4
5; The tests check the behavior of the tail call decision when the callee is speculatable.
6
7; Callee should be tail called in this function since it is at a tail call position.
8define dso_local double @speculatable_callee_return_use_only (ptr nocapture %res, double %a) #0 {
9; CHECK-LABEL: speculatable_callee_return_use_only:
10; CHECK:       # %bb.0: # %entry
11; CHECK-NEXT:    b callee
12; CHECK-NEXT:    #TC_RETURNd8 callee 0
13entry:
14  %value = tail call double @callee(double %a) #2
15  ret double %value
16}
17
18; Callee should not be tail called since it is not at a tail call position.
19define dso_local void @speculatable_callee_non_return_use_only (ptr nocapture %res, double %a) #0 {
20; CHECK-LABEL: speculatable_callee_non_return_use_only:
21; CHECK:       # %bb.0: # %entry
22; CHECK-NEXT:    mflr r0
23; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
24; CHECK-NEXT:    stdu r1, -48(r1)
25; CHECK-NEXT:    std r0, 64(r1)
26; CHECK-NEXT:    mr r30, r3
27; CHECK-NEXT:    bl callee
28; CHECK-NEXT:    stfd f1, 0(r30)
29; CHECK-NEXT:    addi r1, r1, 48
30; CHECK-NEXT:    ld r0, 16(r1)
31; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
32; CHECK-NEXT:    mtlr r0
33; CHECK-NEXT:    blr
34entry:
35  %call = tail call double @callee(double %a) #2
36  store double %call, ptr %res, align 8
37  ret void
38}
39
40; Callee should not be tail called since it is not at a tail call position.
41define dso_local double @speculatable_callee_multi_use (ptr nocapture %res, double %a) #0 {
42; CHECK-LABEL: speculatable_callee_multi_use:
43; CHECK:       # %bb.0: # %entry
44; CHECK-NEXT:    mflr r0
45; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
46; CHECK-NEXT:    stdu r1, -48(r1)
47; CHECK-NEXT:    std r0, 64(r1)
48; CHECK-NEXT:    mr r30, r3
49; CHECK-NEXT:    bl callee
50; CHECK-NEXT:    stfd f1, 0(r30)
51; CHECK-NEXT:    addi r1, r1, 48
52; CHECK-NEXT:    ld r0, 16(r1)
53; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
54; CHECK-NEXT:    mtlr r0
55; CHECK-NEXT:    blr
56  entry:
57  %call = tail call double @callee(double %a) #2
58  store double %call, ptr %res, align 8
59  ret double %call
60}
61
62; Callee should not be tail called since it is not at a tail call position.
63; FIXME: A speculatable callee can be tail called if it is moved into a valid tail call position.
64define dso_local double @speculatable_callee_intermediate_instructions (ptr nocapture %res, double %a) #0 {
65; CHECK-LABEL: speculatable_callee_intermediate_instructions:
66; CHECK:       # %bb.0: # %entry
67; CHECK-NEXT:    mflr r0
68; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
69; CHECK-NEXT:    stdu r1, -48(r1)
70; CHECK-NEXT:    std r0, 64(r1)
71; CHECK-NEXT:    mr r30, r3
72; CHECK-NEXT:    bl callee
73; CHECK-NEXT:    lis r3, 4101
74; CHECK-NEXT:    ori r3, r3, 13107
75; CHECK-NEXT:    rldic r3, r3, 34, 1
76; CHECK-NEXT:    oris r3, r3, 52428
77; CHECK-NEXT:    ori r3, r3, 52429
78; CHECK-NEXT:    std r3, 0(r30)
79; CHECK-NEXT:    addi r1, r1, 48
80; CHECK-NEXT:    ld r0, 16(r1)
81; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
82; CHECK-NEXT:    mtlr r0
83; CHECK-NEXT:    blr
84
85  entry:
86  %call = tail call double @callee(double %a) #2
87  store double 5.2, ptr %res, align 8
88  ret double %call
89}
90
91
92define dso_local double @callee(double) #1 {
93; CHECK-LABEL: callee:
94; CHECK:       # %bb.0:
95; CHECK-NEXT:    addis r3, r2, .LCPI4_0@toc@ha
96; CHECK-NEXT:    lfs f1, .LCPI4_0@toc@l(r3)
97; CHECK-NEXT:    blr
98  ret double 4.5
99}
100
101attributes #0 = { nounwind }
102attributes #1 = { readnone speculatable }
103attributes #2 = { nounwind noinline }
104