Skip to content

Commit d4a0848

Browse files
[SelectionDAG] Add PARTIAL_REDUCE_U/SMLA ISD Nodes (#125207)
Add signed and unsigned PARTIAL_REDUCE_MLA ISD nodes. Add command line argument (aarch64-enable-partial-reduce-nodes) that indicates whether the intrinsic experimental_vector_partial_ reduce_add will be transformed into the new ISD node. Lowering with the new ISD nodes will, for now, always be done as an expand.
1 parent 88dd372 commit d4a0848

16 files changed

+963
-41
lines changed

llvm/include/llvm/CodeGen/ISDOpcodes.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,23 @@ enum NodeType {
14591459
VECREDUCE_UMAX,
14601460
VECREDUCE_UMIN,
14611461

1462+
// PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2)
1463+
// The partial reduction nodes sign or zero extend Input1 and Input2 to the
1464+
// element type of Accumulator before multiplying their results.
1465+
// This result is concatenated to the Accumulator, and this is then reduced,
1466+
// using addition, to the result type.
1467+
// The output is only expected to either be given to another partial reduction
1468+
// operation or an equivalent vector reduce operation, so the order in which
1469+
// the elements are reduced is deliberately not specified.
1470+
// Input1 and Input2 must be the same type. Accumulator and the output must be
1471+
// the same type.
1472+
// The number of elements in Input1 and Input2 must be a positive integer
1473+
// multiple of the number of elements in the Accumulator / output type.
1474+
// Input1 and Input2 must have an element type which is the same as or smaller
1475+
// than the element type of the Accumulator and output.
1476+
PARTIAL_REDUCE_SMLA,
1477+
PARTIAL_REDUCE_UMLA,
1478+
14621479
// The `llvm.experimental.stackmap` intrinsic.
14631480
// Operands: input chain, glue, <id>, <numShadowBytes>, [live0[, live1...]]
14641481
// Outputs: output chain, glue

llvm/include/llvm/CodeGen/SelectionDAG.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,11 +1607,6 @@ class SelectionDAG {
16071607
/// the target's desired shift amount type.
16081608
SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);
16091609

1610-
/// Create the DAG equivalent of vector_partial_reduce where Op1 and Op2 are
1611-
/// its operands and ReducedTY is the intrinsic's return type.
1612-
SDValue getPartialReduceAdd(SDLoc DL, EVT ReducedTy, SDValue Op1,
1613-
SDValue Op2);
1614-
16151610
/// Expands a node with multiple results to an FP or vector libcall. The
16161611
/// libcall is expected to take all the operands of the \p Node followed by
16171612
/// output pointers for each of the results. \p CallRetResNo can be optionally

llvm/include/llvm/CodeGen/TargetLowering.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5564,6 +5564,10 @@ class TargetLowering : public TargetLoweringBase {
55645564
/// temporarily, advance store position, before re-loading the final vector.
55655565
SDValue expandVECTOR_COMPRESS(SDNode *Node, SelectionDAG &DAG) const;
55665566

5567+
/// Expands PARTIAL_REDUCE_S/UMLA nodes to a series of simpler operations,
5568+
/// consisting of zext/sext, extract_subvector, mul and add operations.
5569+
SDValue expandPartialReduceMLA(SDNode *Node, SelectionDAG &DAG) const;
5570+
55675571
/// Legalize a SETCC or VP_SETCC with given LHS and RHS and condition code CC
55685572
/// on the current target. A VP_SETCC will additionally be given a Mask
55695573
/// and/or EVL not equal to SDValue().

llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
159159
Res = PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(N);
160160
break;
161161

162+
case ISD::PARTIAL_REDUCE_UMLA:
163+
case ISD::PARTIAL_REDUCE_SMLA:
164+
Res = PromoteIntRes_PARTIAL_REDUCE_MLA(N);
165+
break;
166+
162167
case ISD::SIGN_EXTEND:
163168
case ISD::VP_SIGN_EXTEND:
164169
case ISD::ZERO_EXTEND:
@@ -2099,6 +2104,10 @@ bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
20992104
case ISD::VECTOR_FIND_LAST_ACTIVE:
21002105
Res = PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(N, OpNo);
21012106
break;
2107+
case ISD::PARTIAL_REDUCE_UMLA:
2108+
case ISD::PARTIAL_REDUCE_SMLA:
2109+
Res = PromoteIntOp_PARTIAL_REDUCE_MLA(N);
2110+
break;
21022111
}
21032112

21042113
// If the result is null, the sub-method took care of registering results etc.
@@ -2881,6 +2890,18 @@ SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(SDNode *N,
28812890
return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0);
28822891
}
28832892

2893+
SDValue DAGTypeLegalizer::PromoteIntOp_PARTIAL_REDUCE_MLA(SDNode *N) {
2894+
SmallVector<SDValue, 1> NewOps(N->ops());
2895+
if (N->getOpcode() == ISD::PARTIAL_REDUCE_SMLA) {
2896+
NewOps[1] = SExtPromotedInteger(N->getOperand(1));
2897+
NewOps[2] = SExtPromotedInteger(N->getOperand(2));
2898+
} else {
2899+
NewOps[1] = ZExtPromotedInteger(N->getOperand(1));
2900+
NewOps[2] = ZExtPromotedInteger(N->getOperand(2));
2901+
}
2902+
return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0);
2903+
}
2904+
28842905
//===----------------------------------------------------------------------===//
28852906
// Integer Result Expansion
28862907
//===----------------------------------------------------------------------===//
@@ -6200,6 +6221,15 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(SDNode *N) {
62006221
return DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, SDLoc(N), NVT, N->ops());
62016222
}
62026223

