Skip to content

Commit 111219e

Browse files
authored
[SPARC] Use FMA instructions when we have UA2007 (#148434)
1 parent 6f3b360 commit 111219e

File tree

4 files changed

+301
-2
lines changed

4 files changed

+301
-2
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,12 +1799,14 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
17991799
setOperationAction(ISD::FCOS , MVT::f64, Expand);
18001800
setOperationAction(ISD::FSINCOS, MVT::f64, Expand);
18011801
setOperationAction(ISD::FREM , MVT::f64, Expand);
1802-
setOperationAction(ISD::FMA , MVT::f64, Expand);
1802+
setOperationAction(ISD::FMA, MVT::f64,
1803+
Subtarget->isUA2007() ? Legal : Expand);
18031804
setOperationAction(ISD::FSIN , MVT::f32, Expand);
18041805
setOperationAction(ISD::FCOS , MVT::f32, Expand);
18051806
setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
18061807
setOperationAction(ISD::FREM , MVT::f32, Expand);
1807-
setOperationAction(ISD::FMA, MVT::f32, Expand);
1808+
setOperationAction(ISD::FMA, MVT::f32,
1809+
Subtarget->isUA2007() ? Legal : Expand);
18081810
setOperationAction(ISD::ROTL , MVT::i32, Expand);
18091811
setOperationAction(ISD::ROTR , MVT::i32, Expand);
18101812
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
@@ -3550,6 +3552,11 @@ bool SparcTargetLowering::isCheapToSpeculateCttz(Type *Ty) const {
35503552
return isCheapToSpeculateCtlz(Ty);
35513553
}
35523554

3555+
bool SparcTargetLowering::isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
3556+
EVT VT) const {
3557+
return Subtarget->isUA2007() && !Subtarget->useSoftFloat();
3558+
}
3559+
35533560
// Override to disable global variable loading on Linux.
35543561
void SparcTargetLowering::insertSSPDeclarations(Module &M) const {
35553562
if (!Subtarget->isTargetLinux())

llvm/lib/Target/Sparc/SparcISelLowering.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@ namespace llvm {
177177

178178
bool isCheapToSpeculateCttz(Type *Ty) const override;
179179

180+
bool enableAggressiveFMAFusion(EVT VT) const override { return true; };
181+
182+
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
183+
EVT VT) const override;
184+
180185
bool shouldInsertFencesForAtomic(const Instruction *I) const override {
181186
// FIXME: We insert fences for each atomics and generate
182187
// sub-optimal code for PSO/TSO. (Approximately nobody uses any

llvm/lib/Target/Sparc/SparcInstrUAOSA.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,15 @@ defm CXBCOND : F2_56<"cxb", 1>;
6666
def FPMADDX : FourOp<"fpmaddx", 0b110111, 0b0000, DFPRegs>;
6767
def FPMADDXHI : FourOp<"fpmaddxhi", 0b110111, 0b0100, DFPRegs>;
6868
} // Predicates = [HasOSA2011]
69+
70+
// UA2007 instruction patterns.
71+
let Predicates = [HasUA2007] in {
72+
def : Pat<(f32 (any_fma f32:$rs1, f32:$rs2, f32:$add)), (FMADDS $rs1, $rs2, $add)>;
73+
def : Pat<(f64 (any_fma f64:$rs1, f64:$rs2, f64:$add)), (FMADDD $rs1, $rs2, $add)>;
74+
def : Pat<(f32 (any_fma f32:$rs1, f32:$rs2, (fneg f32:$sub))), (FMSUBS $rs1, $rs2, $sub)>;
75+
def : Pat<(f64 (any_fma f64:$rs1, f64:$rs2, (fneg f64:$sub))), (FMSUBD $rs1, $rs2, $sub)>;
76+
def : Pat<(f32 (fneg (any_fma f32:$rs1, f32:$rs2, f32:$add))), (FNMADDS $rs1, $rs2, $add)>;
77+
def : Pat<(f64 (fneg (any_fma f64:$rs1, f64:$rs2, f64:$add))), (FNMADDD $rs1, $rs2, $add)>;
78+
def : Pat<(f32 (fneg (any_fma f32:$rs1, f32:$rs2, (fneg f32:$sub)))), (FNMSUBS $rs1, $rs2, $sub)>;
79+
def : Pat<(f64 (fneg (any_fma f64:$rs1, f64:$rs2, (fneg f64:$sub)))), (FNMSUBD $rs1, $rs2, $sub)>;
80+
} // Predicates = [HasUA2007]
Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=sparc64 --fp-contract=fast -mattr=-ua2007 < %s | FileCheck %s -check-prefix=NO-UA2007
3+
; RUN: llc -mtriple=sparc64 --fp-contract=fast -mattr=+ua2007 < %s | FileCheck %s -check-prefix=UA2007
4+
5+
define float @fmadds(float %a, float %b, float %c) nounwind {
6+
; NO-UA2007-LABEL: fmadds:
7+
; NO-UA2007: ! %bb.0:
8+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
9+
; NO-UA2007-NEXT: retl
10+
; NO-UA2007-NEXT: fadds %f0, %f5, %f0
11+
;
12+
; UA2007-LABEL: fmadds:
13+
; UA2007: ! %bb.0:
14+
; UA2007-NEXT: retl
15+
; UA2007-NEXT: fmadds %f1, %f3, %f5, %f0
16+
%ret = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
17+
ret float %ret
18+
}
19+
20+
define double @fmaddd(double %a, double %b, double %c) nounwind {
21+
; NO-UA2007-LABEL: fmaddd:
22+
; NO-UA2007: ! %bb.0:
23+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
24+
; NO-UA2007-NEXT: retl
25+
; NO-UA2007-NEXT: faddd %f0, %f4, %f0
26+
;
27+
; UA2007-LABEL: fmaddd:
28+
; UA2007: ! %bb.0:
29+
; UA2007-NEXT: retl
30+
; UA2007-NEXT: fmaddd %f0, %f2, %f4, %f0
31+
%ret = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
32+
ret double %ret
33+
}
34+
35+
define float @fmsubs(float %a, float %b, float %c) nounwind {
36+
; NO-UA2007-LABEL: fmsubs:
37+
; NO-UA2007: ! %bb.0:
38+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
39+
; NO-UA2007-NEXT: retl
40+
; NO-UA2007-NEXT: fsubs %f0, %f5, %f0
41+
;
42+
; UA2007-LABEL: fmsubs:
43+
; UA2007: ! %bb.0:
44+
; UA2007-NEXT: retl
45+
; UA2007-NEXT: fmsubs %f1, %f3, %f5, %f0
46+
%neg = fneg float %c
47+
%ret = call float @llvm.fmuladd.f32(float %a, float %b, float %neg)
48+
ret float %ret
49+
}
50+
51+
define double @fmsubd(double %a, double %b, double %c) nounwind {
52+
; NO-UA2007-LABEL: fmsubd:
53+
; NO-UA2007: ! %bb.0:
54+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
55+
; NO-UA2007-NEXT: retl
56+
; NO-UA2007-NEXT: fsubd %f0, %f4, %f0
57+
;
58+
; UA2007-LABEL: fmsubd:
59+
; UA2007: ! %bb.0:
60+
; UA2007-NEXT: retl
61+
; UA2007-NEXT: fmsubd %f0, %f2, %f4, %f0
62+
%neg = fneg double %c
63+
%ret = call double @llvm.fmuladd.f64(double %a, double %b, double %neg)
64+
ret double %ret
65+
}
66+
67+
define float @fnmadds(float %a, float %b, float %c) nounwind {
68+
; NO-UA2007-LABEL: fnmadds:
69+
; NO-UA2007: ! %bb.0:
70+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
71+
; NO-UA2007-NEXT: fadds %f0, %f5, %f0
72+
; NO-UA2007-NEXT: retl
73+
; NO-UA2007-NEXT: fnegs %f0, %f0
74+
;
75+
; UA2007-LABEL: fnmadds:
76+
; UA2007: ! %bb.0:
77+
; UA2007-NEXT: retl
78+
; UA2007-NEXT: fnmadds %f1, %f3, %f5, %f0
79+
%fma = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
80+
%ret = fneg float %fma
81+
ret float %ret
82+
}
83+
84+
define double @fnmaddd(double %a, double %b, double %c) nounwind {
85+
; NO-UA2007-LABEL: fnmaddd:
86+
; NO-UA2007: ! %bb.0:
87+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
88+
; NO-UA2007-NEXT: faddd %f0, %f4, %f0
89+
; NO-UA2007-NEXT: retl
90+
; NO-UA2007-NEXT: fnegd %f0, %f0
91+
;
92+
; UA2007-LABEL: fnmaddd:
93+
; UA2007: ! %bb.0:
94+
; UA2007-NEXT: retl
95+
; UA2007-NEXT: fnmaddd %f0, %f2, %f4, %f0
96+
%fma = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
97+
%ret = fneg double %fma
98+
ret double %ret
99+
}
100+
101+
define float @fnmsubs(float %a, float %b, float %c) nounwind {
102+
; NO-UA2007-LABEL: fnmsubs:
103+
; NO-UA2007: ! %bb.0:
104+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
105+
; NO-UA2007-NEXT: fsubs %f0, %f5, %f0
106+
; NO-UA2007-NEXT: retl
107+
; NO-UA2007-NEXT: fnegs %f0, %f0
108+
;
109+
; UA2007-LABEL: fnmsubs:
110+
; UA2007: ! %bb.0:
111+
; UA2007-NEXT: retl
112+
; UA2007-NEXT: fnmsubs %f1, %f3, %f5, %f0
113+
%neg = fneg float %c
114+
%fma = call float @llvm.fmuladd.f32(float %a, float %b, float %neg)
115+
%ret = fneg float %fma
116+
ret float %ret
117+
}
118+
119+
define double @fnmsubd(double %a, double %b, double %c) nounwind {
120+
; NO-UA2007-LABEL: fnmsubd:
121+
; NO-UA2007: ! %bb.0:
122+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
123+
; NO-UA2007-NEXT: fsubd %f0, %f4, %f0
124+
; NO-UA2007-NEXT: retl
125+
; NO-UA2007-NEXT: fnegd %f0, %f0
126+
;
127+
; UA2007-LABEL: fnmsubd:
128+
; UA2007: ! %bb.0:
129+
; UA2007-NEXT: retl
130+
; UA2007-NEXT: fnmsubd %f0, %f2, %f4, %f0
131+
%neg = fneg double %c
132+
%fma = call double @llvm.fmuladd.f64(double %a, double %b, double %neg)
133+
%ret = fneg double %fma
134+
ret double %ret
135+
}
136+
137+
138+
define float @combine_madds(float %a, float %b, float %c) nounwind {
139+
; NO-UA2007-LABEL: combine_madds:
140+
; NO-UA2007: ! %bb.0:
141+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
142+
; NO-UA2007-NEXT: retl
143+
; NO-UA2007-NEXT: fadds %f0, %f5, %f0
144+
;
145+
; UA2007-LABEL: combine_madds:
146+
; UA2007: ! %bb.0:
147+
; UA2007-NEXT: retl
148+
; UA2007-NEXT: fmadds %f1, %f3, %f5, %f0
149+
%mul = fmul float %a, %b
150+
%add = fadd float %mul, %c
151+
ret float %add
152+
}
153+
154+
define double @combine_maddd(double %a, double %b, double %c) nounwind {
155+
; NO-UA2007-LABEL: combine_maddd:
156+
; NO-UA2007: ! %bb.0:
157+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
158+
; NO-UA2007-NEXT: retl
159+
; NO-UA2007-NEXT: faddd %f0, %f4, %f0
160+
;
161+
; UA2007-LABEL: combine_maddd:
162+
; UA2007: ! %bb.0:
163+
; UA2007-NEXT: retl
164+
; UA2007-NEXT: fmaddd %f0, %f2, %f4, %f0
165+
%mul = fmul double %a, %b
166+
%add = fadd double %mul, %c
167+
ret double %add
168+
}
169+
170+
define float @combine_msubs(float %a, float %b, float %c) nounwind {
171+
; NO-UA2007-LABEL: combine_msubs:
172+
; NO-UA2007: ! %bb.0:
173+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
174+
; NO-UA2007-NEXT: retl
175+
; NO-UA2007-NEXT: fsubs %f0, %f5, %f0
176+
;
177+
; UA2007-LABEL: combine_msubs:
178+
; UA2007: ! %bb.0:
179+
; UA2007-NEXT: retl
180+
; UA2007-NEXT: fmsubs %f1, %f3, %f5, %f0
181+
%mul = fmul float %a, %b
182+
%sub = fsub float %mul, %c
183+
ret float %sub
184+
}
185+
186+
define double @combine_msubd(double %a, double %b, double %c) nounwind {
187+
; NO-UA2007-LABEL: combine_msubd:
188+
; NO-UA2007: ! %bb.0:
189+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
190+
; NO-UA2007-NEXT: retl
191+
; NO-UA2007-NEXT: fsubd %f0, %f4, %f0
192+
;
193+
; UA2007-LABEL: combine_msubd:
194+
; UA2007: ! %bb.0:
195+
; UA2007-NEXT: retl
196+
; UA2007-NEXT: fmsubd %f0, %f2, %f4, %f0
197+
%mul = fmul double %a, %b
198+
%sub = fsub double %mul, %c
199+
ret double %sub
200+
}
201+
202+
define float @combine_nmadds(float %a, float %b, float %c) nounwind {
203+
; NO-UA2007-LABEL: combine_nmadds:
204+
; NO-UA2007: ! %bb.0:
205+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
206+
; NO-UA2007-NEXT: fadds %f0, %f5, %f0
207+
; NO-UA2007-NEXT: retl
208+
; NO-UA2007-NEXT: fnegs %f0, %f0
209+
;
210+
; UA2007-LABEL: combine_nmadds:
211+
; UA2007: ! %bb.0:
212+
; UA2007-NEXT: retl
213+
; UA2007-NEXT: fnmadds %f1, %f3, %f5, %f0
214+
%mul = fmul float %a, %b
215+
%add = fadd float %mul, %c
216+
%neg = fneg float %add
217+
ret float %neg
218+
}
219+
220+
define double @combine_nmaddd(double %a, double %b, double %c) nounwind {
221+
; NO-UA2007-LABEL: combine_nmaddd:
222+
; NO-UA2007: ! %bb.0:
223+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
224+
; NO-UA2007-NEXT: faddd %f0, %f4, %f0
225+
; NO-UA2007-NEXT: retl
226+
; NO-UA2007-NEXT: fnegd %f0, %f0
227+
;
228+
; UA2007-LABEL: combine_nmaddd:
229+
; UA2007: ! %bb.0:
230+
; UA2007-NEXT: retl
231+
; UA2007-NEXT: fnmaddd %f0, %f2, %f4, %f0
232+
%mul = fmul double %a, %b
233+
%add = fadd double %mul, %c
234+
%neg = fneg double %add
235+
ret double %neg
236+
}
237+
238+
define float @combine_nmsubs(float %a, float %b, float %c) nounwind {
239+
; NO-UA2007-LABEL: combine_nmsubs:
240+
; NO-UA2007: ! %bb.0:
241+
; NO-UA2007-NEXT: fmuls %f1, %f3, %f0
242+
; NO-UA2007-NEXT: fsubs %f0, %f5, %f0
243+
; NO-UA2007-NEXT: retl
244+
; NO-UA2007-NEXT: fnegs %f0, %f0
245+
;
246+
; UA2007-LABEL: combine_nmsubs:
247+
; UA2007: ! %bb.0:
248+
; UA2007-NEXT: retl
249+
; UA2007-NEXT: fnmsubs %f1, %f3, %f5, %f0
250+
%mul = fmul float %a, %b
251+
%sub = fsub float %mul, %c
252+
%neg = fneg float %sub
253+
ret float %neg
254+
}
255+
256+
define double @combine_nmsubd(double %a, double %b, double %c) nounwind {
257+
; NO-UA2007-LABEL: combine_nmsubd:
258+
; NO-UA2007: ! %bb.0:
259+
; NO-UA2007-NEXT: fmuld %f0, %f2, %f0
260+
; NO-UA2007-NEXT: fsubd %f0, %f4, %f0
261+
; NO-UA2007-NEXT: retl
262+
; NO-UA2007-NEXT: fnegd %f0, %f0
263+
;
264+
; UA2007-LABEL: combine_nmsubd:
265+
; UA2007: ! %bb.0:
266+
; UA2007-NEXT: retl
267+
; UA2007-NEXT: fnmsubd %f0, %f2, %f4, %f0
268+
%mul = fmul double %a, %b
269+
%sub = fsub double %mul, %c
270+
%neg = fneg double %sub
271+
ret double %neg
272+
}
273+
274+
declare float @llvm.fmuladd.f32(float, float, float)
275+
declare double @llvm.fmuladd.f64(double, double, double)

0 commit comments

Comments
 (0)