xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/machine-combiner.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O3 -mcpu=pwr7 -enable-unsafe-fp-math < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-PWR
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -O3 -mcpu=a2q -enable-unsafe-fp-math < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-QPX
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-i64:64-n32:64"
4*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Verify that the first two adds are independent regardless of how the inputs are
7*9880d681SAndroid Build Coastguard Worker; commuted. The destination registers are used as source registers for the third add.
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds1(float %x0, float %x1, float %x2, float %x3) {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: reassociate_adds1:
11*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
12*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG0:[0-9]+]], 1, 2
13*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG1:[0-9]+]], 3, 4
14*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds 1, [[REG0]], [[REG1]]
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
18*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
19*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
20*9880d681SAndroid Build Coastguard Worker  ret float %t2
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds2(float %x0, float %x1, float %x2, float %x3) {
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: reassociate_adds2:
25*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
26*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG0:[0-9]+]], 1, 2
27*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG1:[0-9]+]], 3, 4
28*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds 1, [[REG0]], [[REG1]]
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
32*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
33*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
34*9880d681SAndroid Build Coastguard Worker  ret float %t2
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds3(float %x0, float %x1, float %x2, float %x3) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: reassociate_adds3:
39*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
40*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG0:[0-9]+]], 1, 2
41*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG1:[0-9]+]], 3, 4
42*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds 1, [[REG0]], [[REG1]]
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
46*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
47*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
48*9880d681SAndroid Build Coastguard Worker  ret float %t2
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds4(float %x0, float %x1, float %x2, float %x3) {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: reassociate_adds4:
53*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
54*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG0:[0-9]+]], 1, 2
55*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG1:[0-9]+]], 3, 4
56*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds 1, [[REG0]], [[REG1]]
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
60*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
61*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
62*9880d681SAndroid Build Coastguard Worker  ret float %t2
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; Verify that we reassociate some of these ops. The optimal balanced tree of adds is not
66*9880d681SAndroid Build Coastguard Worker; produced because that would cost more compile time.
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds5(float %x0, float %x1, float %x2, float %x3, float %x4, float %x5, float %x6, float %x7) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: reassociate_adds5:
70*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
71*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG12:[0-9]+]], 5, 6
72*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG0:[0-9]+]], 1, 2
73*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG11:[0-9]+]], 3, 4
74*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG13:[0-9]+]], [[REG12]], 7
75*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG1:[0-9]+]], [[REG0]], [[REG11]]
76*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds [[REG2:[0-9]+]], [[REG1]], [[REG13]]
77*9880d681SAndroid Build Coastguard Worker; CHECK:       fadds 1, [[REG2]], 8
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    blr
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
81*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
82*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
83*9880d681SAndroid Build Coastguard Worker  %t3 = fadd float %t2, %x4
84*9880d681SAndroid Build Coastguard Worker  %t4 = fadd float %t3, %x5
85*9880d681SAndroid Build Coastguard Worker  %t5 = fadd float %t4, %x6
86*9880d681SAndroid Build Coastguard Worker  %t6 = fadd float %t5, %x7
87*9880d681SAndroid Build Coastguard Worker  ret float %t6
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; Verify that we reassociate vector instructions too.
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds1(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector_reassociate_adds1:
94*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
95*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG0:[0-9]+]], 1, 2
96*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG1:[0-9]+]], 3, 4
97*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds 1, [[REG0]], [[REG1]]
98*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG0:[0-9]+]], 34, 35
99*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG1:[0-9]+]], 36, 37
100*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp 34, [[REG0]], [[REG1]]
101*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       # kill
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
105*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %t0, %x2
106*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %t1, %x3
107*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds2(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector_reassociate_adds2:
112*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
113*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG0:[0-9]+]], 1, 2
114*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG1:[0-9]+]], 3, 4
115*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds 1, [[REG0]], [[REG1]]
116*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG0:[0-9]+]], 34, 35
117*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG1:[0-9]+]], 36, 37
118*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp 34, [[REG0]], [[REG1]]
119*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       # kill
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
123*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %x2, %t0
124*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %t1, %x3
125*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds3(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector_reassociate_adds3:
130*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
131*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG0:[0-9]+]], 1, 2
132*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG1:[0-9]+]], 3, 4
133*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds 1, [[REG0]], [[REG1]]
134*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG0:[0-9]+]], 34, 35
135*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG1:[0-9]+]], 36, 37
136*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp 34, [[REG0]], [[REG1]]
137*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       # kill
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
141*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %t0, %x2
142*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %x3, %t1
143*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds4(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector_reassociate_adds4:
148*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
149*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG0:[0-9]+]], 1, 2
150*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds [[REG1:[0-9]+]], 3, 4
151*9880d681SAndroid Build Coastguard Worker; CHECK-QPX:       qvfadds 1, [[REG0]], [[REG1]]
152*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG0:[0-9]+]], 34, 35
153*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp [[REG1:[0-9]+]], 36, 37
154*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       xvaddsp 34, [[REG0]], [[REG1]]
155*9880d681SAndroid Build Coastguard Worker; CHECK-PWR:       # kill
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  blr
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
159*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %x2, %t0
160*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %x3, %t1
161*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds6(float %x0, float %x1, float %x2, float %x3) {
165*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
166*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
167*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
168*9880d681SAndroid Build Coastguard Worker  ret float %t2
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_muls1(float %x0, float %x1, float %x2, float %x3) {
172*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
173*9880d681SAndroid Build Coastguard Worker  %t1 = fmul float %x2, %t0
174*9880d681SAndroid Build Coastguard Worker  %t2 = fmul float %x3, %t1
175*9880d681SAndroid Build Coastguard Worker  ret float %t2
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_adds_double(double %x0, double %x1, double %x2, double %x3) {
179*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
180*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %x2, %t0
181*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %x3, %t1
182*9880d681SAndroid Build Coastguard Worker  ret double %t2
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_muls_double(double %x0, double %x1, double %x2, double %x3) {
186*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
187*9880d681SAndroid Build Coastguard Worker  %t1 = fmul double %x2, %t0
188*9880d681SAndroid Build Coastguard Worker  %t2 = fmul double %x3, %t1
189*9880d681SAndroid Build Coastguard Worker  ret double %t2
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker
193