6224+
SDValue DAGTypeLegalizer::PromoteIntRes_PARTIAL_REDUCE_MLA(SDNode *N) {
6225+
SDLoc DL(N);
6226+
EVT VT = N->getValueType(0);
6227+
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6228+
SDValue ExtAcc = GetPromotedInteger(N->getOperand(0));
6229+
return DAG.getNode(N->getOpcode(), DL, NVT, ExtAcc, N->getOperand(1),
6230+
N->getOperand(2));
6231+
}
6232+
62036233
SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {
62046234
EVT OutVT = N->getValueType(0);
62056235
EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
379379
SDValue PromoteIntRes_IS_FPCLASS(SDNode *N);
380380
SDValue PromoteIntRes_PATCHPOINT(SDNode *N);
381381
SDValue PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(SDNode *N);
382+
SDValue PromoteIntRes_PARTIAL_REDUCE_MLA(SDNode *N);
382383

383384
// Integer Operand Promotion.
384385
bool PromoteIntegerOperand(SDNode *N, unsigned OpNo);
@@ -430,6 +431,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
430431
SDValue PromoteIntOp_VP_SPLICE(SDNode *N, unsigned OpNo);
431432
SDValue PromoteIntOp_VECTOR_HISTOGRAM(SDNode *N, unsigned OpNo);
432433
SDValue PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(SDNode *N, unsigned OpNo);
434+
SDValue PromoteIntOp_PARTIAL_REDUCE_MLA(SDNode *N);
433435

434436
void SExtOrZExtPromotedOperands(SDValue &LHS, SDValue &RHS);
435437
void PromoteSetCCOperands(SDValue &LHS,SDValue &RHS, ISD::CondCode Code);
@@ -969,6 +971,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
969971
void SplitVecRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi);
970972
void SplitVecRes_FP_TO_XINT_SAT(SDNode *N, SDValue &Lo, SDValue &Hi);
971973
void SplitVecRes_VP_REVERSE(SDNode *N, SDValue &Lo, SDValue &Hi);
974+
void SplitVecRes_PARTIAL_REDUCE_MLA(SDNode *N, SDValue &Lo, SDValue &Hi);
972975

973976
// Vector Operand Splitting: <128 x ty> -> 2 x <64 x ty>.
974977
bool SplitVectorOperand(SDNode *N, unsigned OpNo);
@@ -1000,6 +1003,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
10001003
SDValue SplitVecOp_FP_TO_XINT_SAT(SDNode *N);
10011004
SDValue SplitVecOp_VP_CttzElements(SDNode *N);
10021005
SDValue SplitVecOp_VECTOR_HISTOGRAM(SDNode *N);
1006+
SDValue SplitVecOp_PARTIAL_REDUCE_MLA(SDNode *N);
10031007

