[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / tailcall-speculatable-callee.ll
blob3c0082c8769c27529974b9bbc0e10991138f6a70
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
5 ; The tests check the behavior of the tail call decision when the callee is speculatable.
7 ; Callee should be tail called in this function since it is at a tail call position.
8 define 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
13 entry:
14   %value = tail call double @callee(double %a) #2
15   ret double %value
18 ; Callee should not be tail called since it is not at a tail call position.
19 define 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
34 entry:
35   %call = tail call double @callee(double %a) #2
36   store double %call, ptr %res, align 8
37   ret void
40 ; Callee should not be tail called since it is not at a tail call position.
41 define 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
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.
64 define 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
85   entry:
86   %call = tail call double @callee(double %a) #2
87   store double 5.2, ptr %res, align 8
88   ret double %call
92 define 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
101 attributes #0 = { nounwind }
102 attributes #1 = { readnone speculatable }
103 attributes #2 = { nounwind noinline }