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:    stw 0, 4(1)
9; CHECK-NEXT:    stwu 1, -48(1)
10; CHECK-NEXT:    li 3, .LCPI0_0@l
11; CHECK-NEXT:    li 5, .LCPI0_1@l
12; CHECK-NEXT:    lis 4, .LCPI0_0@ha
13; CHECK-NEXT:    lis 6, .LCPI0_1@ha
14; CHECK-NEXT:    evstdd 29, 24(1) # 8-byte Folded Spill
15; CHECK-NEXT:    evstdd 30, 32(1) # 8-byte Folded Spill
16; CHECK-NEXT:    evlddx 30, 4, 3
17; CHECK-NEXT:    # implicit-def: $r3
18; CHECK-NEXT:    evlddx 29, 6, 5
19; CHECK-NEXT:    evstdd 28, 16(1) # 8-byte Folded Spill
20; CHECK-NEXT:    # implicit-def: $r28
21; CHECK-NEXT:    .p2align 4
22; CHECK-NEXT:  .LBB0_1: # %bb1
23; CHECK-NEXT:    #
24; CHECK-NEXT:    efdcfsi 8, 3
25; CHECK-NEXT:    mr 4, 30
26; CHECK-NEXT:    mr 6, 29
27; CHECK-NEXT:    evmergehi 3, 30, 30
28; CHECK-NEXT:    evmergehi 5, 29, 29
29; CHECK-NEXT:    # kill: def $r3 killed $r3 killed $s3
30; CHECK-NEXT:    # kill: def $r5 killed $r5 killed $s5
31; CHECK-NEXT:    evmergehi 7, 8, 8
32; CHECK-NEXT:    # kill: def $r8 killed $r8 killed $s8
33; CHECK-NEXT:    # kill: def $r7 killed $r7 killed $s7
34; CHECK-NEXT:    bl fma
35; CHECK-NEXT:    evmergelo 3, 3, 4
36; CHECK-NEXT:    addi 28, 28, 1
37; CHECK-NEXT:    cmplwi 28, 0
38; CHECK-NEXT:    efdctsiz 3, 3
39; CHECK-NEXT:    bne 0, .LBB0_1
40; CHECK-NEXT:  # %bb.2: # %bb8
41; CHECK-NEXT:    bl wibble
42; CHECK-NEXT:    evldd 30, 32(1) # 8-byte Folded Reload
43; CHECK-NEXT:    evldd 29, 24(1) # 8-byte Folded Reload
44; CHECK-NEXT:    evldd 28, 16(1) # 8-byte Folded Reload
45; CHECK-NEXT:    lwz 0, 52(1)
46; CHECK-NEXT:    addi 1, 1, 48
47; CHECK-NEXT:    mtlr 0
48; CHECK-NEXT:    blr
49bb:
50  br label %bb1
51
52bb1:
53  %tmp = phi i32 [ %tmp6, %bb1 ], [ undef, %bb ]
54  %tmp2 = phi i32 [ %tmp3, %bb1 ], [ undef, %bb ]
55  %tmp3 = add nsw i32 %tmp2, 1
56  %tmp4 = sitofp i32 %tmp to double
57  %tmp5 = tail call double @llvm.fmuladd.f64(double 0.000000e+00, double -0.000000e+00, double %tmp4)
58  %tmp6 = fptosi double %tmp5 to i32
59  %tmp7 = icmp eq i32 %tmp2, 0
60  br i1 %tmp7, label %bb8, label %bb1
61
62bb8:
63  call void @wibble(i32 %tmp6)
64  ret void
65}
66
67define void @wombat() #0 {
68; CHECK-LABEL: wombat:
69; CHECK:       # %bb.0: # %bb
70; CHECK-NEXT:    mflr 0
71; CHECK-NEXT:    stw 0, 4(1)
72; CHECK-NEXT:    stwu 1, -48(1)
73; CHECK-NEXT:    li 3, .LCPI1_0@l
74; CHECK-NEXT:    li 5, .LCPI1_1@l
75; CHECK-NEXT:    lis 4, .LCPI1_0@ha
76; CHECK-NEXT:    lis 6, .LCPI1_1@ha
77; CHECK-NEXT:    evstdd 29, 24(1) # 8-byte Folded Spill
78; CHECK-NEXT:    evstdd 30, 32(1) # 8-byte Folded Spill
79; CHECK-NEXT:    evlddx 30, 4, 3
80; CHECK-NEXT:    # implicit-def: $r3
81; CHECK-NEXT:    evlddx 29, 6, 5
82; CHECK-NEXT:    evstdd 28, 16(1) # 8-byte Folded Spill
83; CHECK-NEXT:    # implicit-def: $r28
84; CHECK-NEXT:    .p2align 4
85; CHECK-NEXT:  .LBB1_1: # %bb1
86; CHECK-NEXT:    #
87; CHECK-NEXT:    efdcfsi 8, 3
88; CHECK-NEXT:    mr 4, 30
89; CHECK-NEXT:    mr 6, 29
90; CHECK-NEXT:    evmergehi 3, 30, 30
91; CHECK-NEXT:    evmergehi 5, 29, 29
92; CHECK-NEXT:    # kill: def $r3 killed $r3 killed $s3
93; CHECK-NEXT:    # kill: def $r5 killed $r5 killed $s5
94; CHECK-NEXT:    evmergehi 7, 8, 8
95; CHECK-NEXT:    # kill: def $r8 killed $r8 killed $s8
96; CHECK-NEXT:    # kill: def $r7 killed $r7 killed $s7
97; CHECK-NEXT:    bl fma
98; CHECK-NEXT:    evmergelo 3, 3, 4
99; CHECK-NEXT:    addi 28, 28, 1
100; CHECK-NEXT:    cmplwi 28, 0
101; CHECK-NEXT:    efdctsiz 3, 3
102; CHECK-NEXT:    bne 0, .LBB1_1
103; CHECK-NEXT:  # %bb.2: # %bb8
104; CHECK-NEXT:    bl wibble
105; CHECK-NEXT:    evldd 30, 32(1) # 8-byte Folded Reload
106; CHECK-NEXT:    evldd 29, 24(1) # 8-byte Folded Reload
107; CHECK-NEXT:    evldd 28, 16(1) # 8-byte Folded Reload
108; CHECK-NEXT:    lwz 0, 52(1)
109; CHECK-NEXT:    addi 1, 1, 48
110; CHECK-NEXT:    mtlr 0
111; CHECK-NEXT:    blr
112bb:
113  br label %bb1
114
115bb1:
116  %tmp = phi i32 [ %tmp6, %bb1 ], [ undef, %bb ]
117  %tmp2 = phi i32 [ %tmp3, %bb1 ], [ undef, %bb ]
118  %tmp3 = add nsw i32 %tmp2, 1
119  %tmp4 = sitofp i32 %tmp to double
120  %tmp5 = tail call double @llvm.fma.f64(double 0.000000e+00, double -0.000000e+00, double %tmp4)
121  %tmp6 = fptosi double %tmp5 to i32
122  %tmp7 = icmp eq i32 %tmp2, 0
123  br i1 %tmp7, label %bb8, label %bb1
124
125bb8:
126  call void @wibble(i32 %tmp6)
127  ret void
128}
129
130declare void @wibble(i32)
131declare double @llvm.fmuladd.f64(double, double, double)
132declare double @llvm.fma.f64(double, double, double)
133
134attributes #0 = { nounwind }
135