xref: /llvm-project/llvm/test/CodeGen/PowerPC/pr55463.ll (revision c42f0a6e6476971974cb3f52c1138dbd8f9cca1f)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=powerpcspe -verify-machineinstrs < %s | FileCheck %s
3
4define void @baz() #0 {
5; CHECK-LABEL: baz:
6; CHECK:       # %bb.0: # %bb
7; CHECK-NEXT:    mflr 0
8; CHECK-NEXT:    stwu 1, -16(1)
9; CHECK-NEXT:    stw 0, 20(1)
10; CHECK-NEXT:    mtctr 3
11; CHECK-NEXT:    .p2align 4
12; CHECK-NEXT:  .LBB0_1: # %bb1
13; CHECK-NEXT:    #
14; CHECK-NEXT:    bdnz .LBB0_1
15; CHECK-NEXT:  # %bb.2: # %bb8
16; CHECK-NEXT:    bl wibble
17; CHECK-NEXT:    lwz 0, 20(1)
18; CHECK-NEXT:    addi 1, 1, 16
19; CHECK-NEXT:    mtlr 0
20; CHECK-NEXT:    blr
21bb:
22  br label %bb1
23
24bb1:
25  %tmp = phi i32 [ %tmp6, %bb1 ], [ undef, %bb ]
26  %tmp2 = phi i32 [ %tmp3, %bb1 ], [ undef, %bb ]
27  %tmp3 = add nsw i32 %tmp2, 1
28  %tmp4 = sitofp i32 %tmp to double
29  %tmp5 = tail call double @llvm.fmuladd.f64(double 0.000000e+00, double -0.000000e+00, double %tmp4)
30  %tmp6 = fptosi double %tmp5 to i32
31  %tmp7 = icmp eq i32 %tmp2, 0
32  br i1 %tmp7, label %bb8, label %bb1
33
34bb8:
35  call void @wibble(i32 %tmp6)
36  ret void
37}
38
39define void @wombat() #0 {
40; CHECK-LABEL: wombat:
41; CHECK:       # %bb.0: # %bb
42; CHECK-NEXT:    mflr 0
43; CHECK-NEXT:    stwu 1, -48(1)
44; CHECK-NEXT:    li 3, .LCPI1_0@l
45; CHECK-NEXT:    li 5, .LCPI1_1@l
46; CHECK-NEXT:    lis 4, .LCPI1_0@ha
47; CHECK-NEXT:    lis 6, .LCPI1_1@ha
48; CHECK-NEXT:    stw 0, 52(1)
49; CHECK-NEXT:    evstdd 29, 8(1) # 8-byte Folded Spill
50; CHECK-NEXT:    evstdd 30, 16(1) # 8-byte Folded Spill
51; CHECK-NEXT:    evlddx 30, 4, 3
52; CHECK-NEXT:    # implicit-def: $r3
53; CHECK-NEXT:    evlddx 29, 6, 5
54; CHECK-NEXT:    stw 28, 32(1) # 4-byte Folded Spill
55; CHECK-NEXT:    # implicit-def: $r28
56; CHECK-NEXT:    .p2align 4
57; CHECK-NEXT:  .LBB1_1: # %bb1
58; CHECK-NEXT:    #
59; CHECK-NEXT:    efdcfsi 8, 3
60; CHECK-NEXT:    evmergehi 3, 30, 30
61; CHECK-NEXT:    evmergehi 5, 29, 29
62; CHECK-NEXT:    mr 4, 30
63; CHECK-NEXT:    mr 6, 29
64; CHECK-NEXT:    evmergehi 7, 8, 8
65; CHECK-NEXT:    bl fma
66; CHECK-NEXT:    evmergelo 3, 3, 4
67; CHECK-NEXT:    addi 28, 28, -1
68; CHECK-NEXT:    cmplwi 28, 0
69; CHECK-NEXT:    efdctsiz 3, 3
70; CHECK-NEXT:    bc 12, 1, .LBB1_1
71; CHECK-NEXT:  # %bb.2: # %bb8
72; CHECK-NEXT:    bl wibble
73; CHECK-NEXT:    evldd 30, 16(1) # 8-byte Folded Reload
74; CHECK-NEXT:    evldd 29, 8(1) # 8-byte Folded Reload
75; CHECK-NEXT:    lwz 28, 32(1) # 4-byte Folded Reload
76; CHECK-NEXT:    lwz 0, 52(1)
77; CHECK-NEXT:    addi 1, 1, 48
78; CHECK-NEXT:    mtlr 0
79; CHECK-NEXT:    blr
80bb:
81  br label %bb1
82
83bb1:
84  %tmp = phi i32 [ %tmp6, %bb1 ], [ undef, %bb ]
85  %tmp2 = phi i32 [ %tmp3, %bb1 ], [ undef, %bb ]
86  %tmp3 = add nsw i32 %tmp2, 1
87  %tmp4 = sitofp i32 %tmp to double
88  %tmp5 = tail call double @llvm.fma.f64(double 0.000000e+00, double -0.000000e+00, double %tmp4)
89  %tmp6 = fptosi double %tmp5 to i32
90  %tmp7 = icmp eq i32 %tmp2, 0
91  br i1 %tmp7, label %bb8, label %bb1
92
93bb8:
94  call void @wibble(i32 %tmp6)
95  ret void
96}
97
98declare void @wibble(i32)
99declare double @llvm.fmuladd.f64(double, double, double)
100declare double @llvm.fma.f64(double, double, double)
101
102attributes #0 = { nounwind }
103