Skip to content

Commit 9cdcf21

Browse files
committed
[Xtensa] Implement DAG Combine for FADD and FSUB operations.
1 parent b2fc3a5 commit 9cdcf21

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

llvm/lib/Target/Xtensa/XtensaISelLowering.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &tm,
257257
setCondCodeAction(ISD::SETUGE, MVT::f32, Expand);
258258
setCondCodeAction(ISD::SETUGT, MVT::f32, Expand);
259259

260+
setTargetDAGCombine(ISD::FADD);
261+
setTargetDAGCombine(ISD::FSUB);
260262
setTargetDAGCombine(ISD::BRCOND);
261263
}
262264

@@ -395,6 +397,57 @@ void XtensaTargetLowering::LowerAsmOperandForConstraint(
395397
// DAG Combine functions
396398
//===----------------------------------------------------------------------===//
397399

400+
static SDValue performMADD_MSUBCombine(SDNode *ROOTNode, SelectionDAG &CurDAG,
401+
const XtensaSubtarget &Subtarget) {
402+
if (ROOTNode->getOperand(0).getValueType() != MVT::f32)
403+
return SDValue();
404+
405+
if (ROOTNode->getOperand(0).getOpcode() != ISD::FMUL &&
406+
ROOTNode->getOperand(1).getOpcode() != ISD::FMUL)
407+
return SDValue();
408+
409+
SDValue Mult = ROOTNode->getOperand(0).getOpcode() == ISD::FMUL
410+
? ROOTNode->getOperand(0)
411+
: ROOTNode->getOperand(1);
412+
413+
SDValue AddOperand = ROOTNode->getOperand(0).getOpcode() == ISD::FMUL
414+
? ROOTNode->getOperand(1)
415+
: ROOTNode->getOperand(0);
416+
417+
if (!Mult.hasOneUse())
418+
return SDValue();
419+
420+
SDLoc DL(ROOTNode);
421+
422+
bool IsAdd = ROOTNode->getOpcode() == ISD::FADD;
423+
unsigned Opcode = IsAdd ? XtensaISD::MADD : XtensaISD::MSUB;
424+
SDValue MAddOps[3] = {AddOperand, Mult->getOperand(0), Mult->getOperand(1)};
425+
EVT VTs[3] = {MVT::f32, MVT::f32, MVT::f32};
426+
SDValue MAdd = CurDAG.getNode(Opcode, DL, VTs, MAddOps);
427+
428+
return MAdd;
429+
}
430+
431+
static SDValue performSUBCombine(SDNode *N, SelectionDAG &DAG,
432+
TargetLowering::DAGCombinerInfo &DCI,
433+
const XtensaSubtarget &Subtarget) {
434+
if (DCI.isBeforeLegalizeOps()) {
435+
if (Subtarget.hasSingleFloat() && N->getValueType(0) == MVT::f32)
436+
return performMADD_MSUBCombine(N, DAG, Subtarget);
437+
}
438+
return SDValue();
439+
}
440+
441+
static SDValue performADDCombine(SDNode *N, SelectionDAG &DAG,
442+
TargetLowering::DAGCombinerInfo &DCI,
443+
const XtensaSubtarget &Subtarget) {
444+
if (DCI.isBeforeLegalizeOps()) {
445+
if (Subtarget.hasSingleFloat() && N->getValueType(0) == MVT::f32)
446+
return performMADD_MSUBCombine(N, DAG, Subtarget);
447+
}
448+
return SDValue();
449+
}
450+
398451
static SDValue PerformBRCONDCombine(SDNode *N, SelectionDAG &DAG,
399452
TargetLowering::DAGCombinerInfo &DCI,
400453
const XtensaSubtarget &Subtarget) {
@@ -428,6 +481,10 @@ SDValue XtensaTargetLowering::PerformDAGCombine(SDNode *N,
428481
switch (Opc) {
429482
default:
430483
break;
484+
case ISD::FADD:
485+
return performADDCombine(N, DAG, DCI, Subtarget);
486+
case ISD::FSUB:
487+
return performSUBCombine(N, DAG, DCI, Subtarget);
431488
case ISD::BRCOND:
432489
return PerformBRCONDCombine(N, DAG, DCI, Subtarget);
433490
}

llvm/lib/Target/Xtensa/XtensaISelLowering.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ class XtensaTargetLowering : public TargetLowering {
9999
return VT.changeVectorElementTypeToInteger();
100100
}
101101

102+
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
103+
EVT VT) const override {
104+
return true;
105+
}
106+
102107
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
103108
bool isFPImmLegal(const APFloat &Imm, EVT VT,
104109
bool ForCodeSize) const override;

0 commit comments

Comments
 (0)