xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/machine-combiner.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=sse -enable-unsafe-fp-math < %s | FileCheck %s --check-prefix=SSE
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=avx -enable-unsafe-fp-math < %s | FileCheck %s --check-prefix=AVX
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Verify that the first two adds are independent regardless of how the inputs are
5*9880d681SAndroid Build Coastguard Worker; commuted. The destination registers are used as source registers for the third add.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds1(float %x0, float %x1, float %x2, float %x3) {
8*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds1:
9*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
10*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
11*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm3, %xmm2
12*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm2, %xmm0
13*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds1:
16*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
17*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
18*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm3, %xmm2, %xmm1
19*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
20*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
21*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
22*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
23*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
24*9880d681SAndroid Build Coastguard Worker  ret float %t2
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds2(float %x0, float %x1, float %x2, float %x3) {
28*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds2:
29*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
30*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
31*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm3, %xmm2
32*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm2, %xmm0
33*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
34*9880d681SAndroid Build Coastguard Worker;
35*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds2:
36*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
37*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
38*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm3, %xmm2, %xmm1
39*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
40*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
41*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
42*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
43*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
44*9880d681SAndroid Build Coastguard Worker  ret float %t2
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds3(float %x0, float %x1, float %x2, float %x3) {
48*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds3:
49*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
50*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
51*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm3, %xmm2
52*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm2, %xmm0
53*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
54*9880d681SAndroid Build Coastguard Worker;
55*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds3:
56*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
57*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
58*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm3, %xmm2, %xmm1
59*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
60*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
61*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
62*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
63*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
64*9880d681SAndroid Build Coastguard Worker  ret float %t2
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds4(float %x0, float %x1, float %x2, float %x3) {
68*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds4:
69*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
70*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
71*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm3, %xmm2
72*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm2, %xmm0
73*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
74*9880d681SAndroid Build Coastguard Worker;
75*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds4:
76*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
77*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
78*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm3, %xmm2, %xmm1
79*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
80*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
81*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
82*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
83*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
84*9880d681SAndroid Build Coastguard Worker  ret float %t2
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; Verify that we reassociate some of these ops. The optimal balanced tree of adds is not
88*9880d681SAndroid Build Coastguard Worker; produced because that would cost more compile time.
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds5(float %x0, float %x1, float %x2, float %x3, float %x4, float %x5, float %x6, float %x7) {
91*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds5:
92*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
93*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
94*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm3, %xmm2
95*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm2, %xmm0
96*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm5, %xmm4
97*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm6, %xmm4
98*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm4, %xmm0
99*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm7, %xmm0
100*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
101*9880d681SAndroid Build Coastguard Worker;
102*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds5:
103*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
104*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
105*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm3, %xmm2, %xmm1
106*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
107*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm5, %xmm4, %xmm1
108*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm6, %xmm1, %xmm1
109*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
110*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm7, %xmm0, %xmm0
111*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
112*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
113*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
114*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
115*9880d681SAndroid Build Coastguard Worker  %t3 = fadd float %t2, %x4
116*9880d681SAndroid Build Coastguard Worker  %t4 = fadd float %t3, %x5
117*9880d681SAndroid Build Coastguard Worker  %t5 = fadd float %t4, %x6
118*9880d681SAndroid Build Coastguard Worker  %t6 = fadd float %t5, %x7
119*9880d681SAndroid Build Coastguard Worker  ret float %t6
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; Verify that we only need two associative operations to reassociate the operands.
123*9880d681SAndroid Build Coastguard Worker; Also, we should reassociate such that the result of the high latency division
124*9880d681SAndroid Build Coastguard Worker; is used by the final 'add' rather than reassociating the %x3 operand with the
125*9880d681SAndroid Build Coastguard Worker; division. The latter reassociation would not improve anything.
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds6(float %x0, float %x1, float %x2, float %x3) {
128*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds6:
129*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
130*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
131*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm3, %xmm2
132*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm2, %xmm0
133*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
134*9880d681SAndroid Build Coastguard Worker;
135*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds6:
136*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
137*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
138*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm3, %xmm2, %xmm1
139*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
140*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
141*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
142*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
143*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
144*9880d681SAndroid Build Coastguard Worker  ret float %t2
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar single-precision multiplies are reassociated.
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_muls1(float %x0, float %x1, float %x2, float %x3) {
150*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_muls1:
151*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
152*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
153*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm3, %xmm2
154*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm2, %xmm0
155*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
156*9880d681SAndroid Build Coastguard Worker;
157*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_muls1:
158*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
159*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
160*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm3, %xmm2, %xmm1
161*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
162*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
163*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
164*9880d681SAndroid Build Coastguard Worker  %t1 = fmul float %x2, %t0
165*9880d681SAndroid Build Coastguard Worker  %t2 = fmul float %x3, %t1
166*9880d681SAndroid Build Coastguard Worker  ret float %t2
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar double-precision adds are reassociated.
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_adds_double(double %x0, double %x1, double %x2, double %x3) {
172*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds_double:
173*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
174*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
175*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm3, %xmm2
176*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm2, %xmm0
177*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
178*9880d681SAndroid Build Coastguard Worker;
179*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds_double:
180*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
181*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
182*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm3, %xmm2, %xmm1
183*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
184*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
185*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
186*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %x2, %t0
187*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %x3, %t1
188*9880d681SAndroid Build Coastguard Worker  ret double %t2
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar double-precision multiplies are reassociated.
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_muls_double(double %x0, double %x1, double %x2, double %x3) {
194*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_muls_double:
195*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
196*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
197*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm3, %xmm2
198*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm2, %xmm0
199*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
200*9880d681SAndroid Build Coastguard Worker;
201*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_muls_double:
202*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
203*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
204*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm3, %xmm2, %xmm1
205*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
206*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
207*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
208*9880d681SAndroid Build Coastguard Worker  %t1 = fmul double %x2, %t0
209*9880d681SAndroid Build Coastguard Worker  %t2 = fmul double %x3, %t1
210*9880d681SAndroid Build Coastguard Worker  ret double %t2
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector single-precision adds are reassociated.
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @reassociate_adds_v4f32(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
216*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds_v4f32:
217*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
218*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulps %xmm1, %xmm0
219*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addps %xmm3, %xmm2
220*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addps %xmm2, %xmm0
221*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
222*9880d681SAndroid Build Coastguard Worker;
223*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds_v4f32:
224*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
225*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm0
226*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm3, %xmm2, %xmm1
227*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm0
228*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
229*9880d681SAndroid Build Coastguard Worker  %t0 = fmul <4 x float> %x0, %x1
230*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %x2, %t0
231*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %x3, %t1
232*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
233*9880d681SAndroid Build Coastguard Worker}
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector double-precision adds are reassociated.
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @reassociate_adds_v2f64(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, <2 x double> %x3) {
238*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_adds_v2f64:
239*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
240*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulpd %xmm1, %xmm0
241*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addpd %xmm3, %xmm2
242*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addpd %xmm2, %xmm0
243*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
244*9880d681SAndroid Build Coastguard Worker;
245*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds_v2f64:
246*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
247*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulpd %xmm1, %xmm0, %xmm0
248*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %xmm3, %xmm2, %xmm1
249*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
250*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
251*9880d681SAndroid Build Coastguard Worker  %t0 = fmul <2 x double> %x0, %x1
252*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <2 x double> %x2, %t0
253*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <2 x double> %x3, %t1
254*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %t2
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector single-precision multiplies are reassociated.
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @reassociate_muls_v4f32(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
260*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_muls_v4f32:
261*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
262*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addps %xmm1, %xmm0
263*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulps %xmm3, %xmm2
264*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulps %xmm2, %xmm0
265*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
266*9880d681SAndroid Build Coastguard Worker;
267*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_muls_v4f32:
268*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
269*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm0
270*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulps %xmm3, %xmm2, %xmm1
271*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm0
272*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
273*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
274*9880d681SAndroid Build Coastguard Worker  %t1 = fmul <4 x float> %x2, %t0
275*9880d681SAndroid Build Coastguard Worker  %t2 = fmul <4 x float> %x3, %t1
276*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
277*9880d681SAndroid Build Coastguard Worker}
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector double-precision multiplies are reassociated.
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @reassociate_muls_v2f64(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, <2 x double> %x3) {
282*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_muls_v2f64:
283*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
284*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addpd %xmm1, %xmm0
285*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulpd %xmm3, %xmm2
286*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulpd %xmm2, %xmm0
287*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
288*9880d681SAndroid Build Coastguard Worker;
289*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_muls_v2f64:
290*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
291*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
292*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulpd %xmm3, %xmm2, %xmm1
293*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulpd %xmm1, %xmm0, %xmm0
294*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
295*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <2 x double> %x0, %x1
296*9880d681SAndroid Build Coastguard Worker  %t1 = fmul <2 x double> %x2, %t0
297*9880d681SAndroid Build Coastguard Worker  %t2 = fmul <2 x double> %x3, %t1
298*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %t2
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector single-precision adds are reassociated.
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @reassociate_adds_v8f32(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, <8 x float> %x3) {
304*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds_v8f32:
305*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
306*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulps %ymm1, %ymm0, %ymm0
307*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %ymm3, %ymm2, %ymm1
308*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %ymm1, %ymm0, %ymm0
309*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
310*9880d681SAndroid Build Coastguard Worker  %t0 = fmul <8 x float> %x0, %x1
311*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <8 x float> %x2, %t0
312*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <8 x float> %x3, %t1
313*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %t2
314*9880d681SAndroid Build Coastguard Worker}
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector double-precision adds are reassociated.
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @reassociate_adds_v4f64(<4 x double> %x0, <4 x double> %x1, <4 x double> %x2, <4 x double> %x3) {
319*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds_v4f64:
320*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
321*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulpd %ymm1, %ymm0, %ymm0
322*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %ymm3, %ymm2, %ymm1
323*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
324*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
325*9880d681SAndroid Build Coastguard Worker  %t0 = fmul <4 x double> %x0, %x1
326*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x double> %x2, %t0
327*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x double> %x3, %t1
328*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %t2
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector single-precision multiplies are reassociated.
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @reassociate_muls_v8f32(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, <8 x float> %x3) {
334*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_muls_v8f32:
335*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
336*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %ymm1, %ymm0, %ymm0
337*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulps %ymm3, %ymm2, %ymm1
338*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulps %ymm1, %ymm0, %ymm0
339*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
340*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <8 x float> %x0, %x1
341*9880d681SAndroid Build Coastguard Worker  %t1 = fmul <8 x float> %x2, %t0
342*9880d681SAndroid Build Coastguard Worker  %t2 = fmul <8 x float> %x3, %t1
343*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %t2
344*9880d681SAndroid Build Coastguard Worker}
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector double-precision multiplies are reassociated.
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @reassociate_muls_v4f64(<4 x double> %x0, <4 x double> %x1, <4 x double> %x2, <4 x double> %x3) {
349*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_muls_v4f64:
350*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
351*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
352*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulpd %ymm3, %ymm2, %ymm1
353*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulpd %ymm1, %ymm0, %ymm0
354*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
355*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x double> %x0, %x1
356*9880d681SAndroid Build Coastguard Worker  %t1 = fmul <4 x double> %x2, %t0
357*9880d681SAndroid Build Coastguard Worker  %t2 = fmul <4 x double> %x3, %t1
358*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %t2
359*9880d681SAndroid Build Coastguard Worker}
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar single-precision minimum ops are reassociated.
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_mins_single(float %x0, float %x1, float %x2, float %x3) {
364*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_mins_single:
365*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
366*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
367*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minss %xmm3, %xmm2
368*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minss %xmm2, %xmm0
369*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
370*9880d681SAndroid Build Coastguard Worker;
371*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_mins_single:
372*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
373*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
374*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminss %xmm3, %xmm2, %xmm1
375*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminss %xmm1, %xmm0, %xmm0
376*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
377*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
378*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp olt float %x2, %t0
379*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cmp1, float %x2, float %t0
380*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp olt float %x3, %sel1
381*9880d681SAndroid Build Coastguard Worker  %sel2 = select i1 %cmp2, float %x3, float %sel1
382*9880d681SAndroid Build Coastguard Worker  ret float %sel2
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar single-precision maximum ops are reassociated.
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_maxs_single(float %x0, float %x1, float %x2, float %x3) {
388*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_maxs_single:
389*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
390*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
391*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxss %xmm3, %xmm2
392*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxss %xmm2, %xmm0
393*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
394*9880d681SAndroid Build Coastguard Worker;
395*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_maxs_single:
396*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
397*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
398*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxss %xmm3, %xmm2, %xmm1
399*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxss %xmm1, %xmm0, %xmm0
400*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
401*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
402*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp ogt float %x2, %t0
403*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cmp1, float %x2, float %t0
404*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ogt float %x3, %sel1
405*9880d681SAndroid Build Coastguard Worker  %sel2 = select i1 %cmp2, float %x3, float %sel1
406*9880d681SAndroid Build Coastguard Worker  ret float %sel2
407*9880d681SAndroid Build Coastguard Worker}
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar double-precision minimum ops are reassociated.
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_mins_double(double %x0, double %x1, double %x2, double %x3) {
412*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_mins_double:
413*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
414*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
415*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minsd %xmm3, %xmm2
416*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minsd %xmm2, %xmm0
417*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
418*9880d681SAndroid Build Coastguard Worker;
419*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_mins_double:
420*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
421*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
422*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminsd %xmm3, %xmm2, %xmm1
423*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminsd %xmm1, %xmm0, %xmm0
424*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
425*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
426*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp olt double %x2, %t0
427*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cmp1, double %x2, double %t0
428*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp olt double %x3, %sel1
429*9880d681SAndroid Build Coastguard Worker  %sel2 = select i1 %cmp2, double %x3, double %sel1
430*9880d681SAndroid Build Coastguard Worker  ret double %sel2
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX scalar double-precision maximum ops are reassociated.
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_maxs_double(double %x0, double %x1, double %x2, double %x3) {
436*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_maxs_double:
437*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
438*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
439*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxsd %xmm3, %xmm2
440*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxsd %xmm2, %xmm0
441*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
442*9880d681SAndroid Build Coastguard Worker;
443*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_maxs_double:
444*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
445*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
446*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxsd %xmm3, %xmm2, %xmm1
447*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxsd %xmm1, %xmm0, %xmm0
448*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
449*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
450*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp ogt double %x2, %t0
451*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cmp1, double %x2, double %t0
452*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ogt double %x3, %sel1
453*9880d681SAndroid Build Coastguard Worker  %sel2 = select i1 %cmp2, double %x3, double %sel1
454*9880d681SAndroid Build Coastguard Worker  ret double %sel2
455*9880d681SAndroid Build Coastguard Worker}
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector single-precision minimum ops are reassociated.
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @reassociate_mins_v4f32(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
460*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_mins_v4f32:
461*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
462*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addps %xmm1, %xmm0
463*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minps %xmm3, %xmm2
464*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minps %xmm2, %xmm0
465*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
466*9880d681SAndroid Build Coastguard Worker;
467*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_mins_v4f32:
468*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
469*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm0
470*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminps %xmm3, %xmm2, %xmm1
471*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminps %xmm1, %xmm0, %xmm0
472*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
473*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
474*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp olt <4 x float> %x2, %t0
475*9880d681SAndroid Build Coastguard Worker  %sel1 = select <4 x i1> %cmp1, <4 x float> %x2, <4 x float> %t0
476*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp olt <4 x float> %x3, %sel1
477*9880d681SAndroid Build Coastguard Worker  %sel2 = select <4 x i1> %cmp2, <4 x float> %x3, <4 x float> %sel1
478*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %sel2
479*9880d681SAndroid Build Coastguard Worker}
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector single-precision maximum ops are reassociated.
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @reassociate_maxs_v4f32(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
484*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_maxs_v4f32:
485*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
486*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addps %xmm1, %xmm0
487*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxps %xmm3, %xmm2
488*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxps %xmm2, %xmm0
489*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
490*9880d681SAndroid Build Coastguard Worker;
491*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_maxs_v4f32:
492*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
493*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm0
494*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxps %xmm3, %xmm2, %xmm1
495*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxps %xmm1, %xmm0, %xmm0
496*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
497*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
498*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp ogt <4 x float> %x2, %t0
499*9880d681SAndroid Build Coastguard Worker  %sel1 = select <4 x i1> %cmp1, <4 x float> %x2, <4 x float> %t0
500*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ogt <4 x float> %x3, %sel1
501*9880d681SAndroid Build Coastguard Worker  %sel2 = select <4 x i1> %cmp2, <4 x float> %x3, <4 x float> %sel1
502*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %sel2
503*9880d681SAndroid Build Coastguard Worker}
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector double-precision minimum ops are reassociated.
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @reassociate_mins_v2f64(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, <2 x double> %x3) {
508*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_mins_v2f64:
509*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
510*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addpd %xmm1, %xmm0
511*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minpd %xmm3, %xmm2
512*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    minpd %xmm2, %xmm0
513*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
514*9880d681SAndroid Build Coastguard Worker;
515*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_mins_v2f64:
516*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
517*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
518*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminpd %xmm3, %xmm2, %xmm1
519*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminpd %xmm1, %xmm0, %xmm0
520*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
521*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <2 x double> %x0, %x1
522*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp olt <2 x double> %x2, %t0
523*9880d681SAndroid Build Coastguard Worker  %sel1 = select <2 x i1> %cmp1, <2 x double> %x2, <2 x double> %t0
524*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp olt <2 x double> %x3, %sel1
525*9880d681SAndroid Build Coastguard Worker  %sel2 = select <2 x i1> %cmp2, <2 x double> %x3, <2 x double> %sel1
526*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %sel2
527*9880d681SAndroid Build Coastguard Worker}
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Worker; Verify that SSE and AVX 128-bit vector double-precision maximum ops are reassociated.
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @reassociate_maxs_v2f64(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, <2 x double> %x3) {
532*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_maxs_v2f64:
533*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
534*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addpd %xmm1, %xmm0
535*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxpd %xmm3, %xmm2
536*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    maxpd %xmm2, %xmm0
537*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
538*9880d681SAndroid Build Coastguard Worker;
539*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_maxs_v2f64:
540*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
541*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
542*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxpd %xmm3, %xmm2, %xmm1
543*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxpd %xmm1, %xmm0, %xmm0
544*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
545*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <2 x double> %x0, %x1
546*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp ogt <2 x double> %x2, %t0
547*9880d681SAndroid Build Coastguard Worker  %sel1 = select <2 x i1> %cmp1, <2 x double> %x2, <2 x double> %t0
548*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ogt <2 x double> %x3, %sel1
549*9880d681SAndroid Build Coastguard Worker  %sel2 = select <2 x i1> %cmp2, <2 x double> %x3, <2 x double> %sel1
550*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %sel2
551*9880d681SAndroid Build Coastguard Worker}
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector single-precision minimum ops are reassociated.
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @reassociate_mins_v8f32(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, <8 x float> %x3) {
556*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_mins_v8f32:
557*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
558*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %ymm1, %ymm0, %ymm0
559*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminps %ymm3, %ymm2, %ymm1
560*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminps %ymm1, %ymm0, %ymm0
561*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
562*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <8 x float> %x0, %x1
563*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp olt <8 x float> %x2, %t0
564*9880d681SAndroid Build Coastguard Worker  %sel1 = select <8 x i1> %cmp1, <8 x float> %x2, <8 x float> %t0
565*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp olt <8 x float> %x3, %sel1
566*9880d681SAndroid Build Coastguard Worker  %sel2 = select <8 x i1> %cmp2, <8 x float> %x3, <8 x float> %sel1
567*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %sel2
568*9880d681SAndroid Build Coastguard Worker}
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector single-precision maximum ops are reassociated.
571*9880d681SAndroid Build Coastguard Worker
572*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @reassociate_maxs_v8f32(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, <8 x float> %x3) {
573*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_maxs_v8f32:
574*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
575*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %ymm1, %ymm0, %ymm0
576*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxps %ymm3, %ymm2, %ymm1
577*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxps %ymm1, %ymm0, %ymm0
578*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
579*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <8 x float> %x0, %x1
580*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp ogt <8 x float> %x2, %t0
581*9880d681SAndroid Build Coastguard Worker  %sel1 = select <8 x i1> %cmp1, <8 x float> %x2, <8 x float> %t0
582*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ogt <8 x float> %x3, %sel1
583*9880d681SAndroid Build Coastguard Worker  %sel2 = select <8 x i1> %cmp2, <8 x float> %x3, <8 x float> %sel1
584*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %sel2
585*9880d681SAndroid Build Coastguard Worker}
586*9880d681SAndroid Build Coastguard Worker
587*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector double-precision minimum ops are reassociated.
588*9880d681SAndroid Build Coastguard Worker
589*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @reassociate_mins_v4f64(<4 x double> %x0, <4 x double> %x1, <4 x double> %x2, <4 x double> %x3) {
590*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_mins_v4f64:
591*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
592*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
593*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminpd %ymm3, %ymm2, %ymm1
594*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vminpd %ymm1, %ymm0, %ymm0
595*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
596*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x double> %x0, %x1
597*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp olt <4 x double> %x2, %t0
598*9880d681SAndroid Build Coastguard Worker  %sel1 = select <4 x i1> %cmp1, <4 x double> %x2, <4 x double> %t0
599*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp olt <4 x double> %x3, %sel1
600*9880d681SAndroid Build Coastguard Worker  %sel2 = select <4 x i1> %cmp2, <4 x double> %x3, <4 x double> %sel1
601*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %sel2
602*9880d681SAndroid Build Coastguard Worker}
603*9880d681SAndroid Build Coastguard Worker
604*9880d681SAndroid Build Coastguard Worker; Verify that AVX 256-bit vector double-precision maximum ops are reassociated.
605*9880d681SAndroid Build Coastguard Worker
606*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @reassociate_maxs_v4f64(<4 x double> %x0, <4 x double> %x1, <4 x double> %x2, <4 x double> %x3) {
607*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_maxs_v4f64:
608*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
609*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
610*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxpd %ymm3, %ymm2, %ymm1
611*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmaxpd %ymm1, %ymm0, %ymm0
612*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
613*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x double> %x0, %x1
614*9880d681SAndroid Build Coastguard Worker  %cmp1 = fcmp ogt <4 x double> %x2, %t0
615*9880d681SAndroid Build Coastguard Worker  %sel1 = select <4 x i1> %cmp1, <4 x double> %x2, <4 x double> %t0
616*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ogt <4 x double> %x3, %sel1
617*9880d681SAndroid Build Coastguard Worker  %sel2 = select <4 x i1> %cmp2, <4 x double> %x3, <4 x double> %sel1
618*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %sel2
619*9880d681SAndroid Build Coastguard Worker}
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Worker; PR25016: https://llvm.org/bugs/show_bug.cgi?id=25016
622*9880d681SAndroid Build Coastguard Worker; Verify that reassociation is not happening needlessly or wrongly.
623*9880d681SAndroid Build Coastguard Worker
624*9880d681SAndroid Build Coastguard Workerdeclare double @bar()
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_adds_from_calls() {
627*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_adds_from_calls:
628*9880d681SAndroid Build Coastguard Worker; AVX:       callq   bar
629*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  %xmm0, 16(%rsp)
630*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  callq   bar
631*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  %xmm0, 8(%rsp)
632*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  callq   bar
633*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  %xmm0, (%rsp)
634*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  callq   bar
635*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  8(%rsp), %xmm1
636*9880d681SAndroid Build Coastguard Worker; AVX:       vaddsd  16(%rsp), %xmm1, %xmm1
637*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vaddsd  (%rsp), %xmm0, %xmm0
638*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vaddsd  %xmm0, %xmm1, %xmm0
639*9880d681SAndroid Build Coastguard Worker
640*9880d681SAndroid Build Coastguard Worker  %x0 = call double @bar()
641*9880d681SAndroid Build Coastguard Worker  %x1 = call double @bar()
642*9880d681SAndroid Build Coastguard Worker  %x2 = call double @bar()
643*9880d681SAndroid Build Coastguard Worker  %x3 = call double @bar()
644*9880d681SAndroid Build Coastguard Worker  %t0 = fadd double %x0, %x1
645*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %t0, %x2
646*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %t1, %x3
647*9880d681SAndroid Build Coastguard Worker  ret double %t2
648*9880d681SAndroid Build Coastguard Worker}
649*9880d681SAndroid Build Coastguard Worker
650*9880d681SAndroid Build Coastguard Workerdefine double @already_reassociated() {
651*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: already_reassociated:
652*9880d681SAndroid Build Coastguard Worker; AVX:       callq   bar
653*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  %xmm0, 16(%rsp)
654*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  callq   bar
655*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  %xmm0, 8(%rsp)
656*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  callq   bar
657*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  %xmm0, (%rsp)
658*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  callq   bar
659*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vmovsd  8(%rsp), %xmm1
660*9880d681SAndroid Build Coastguard Worker; AVX:       vaddsd  16(%rsp), %xmm1, %xmm1
661*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vaddsd  (%rsp), %xmm0, %xmm0
662*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:  vaddsd  %xmm0, %xmm1, %xmm0
663*9880d681SAndroid Build Coastguard Worker
664*9880d681SAndroid Build Coastguard Worker  %x0 = call double @bar()
665*9880d681SAndroid Build Coastguard Worker  %x1 = call double @bar()
666*9880d681SAndroid Build Coastguard Worker  %x2 = call double @bar()
667*9880d681SAndroid Build Coastguard Worker  %x3 = call double @bar()
668*9880d681SAndroid Build Coastguard Worker  %t0 = fadd double %x0, %x1
669*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %x2, %x3
670*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %t0, %t1
671*9880d681SAndroid Build Coastguard Worker  ret double %t2
672*9880d681SAndroid Build Coastguard Worker}
673*9880d681SAndroid Build Coastguard Worker
674