10041008
//===--------------------------------------------------------------------===//
10051009
// Vector Widening Support: LegalizeVectorTypes.cpp

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,8 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
469469
case ISD::VECTOR_COMPRESS:
470470
case ISD::SCMP:
471471
case ISD::UCMP:
472+
case ISD::PARTIAL_REDUCE_UMLA:
473+
case ISD::PARTIAL_REDUCE_SMLA:
472474
Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
473475
break;
474476
case ISD::SMULFIX:
@@ -1197,6 +1199,10 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
11971199
case ISD::VECREDUCE_FMINIMUM:
11981200
Results.push_back(TLI.expandVecReduce(Node, DAG));
11991201
return;
1202+
case ISD::PARTIAL_REDUCE_UMLA:
1203+
case ISD::PARTIAL_REDUCE_SMLA:
1204+
Results.push_back(TLI.expandPartialReduceMLA(Node, DAG));
1205+
return;
12001206
case ISD::VECREDUCE_SEQ_FADD:
12011207
case ISD::VECREDUCE_SEQ_FMUL:
12021208
Results.push_back(TLI.expandVecReduceSeq(Node, DAG));

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,10 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
13951395
case ISD::EXPERIMENTAL_VP_REVERSE:
13961396
SplitVecRes_VP_REVERSE(N, Lo, Hi);
13971397
break;
1398+
case ISD::PARTIAL_REDUCE_UMLA:
1399+
case ISD::PARTIAL_REDUCE_SMLA:
1400+
SplitVecRes_PARTIAL_REDUCE_MLA(N, Lo, Hi);
1401+
break;
13981402
}
13991403

14001404
// If Lo/Hi is null, the sub-method took care of registering results etc.
@@ -3213,6 +3217,13 @@ void DAGTypeLegalizer::SplitVecRes_VP_REVERSE(SDNode *N, SDValue &Lo,
32133217
std::tie(Lo, Hi) = DAG.SplitVector(Load, DL);
32143218
}
32153219

3220+
void DAGTypeLegalizer::SplitVecRes_PARTIAL_REDUCE_MLA(SDNode *N, SDValue &Lo,
3221+
SDValue &Hi) {
3222+
SDLoc DL(N);
3223+
SDValue Expanded = TLI.expandPartialReduceMLA(N, DAG);
3224+
std::tie(Lo, Hi) = DAG.SplitVector(Expanded, DL);
3225+
}
3226+
32163227
void DAGTypeLegalizer::SplitVecRes_VECTOR_DEINTERLEAVE(SDNode *N) {
32173228
unsigned Factor = N->getNumOperands();
32183229

@@ -3431,6 +3442,10 @@ bool DAGTypeLegalizer::SplitVectorOperand(SDNode *N, unsigned OpNo) {
34313442
case ISD::EXPERIMENTAL_VECTOR_HISTOGRAM:
34323443
Res = SplitVecOp_VECTOR_HISTOGRAM(N);
34333444
break;
3445+
case ISD::PARTIAL_REDUCE_UMLA:
3446+
case ISD::PARTIAL_REDUCE_SMLA:
3447+
Res = SplitVecOp_PARTIAL_REDUCE_MLA(N);
3448+
break;
34343449
}
34353450

34363451
// If the result is null, the sub-method took care of registering results etc.
@@ -4485,6 +4500,10 @@ SDValue DAGTypeLegalizer::SplitVecOp_VECTOR_HISTOGRAM(SDNode *N) {
44854500
MMO, IndexType);
44864501
}
44874502

4503+
SDValue DAGTypeLegalizer::SplitVecOp_PARTIAL_REDUCE_MLA(SDNode *N) {
4504+
return TLI.expandPartialReduceMLA(N, DAG);
4505+
}
4506+
44884507
//===----------------------------------------------------------------------===//
44894508
// Result Vector Widening
44904509
//===----------------------------------------------------------------------===//

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2474,35 +2474,6 @@ SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {
24742474
return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
24752475
}
24762476

