xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/fma-combine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs -fp-contract=fast < %s | FileCheck -check-prefix=SI-FASTFMAF -check-prefix=SI -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs -fp-contract=fast < %s | FileCheck -check-prefix=SI-SLOWFMAF -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #0
5*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double) #0
6*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) #0
7*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float) #0
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; (fadd (fmul x, y), z) -> (fma x, y, z)
10*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_f64_0:
11*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
12*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
13*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
14*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[C]]
15*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
16*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_f64_0(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
17*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
18*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
19*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
20*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
21*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
24*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
25*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
28*9880d681SAndroid Build Coastguard Worker  %fma = fadd double %mul, %c
29*9880d681SAndroid Build Coastguard Worker  store double %fma, double addrspace(1)* %gep.out
30*9880d681SAndroid Build Coastguard Worker  ret void
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; (fadd (fmul x, y), z) -> (fma x, y, z)
34*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_f64_0_2use:
35*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
36*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
37*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
38*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[D:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}}
39*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[C]]
40*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[D]]
41*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
42*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
43*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
44*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_f64_0_2use(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
45*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
46*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
47*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
48*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
49*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
50*9880d681SAndroid Build Coastguard Worker  %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid
51*9880d681SAndroid Build Coastguard Worker  %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
54*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
55*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
56*9880d681SAndroid Build Coastguard Worker  %d = load volatile double, double addrspace(1)* %gep.3
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
59*9880d681SAndroid Build Coastguard Worker  %fma0 = fadd double %mul, %c
60*9880d681SAndroid Build Coastguard Worker  %fma1 = fadd double %mul, %d
61*9880d681SAndroid Build Coastguard Worker  store volatile double %fma0, double addrspace(1)* %gep.out.0
62*9880d681SAndroid Build Coastguard Worker  store volatile double %fma1, double addrspace(1)* %gep.out.1
63*9880d681SAndroid Build Coastguard Worker  ret void
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; (fadd x, (fmul y, z)) -> (fma y, z, x)
67*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_f64_1:
68*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
69*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
70*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
71*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[C]]
72*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
73*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_f64_1(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
74*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
75*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
76*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
77*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
78*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
81*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
82*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
85*9880d681SAndroid Build Coastguard Worker  %fma = fadd double %c, %mul
86*9880d681SAndroid Build Coastguard Worker  store double %fma, double addrspace(1)* %gep.out
87*9880d681SAndroid Build Coastguard Worker  ret void
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; (fsub (fmul x, y), z) -> (fma x, y, (fneg z))
91*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_0_f64:
92*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
93*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
94*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
95*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[C]]
96*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
97*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_0_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
98*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
99*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
100*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
101*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
102*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
105*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
106*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
109*9880d681SAndroid Build Coastguard Worker  %fma = fsub double %mul, %c
110*9880d681SAndroid Build Coastguard Worker  store double %fma, double addrspace(1)* %gep.out
111*9880d681SAndroid Build Coastguard Worker  ret void
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; (fsub (fmul x, y), z) -> (fma x, y, (fneg z))
115*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_f64_0_2use:
116*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
117*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
118*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
119*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[D:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}}
120*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[C]]
121*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[D]]
122*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
123*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
124*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
125*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_f64_0_2use(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
126*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
127*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
128*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
129*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
130*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
131*9880d681SAndroid Build Coastguard Worker  %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid
132*9880d681SAndroid Build Coastguard Worker  %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
135*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
136*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
137*9880d681SAndroid Build Coastguard Worker  %d = load volatile double, double addrspace(1)* %gep.3
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
140*9880d681SAndroid Build Coastguard Worker  %fma0 = fsub double %mul, %c
141*9880d681SAndroid Build Coastguard Worker  %fma1 = fsub double %mul, %d
142*9880d681SAndroid Build Coastguard Worker  store volatile double %fma0, double addrspace(1)* %gep.out.0
143*9880d681SAndroid Build Coastguard Worker  store volatile double %fma1, double addrspace(1)* %gep.out.1
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; (fsub x, (fmul y, z)) -> (fma (fneg y), z, x)
148*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_1_f64:
149*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
150*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
151*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
152*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], [[C]]
153*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
154*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_1_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
155*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
156*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
157*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
158*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
159*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
162*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
163*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
166*9880d681SAndroid Build Coastguard Worker  %fma = fsub double %c, %mul
167*9880d681SAndroid Build Coastguard Worker  store double %fma, double addrspace(1)* %gep.out
168*9880d681SAndroid Build Coastguard Worker  ret void
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker; (fsub x, (fmul y, z)) -> (fma (fneg y), z, x)
172*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_1_f64_2use:
173*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
174*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
175*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
176*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[D:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}}
177*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], [[C]]
178*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], [[D]]
179*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
180*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
181*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
182*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_1_f64_2use(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
183*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
184*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
185*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
186*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
187*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
188*9880d681SAndroid Build Coastguard Worker  %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid
189*9880d681SAndroid Build Coastguard Worker  %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
192*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
193*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
194*9880d681SAndroid Build Coastguard Worker  %d = load volatile double, double addrspace(1)* %gep.3
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
197*9880d681SAndroid Build Coastguard Worker  %fma0 = fsub double %c, %mul
198*9880d681SAndroid Build Coastguard Worker  %fma1 = fsub double %d, %mul
199*9880d681SAndroid Build Coastguard Worker  store volatile double %fma0, double addrspace(1)* %gep.out.0
200*9880d681SAndroid Build Coastguard Worker  store volatile double %fma1, double addrspace(1)* %gep.out.1
201*9880d681SAndroid Build Coastguard Worker  ret void
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z))
205*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_2_f64:
206*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
207*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
208*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
209*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[C]]
210*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
211*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_2_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
212*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
213*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
214*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
215*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
216*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
219*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
220*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
223*9880d681SAndroid Build Coastguard Worker  %mul.neg = fsub double -0.0, %mul
224*9880d681SAndroid Build Coastguard Worker  %fma = fsub double %mul.neg, %c
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker  store double %fma, double addrspace(1)* %gep.out
227*9880d681SAndroid Build Coastguard Worker  ret void
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z))
231*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_2_f64_2uses_neg:
232*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
233*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
234*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
235*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[C]]
236*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[D]]
237*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
238*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
239*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
240*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_2_f64_2uses_neg(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
241*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
242*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
243*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
244*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
245*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
246*9880d681SAndroid Build Coastguard Worker  %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid
247*9880d681SAndroid Build Coastguard Worker  %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
250*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
251*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
252*9880d681SAndroid Build Coastguard Worker  %d = load volatile double, double addrspace(1)* %gep.3
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
255*9880d681SAndroid Build Coastguard Worker  %mul.neg = fsub double -0.0, %mul
256*9880d681SAndroid Build Coastguard Worker  %fma0 = fsub double %mul.neg, %c
257*9880d681SAndroid Build Coastguard Worker  %fma1 = fsub double %mul.neg, %d
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker  store volatile double %fma0, double addrspace(1)* %gep.out.0
260*9880d681SAndroid Build Coastguard Worker  store volatile double %fma1, double addrspace(1)* %gep.out.1
261*9880d681SAndroid Build Coastguard Worker  ret void
262*9880d681SAndroid Build Coastguard Worker}
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z))
265*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_2_f64_2uses_mul:
266*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
267*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
268*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
269*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[C]]
270*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[D]]
271*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
272*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
273*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
274*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_2_f64_2uses_mul(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
275*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
276*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
277*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
278*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
279*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
280*9880d681SAndroid Build Coastguard Worker  %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid
281*9880d681SAndroid Build Coastguard Worker  %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0
284*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1
285*9880d681SAndroid Build Coastguard Worker  %c = load volatile double, double addrspace(1)* %gep.2
286*9880d681SAndroid Build Coastguard Worker  %d = load volatile double, double addrspace(1)* %gep.3
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %a, %b
289*9880d681SAndroid Build Coastguard Worker  %mul.neg = fsub double -0.0, %mul
290*9880d681SAndroid Build Coastguard Worker  %fma0 = fsub double %mul.neg, %c
291*9880d681SAndroid Build Coastguard Worker  %fma1 = fsub double %mul, %d
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker  store volatile double %fma0, double addrspace(1)* %gep.out.0
294*9880d681SAndroid Build Coastguard Worker  store volatile double %fma1, double addrspace(1)* %gep.out.1
295*9880d681SAndroid Build Coastguard Worker  ret void
296*9880d681SAndroid Build Coastguard Worker}
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker; fold (fsub (fma x, y, (fmul u, v)), z) -> (fma x, y (fma u, v, (fneg z)))
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}aggressive_combine_to_fma_fsub_0_f64:
301*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[X:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
302*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Y:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
303*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Z:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
304*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[U:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}}
305*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[V:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:32{{$}}
306*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[FMA0:v\[[0-9]+:[0-9]+\]]], [[U]], [[V]], -[[Z]]
307*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[X]], [[Y]], [[FMA0]]
308*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
309*9880d681SAndroid Build Coastguard Workerdefine void @aggressive_combine_to_fma_fsub_0_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
310*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
311*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
312*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
313*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
314*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
315*9880d681SAndroid Build Coastguard Worker  %gep.4 = getelementptr double, double addrspace(1)* %gep.0, i32 4
316*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker  %x = load volatile double, double addrspace(1)* %gep.0
319*9880d681SAndroid Build Coastguard Worker  %y = load volatile double, double addrspace(1)* %gep.1
320*9880d681SAndroid Build Coastguard Worker  %z = load volatile double, double addrspace(1)* %gep.2
321*9880d681SAndroid Build Coastguard Worker  %u = load volatile double, double addrspace(1)* %gep.3
322*9880d681SAndroid Build Coastguard Worker  %v = load volatile double, double addrspace(1)* %gep.4
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker  %tmp0 = fmul double %u, %v
325*9880d681SAndroid Build Coastguard Worker  %tmp1 = call double @llvm.fma.f64(double %x, double %y, double %tmp0) #0
326*9880d681SAndroid Build Coastguard Worker  %tmp2 = fsub double %tmp1, %z
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker  store double %tmp2, double addrspace(1)* %gep.out
329*9880d681SAndroid Build Coastguard Worker  ret void
330*9880d681SAndroid Build Coastguard Worker}
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker; fold (fsub x, (fma y, z, (fmul u, v)))
333*9880d681SAndroid Build Coastguard Worker;   -> (fma (fneg y), z, (fma (fneg u), v, x))
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}aggressive_combine_to_fma_fsub_1_f64:
336*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[X:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
337*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Y:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
338*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Z:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}}
339*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[U:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}}
340*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[V:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:32{{$}}
341*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[FMA0:v\[[0-9]+:[0-9]+\]]], -[[U]], [[V]], [[X]]
342*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], -[[Y]], [[Z]], [[FMA0]]
343*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]]
344*9880d681SAndroid Build Coastguard Workerdefine void @aggressive_combine_to_fma_fsub_1_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 {
345*9880d681SAndroid Build Coastguard Worker  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
346*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
347*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
348*9880d681SAndroid Build Coastguard Worker  %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2
349*9880d681SAndroid Build Coastguard Worker  %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3
350*9880d681SAndroid Build Coastguard Worker  %gep.4 = getelementptr double, double addrspace(1)* %gep.0, i32 4
351*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker  %x = load volatile double, double addrspace(1)* %gep.0
354*9880d681SAndroid Build Coastguard Worker  %y = load volatile double, double addrspace(1)* %gep.1
355*9880d681SAndroid Build Coastguard Worker  %z = load volatile double, double addrspace(1)* %gep.2
356*9880d681SAndroid Build Coastguard Worker  %u = load volatile double, double addrspace(1)* %gep.3
357*9880d681SAndroid Build Coastguard Worker  %v = load volatile double, double addrspace(1)* %gep.4
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker  %tmp0 = fmul double %u, %v
360*9880d681SAndroid Build Coastguard Worker  %tmp1 = call double @llvm.fma.f64(double %y, double %z, double %tmp0) #0
361*9880d681SAndroid Build Coastguard Worker  %tmp2 = fsub double %x, %tmp1
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Worker  store double %tmp2, double addrspace(1)* %gep.out
364*9880d681SAndroid Build Coastguard Worker  ret void
365*9880d681SAndroid Build Coastguard Worker}
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker;
368*9880d681SAndroid Build Coastguard Worker; Patterns (+ fneg variants): mul(add(1.0,x),y), mul(sub(1.0,x),y), mul(sub(x,1.0),y)
369*9880d681SAndroid Build Coastguard Worker;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_add_x_one_y:
372*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY:v[0-9]]], [[VX:v[0-9]]]
373*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_add_x_one_y(float addrspace(1)* %out,
374*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in1,
375*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in2) {
376*9880d681SAndroid Build Coastguard Worker  %x = load volatile float, float addrspace(1)* %in1
377*9880d681SAndroid Build Coastguard Worker  %y = load volatile float, float addrspace(1)* %in2
378*9880d681SAndroid Build Coastguard Worker  %a = fadd float %x, 1.0
379*9880d681SAndroid Build Coastguard Worker  %m = fmul float %a, %y
380*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
381*9880d681SAndroid Build Coastguard Worker  ret void
382*9880d681SAndroid Build Coastguard Worker}
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_add_x_one:
385*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY:v[0-9]]], [[VX:v[0-9]]]
386*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_add_x_one(float addrspace(1)* %out,
387*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in1,
388*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in2) {
389*9880d681SAndroid Build Coastguard Worker  %x = load volatile float, float addrspace(1)* %in1
390*9880d681SAndroid Build Coastguard Worker  %y = load volatile float, float addrspace(1)* %in2
391*9880d681SAndroid Build Coastguard Worker  %a = fadd float %x, 1.0
392*9880d681SAndroid Build Coastguard Worker  %m = fmul float %y, %a
393*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
394*9880d681SAndroid Build Coastguard Worker  ret void
395*9880d681SAndroid Build Coastguard Worker}
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_add_x_negone_y:
398*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]]
399*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_add_x_negone_y(float addrspace(1)* %out,
400*9880d681SAndroid Build Coastguard Worker                                           float addrspace(1)* %in1,
401*9880d681SAndroid Build Coastguard Worker                                           float addrspace(1)* %in2) {
402*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
403*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
404*9880d681SAndroid Build Coastguard Worker  %a = fadd float %x, -1.0
405*9880d681SAndroid Build Coastguard Worker  %m = fmul float %a, %y
406*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
407*9880d681SAndroid Build Coastguard Worker  ret void
408*9880d681SAndroid Build Coastguard Worker}
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_add_x_negone:
411*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]]
412*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_add_x_negone(float addrspace(1)* %out,
413*9880d681SAndroid Build Coastguard Worker                                           float addrspace(1)* %in1,
414*9880d681SAndroid Build Coastguard Worker                                           float addrspace(1)* %in2) {
415*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
416*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
417*9880d681SAndroid Build Coastguard Worker  %a = fadd float %x, -1.0
418*9880d681SAndroid Build Coastguard Worker  %m = fmul float %y, %a
419*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
420*9880d681SAndroid Build Coastguard Worker  ret void
421*9880d681SAndroid Build Coastguard Worker}
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_one_x_y:
424*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], [[VY]]
425*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_one_x_y(float addrspace(1)* %out,
426*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in1,
427*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in2) {
428*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
429*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
430*9880d681SAndroid Build Coastguard Worker  %s = fsub float 1.0, %x
431*9880d681SAndroid Build Coastguard Worker  %m = fmul float %s, %y
432*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
433*9880d681SAndroid Build Coastguard Worker  ret void
434*9880d681SAndroid Build Coastguard Worker}
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_one_x:
437*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], [[VY]]
438*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_one_x(float addrspace(1)* %out,
439*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in1,
440*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in2) {
441*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
442*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
443*9880d681SAndroid Build Coastguard Worker  %s = fsub float 1.0, %x
444*9880d681SAndroid Build Coastguard Worker  %m = fmul float %y, %s
445*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
446*9880d681SAndroid Build Coastguard Worker  ret void
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_negone_x_y:
450*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], -[[VY]]
451*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_negone_x_y(float addrspace(1)* %out,
452*9880d681SAndroid Build Coastguard Worker                                           float addrspace(1)* %in1,
453*9880d681SAndroid Build Coastguard Worker                                           float addrspace(1)* %in2) {
454*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
455*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
456*9880d681SAndroid Build Coastguard Worker  %s = fsub float -1.0, %x
457*9880d681SAndroid Build Coastguard Worker  %m = fmul float %s, %y
458*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
459*9880d681SAndroid Build Coastguard Worker  ret void
460*9880d681SAndroid Build Coastguard Worker}
461*9880d681SAndroid Build Coastguard Worker
462*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_negone_x:
463*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], -[[VY]]
464*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_negone_x(float addrspace(1)* %out,
465*9880d681SAndroid Build Coastguard Worker                                         float addrspace(1)* %in1,
466*9880d681SAndroid Build Coastguard Worker                                         float addrspace(1)* %in2) {
467*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
468*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
469*9880d681SAndroid Build Coastguard Worker  %s = fsub float -1.0, %x
470*9880d681SAndroid Build Coastguard Worker  %m = fmul float %y, %s
471*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
472*9880d681SAndroid Build Coastguard Worker  ret void
473*9880d681SAndroid Build Coastguard Worker}
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_x_one_y:
476*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]]
477*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_x_one_y(float addrspace(1)* %out,
478*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in1,
479*9880d681SAndroid Build Coastguard Worker                                        float addrspace(1)* %in2) {
480*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
481*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
482*9880d681SAndroid Build Coastguard Worker  %s = fsub float %x, 1.0
483*9880d681SAndroid Build Coastguard Worker  %m = fmul float %s, %y
484*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
485*9880d681SAndroid Build Coastguard Worker  ret void
486*9880d681SAndroid Build Coastguard Worker}
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_x_one:
489*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]]
490*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_x_one(float addrspace(1)* %out,
491*9880d681SAndroid Build Coastguard Worker                                      float addrspace(1)* %in1,
492*9880d681SAndroid Build Coastguard Worker                                      float addrspace(1)* %in2) {
493*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
494*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
495*9880d681SAndroid Build Coastguard Worker  %s = fsub float %x, 1.0
496*9880d681SAndroid Build Coastguard Worker  %m = fmul float %y, %s
497*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
498*9880d681SAndroid Build Coastguard Worker  ret void
499*9880d681SAndroid Build Coastguard Worker}
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_x_negone_y:
502*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY]], [[VX:v[0-9]]]
503*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_x_negone_y(float addrspace(1)* %out,
504*9880d681SAndroid Build Coastguard Worker                                         float addrspace(1)* %in1,
505*9880d681SAndroid Build Coastguard Worker                                         float addrspace(1)* %in2) {
506*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
507*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
508*9880d681SAndroid Build Coastguard Worker  %s = fsub float %x, -1.0
509*9880d681SAndroid Build Coastguard Worker  %m = fmul float %s, %y
510*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
511*9880d681SAndroid Build Coastguard Worker  ret void
512*9880d681SAndroid Build Coastguard Worker}
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_x_negone:
515*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY]], [[VX:v[0-9]]]
516*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_x_negone(float addrspace(1)* %out,
517*9880d681SAndroid Build Coastguard Worker                                         float addrspace(1)* %in1,
518*9880d681SAndroid Build Coastguard Worker                                         float addrspace(1)* %in2) {
519*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
520*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
521*9880d681SAndroid Build Coastguard Worker  %s = fsub float %x, -1.0
522*9880d681SAndroid Build Coastguard Worker  %m = fmul float %y, %s
523*9880d681SAndroid Build Coastguard Worker  store float %m, float addrspace(1)* %out
524*9880d681SAndroid Build Coastguard Worker  ret void
525*9880d681SAndroid Build Coastguard Worker}
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker;
528*9880d681SAndroid Build Coastguard Worker; Interpolation Patterns: add(mul(x,t),mul(sub(1.0,t),y))
529*9880d681SAndroid Build Coastguard Worker;
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_interp:
532*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VR:v[0-9]]], -[[VT:v[0-9]]], [[VY:v[0-9]]], [[VY]]
533*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VR]], [[VT]], [[VX:v[0-9]]]
534*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_interp(float addrspace(1)* %out,
535*9880d681SAndroid Build Coastguard Worker                             float addrspace(1)* %in1,
536*9880d681SAndroid Build Coastguard Worker                             float addrspace(1)* %in2,
537*9880d681SAndroid Build Coastguard Worker                             float addrspace(1)* %in3) {
538*9880d681SAndroid Build Coastguard Worker  %x = load float, float addrspace(1)* %in1
539*9880d681SAndroid Build Coastguard Worker  %y = load float, float addrspace(1)* %in2
540*9880d681SAndroid Build Coastguard Worker  %t = load float, float addrspace(1)* %in3
541*9880d681SAndroid Build Coastguard Worker  %t1 = fsub float 1.0, %t
542*9880d681SAndroid Build Coastguard Worker  %tx = fmul float %x, %t
543*9880d681SAndroid Build Coastguard Worker  %ty = fmul float %y, %t1
544*9880d681SAndroid Build Coastguard Worker  %r = fadd float %tx, %ty
545*9880d681SAndroid Build Coastguard Worker  store float %r, float addrspace(1)* %out
546*9880d681SAndroid Build Coastguard Worker  ret void
547*9880d681SAndroid Build Coastguard Worker}
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f64_interp:
550*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[VR:v\[[0-9]+:[0-9]+\]]], -[[VT:v\[[0-9]+:[0-9]+\]]], [[VY:v\[[0-9]+:[0-9]+\]]], [[VY]]
551*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[VR:v\[[0-9]+:[0-9]+\]]], [[VX:v\[[0-9]+:[0-9]+\]]], [[VT]], [[VR]]
552*9880d681SAndroid Build Coastguard Workerdefine void @test_f64_interp(double addrspace(1)* %out,
553*9880d681SAndroid Build Coastguard Worker                             double addrspace(1)* %in1,
554*9880d681SAndroid Build Coastguard Worker                             double addrspace(1)* %in2,
555*9880d681SAndroid Build Coastguard Worker                             double addrspace(1)* %in3) {
556*9880d681SAndroid Build Coastguard Worker  %x = load double, double addrspace(1)* %in1
557*9880d681SAndroid Build Coastguard Worker  %y = load double, double addrspace(1)* %in2
558*9880d681SAndroid Build Coastguard Worker  %t = load double, double addrspace(1)* %in3
559*9880d681SAndroid Build Coastguard Worker  %t1 = fsub double 1.0, %t
560*9880d681SAndroid Build Coastguard Worker  %tx = fmul double %x, %t
561*9880d681SAndroid Build Coastguard Worker  %ty = fmul double %y, %t1
562*9880d681SAndroid Build Coastguard Worker  %r = fadd double %tx, %ty
563*9880d681SAndroid Build Coastguard Worker  store double %r, double addrspace(1)* %out
564*9880d681SAndroid Build Coastguard Worker  ret void
565*9880d681SAndroid Build Coastguard Worker}
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
568*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }
569