2477-
SDValue SelectionDAG::getPartialReduceAdd(SDLoc DL, EVT ReducedTy, SDValue Op1,
2478-
SDValue Op2) {
2479-
EVT FullTy = Op2.getValueType();
2480-
2481-
unsigned Stride = ReducedTy.getVectorMinNumElements();
2482-
unsigned ScaleFactor = FullTy.getVectorMinNumElements() / Stride;
2483-
2484-
// Collect all of the subvectors
2485-
std::deque<SDValue> Subvectors = {Op1};
2486-
for (unsigned I = 0; I < ScaleFactor; I++) {
2487-
auto SourceIndex = getVectorIdxConstant(I * Stride, DL);
2488-
Subvectors.push_back(
2489-
getNode(ISD::EXTRACT_SUBVECTOR, DL, ReducedTy, {Op2, SourceIndex}));
2490-
}
2491-
2492-
// Flatten the subvector tree
2493-
while (Subvectors.size() > 1) {
2494-
Subvectors.push_back(
2495-
getNode(ISD::ADD, DL, ReducedTy, {Subvectors[0], Subvectors[1]}));
2496-
Subvectors.pop_front();
2497-
Subvectors.pop_front();
2498-
}
2499-
2500-
assert(Subvectors.size() == 1 &&
2501-
"There should only be one subvector after tree flattening");
2502-
2503-
return Subvectors[0];
2504-
}
2505-
25062477
/// Given a store node \p StoreNode, return true if it is safe to fold that node
25072478
/// into \p FPNode, which expands to a library call with output pointers.
25082479
static bool canFoldStoreIntoLibCallOutputPointers(StoreSDNode *StoreNode,
@@ -7883,6 +7854,28 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
78837854

78847855
break;
78857856
}
7857+
case ISD::PARTIAL_REDUCE_UMLA:
7858+
case ISD::PARTIAL_REDUCE_SMLA: {
7859+
[[maybe_unused]] EVT AccVT = N1.getValueType();
7860+
[[maybe_unused]] EVT Input1VT = N2.getValueType();
7861+
[[maybe_unused]] EVT Input2VT = N3.getValueType();
7862+
assert(Input1VT.isVector() && Input1VT == Input2VT &&
7863+
"Expected the second and third operands of the PARTIAL_REDUCE_MLA "
7864+
"node to have the same type!");
7865+
assert(VT.isVector() && VT == AccVT &&
7866+
"Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
7867+
"the same type as its result!");
7868+
assert(Input1VT.getVectorElementCount().hasKnownScalarFactor(
7869+
AccVT.getVectorElementCount()) &&
7870+
"Expected the element count of the second and third operands of the "
7871+
"PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
7872+
"element count of the first operand and the result!");
7873+
assert(N2.getScalarValueSizeInBits() <= N1.getScalarValueSizeInBits() &&
7874+
"Expected the second and third operands of the PARTIAL_REDUCE_MLA "
7875+
"node to have an element type which is the same as or smaller than "
7876+
"the element type of the first operand and result!");
7877+
break;
7878+
}
78867879
}
78877880

78887881
// Memoize node if it doesn't produce a glue result.

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8115,15 +8115,15 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
81158115
return;
81168116
}
81178117
case Intrinsic::experimental_vector_partial_reduce_add: {
8118-
81198118
if (!TLI.shouldExpandPartialReductionIntrinsic(cast<IntrinsicInst>(&I))) {
81208119
visitTargetIntrinsic(I, Intrinsic);
81218120
return;
81228121
}
8123-
8124-
setValue(&I, DAG.getPartialReduceAdd(sdl, EVT::getEVT(I.getType()),
8125-
getValue(I.getOperand(0)),
8126-
getValue(I.getOperand(1))));
8122+
SDValue Acc = getValue(I.getOperand(0));
8123+
SDValue Input = getValue(I.getOperand(1));
8124+
setValue(&I,
8125+
DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8126+
Input, DAG.getConstant(1, sdl, Input.getValueType())));
81278127
return;
81288128
}
81298129
case Intrinsic::experimental_cttz_elts: {

llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,11 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
569569
case ISD::VECTOR_FIND_LAST_ACTIVE:
570570
return "find_last_active";
571571

572+
case ISD::PARTIAL_REDUCE_UMLA:
573+
return "partial_reduce_umla";
574+
case ISD::PARTIAL_REDUCE_SMLA:
575+
return "partial_reduce_smla";
576+
572577
// Vector Predication
573578
#define BEGIN_REGISTER_VP_SDNODE(SDID, LEGALARG, NAME, ...) \
574579
case ISD::SDID: \

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "llvm/Support/MathExtras.h"
3535
#include "llvm/Target/TargetMachine.h"
3636
#include <cctype>
37+
#include <deque>
3738
using namespace llvm;
3839

3940
/// NOTE: The TargetMachine owns TLOF.
@@ -11890,6 +11891,57 @@ SDValue TargetLowering::expandVECTOR_COMPRESS(SDNode *Node,
1189011891
return DAG.getLoad(VecVT, DL, Chain, StackPtr, PtrInfo);
1189111892
}
1189211893

11894+
SDValue TargetLowering::expandPartialReduceMLA(SDNode *N,
11895+
SelectionDAG &DAG) const {
11896+
SDLoc DL(N);
11897+
SDValue Acc = N->getOperand(0);
11898+
SDValue MulLHS = N->getOperand(1);
11899+
SDValue MulRHS = N->getOperand(2);
11900+
EVT AccVT = Acc.getValueType();
11901+
EVT MulOpVT = MulLHS.getValueType();
11902+
11903+
EVT ExtMulOpVT =
11904+
EVT::getVectorVT(*DAG.getContext(), AccVT.getVectorElementType(),
11905+
MulOpVT.getVectorElementCount());
11906+
unsigned ExtOpc = N->getOpcode() == ISD::PARTIAL_REDUCE_SMLA
11907+
? ISD::SIGN_EXTEND
11908+
: ISD::ZERO_EXTEND;
11909+
11910+
if (ExtMulOpVT != MulOpVT) {
11911+
MulLHS = DAG.getNode(ExtOpc, DL, ExtMulOpVT, MulLHS);
11912+
MulRHS = DAG.getNode(ExtOpc, DL, ExtMulOpVT, MulRHS);
11913+
}
11914+
SDValue Input = MulLHS;
11915+
APInt ConstantOne;
11916+
if (!ISD::isConstantSplatVector(MulRHS.getNode(), ConstantOne) ||
11917+
!ConstantOne.isOne())
11918+
Input = DAG.getNode(ISD::MUL, DL, ExtMulOpVT, MulLHS, MulRHS);
11919+
11920+
unsigned Stride = AccVT.getVectorMinNumElements();
11921+
unsigned ScaleFactor = MulOpVT.getVectorMinNumElements() / Stride;
11922+
11923+
// Collect all of the subvectors
11924+
std::deque<SDValue> Subvectors = {Acc};
11925+
for (unsigned I = 0; I < ScaleFactor; I++) {
11926+
auto SourceIndex = DAG.getVectorIdxConstant(I * Stride, DL);
11927+
Subvectors.push_back(
11928+
DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, AccVT, {Input, SourceIndex}));
11929+
}
11930+
11931+
// Flatten the subvector tree
11932+
while (Subvectors.size() > 1) {
11933+
Subvectors.push_back(
11934+
DAG.getNode(ISD::ADD, DL, AccVT, {Subvectors[0], Subvectors[1]}));
11935+
Subvectors.pop_front();
11936+
Subvectors.pop_front();
11937+
}
11938+
11939+
assert(Subvectors.size() == 1 &&
11940+
"There should only be one subvector after tree flattening");
11941+
11942+
return Subvectors[0];
11943+
}
11944+
1189311945
bool TargetLowering::LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT,
1189411946
SDValue &LHS, SDValue &RHS,
1189511947
SDValue &CC, SDValue Mask,

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,10 @@ void TargetLoweringBase::initActions() {
835835
setOperationAction(ISD::GET_FPENV, VT, Expand);
836836
setOperationAction(ISD::SET_FPENV, VT, Expand);
837837
setOperationAction(ISD::RESET_FPENV, VT, Expand);
838+
839+
// PartialReduceMLA operations default to expand.
840+
setOperationAction({ISD::PARTIAL_REDUCE_UMLA, ISD::PARTIAL_REDUCE_SMLA}, VT,
841+
Expand);
838842
}
839843

840844
// Most targets ignore the @llvm.prefetch intrinsic.

0 commit comments

Comments
 (0)