Skip to content

Commit a3f2751

Browse files
committed
[AArch64][GISel] Add handling for G_VECREDUCE_FMAXIMUM and G_VECREDUCE_FMINIMUM
This is a lot of copy-pasting for the existing handling of G_VECREDUCE_FMAX/G_VECREDUCE_FMIN to add handling for G_VECREDUCE_FMAXIMUM/G_VECREDUCE_FMINIMUM in the same way. Differential Revision: https://reviews.llvm.org/D156615
1 parent 660fded commit a3f2751

File tree

18 files changed

+666
-299
lines changed

18 files changed

+666
-299
lines changed

llvm/docs/GlobalISel/GenericOpcode.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,10 +655,10 @@ G_VECREDUCE_FADD, G_VECREDUCE_FMUL
655655

656656
These reductions are relaxed variants which may reduce the elements in any order.
657657

658-
G_VECREDUCE_FMAX, G_VECREDUCE_FMIN
658+
G_VECREDUCE_FMAX, G_VECREDUCE_FMIN, G_VECREDUCE_FMAXIMUM, G_VECREDUCE_FMINIMUM
659659
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
660660

661-
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
661+
FMIN/FMAX/FMINIMUM/FMAXIMUM nodes can have flags, for NaN/NoNaN variants.
662662

663663

664664
Integer/bitwise reductions

llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,8 @@ class GVecReduce : public GenericMachineInstr {
409409
case TargetOpcode::G_VECREDUCE_FMUL:
410410
case TargetOpcode::G_VECREDUCE_FMAX:
411411
case TargetOpcode::G_VECREDUCE_FMIN:
412+
case TargetOpcode::G_VECREDUCE_FMAXIMUM:
413+
case TargetOpcode::G_VECREDUCE_FMINIMUM:
412414
case TargetOpcode::G_VECREDUCE_ADD:
413415
case TargetOpcode::G_VECREDUCE_MUL:
414416
case TargetOpcode::G_VECREDUCE_AND:
@@ -441,6 +443,12 @@ class GVecReduce : public GenericMachineInstr {
441443
case TargetOpcode::G_VECREDUCE_FMIN:
442444
ScalarOpc = TargetOpcode::G_FMINNUM;
443445
break;
446+
case TargetOpcode::G_VECREDUCE_FMAXIMUM:
447+
ScalarOpc = TargetOpcode::G_FMAXIMUM;
448+
break;
449+
case TargetOpcode::G_VECREDUCE_FMINIMUM:
450+
ScalarOpc = TargetOpcode::G_FMINIMUM;
451+
break;
444452
case TargetOpcode::G_VECREDUCE_ADD:
445453
ScalarOpc = TargetOpcode::G_ADD;
446454
break;

llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,19 @@ class MachineIRBuilder {
19731973
MachineInstrBuilder buildVecReduceFMin(const DstOp &Dst, const SrcOp &Src) {
19741974
return buildInstr(TargetOpcode::G_VECREDUCE_FMIN, {Dst}, {Src});
19751975
}
1976+
1977+
/// Build and insert \p Res = G_VECREDUCE_FMAXIMUM \p Src
1978+
MachineInstrBuilder buildVecReduceFMaximum(const DstOp &Dst,
1979+
const SrcOp &Src) {
1980+
return buildInstr(TargetOpcode::G_VECREDUCE_FMAXIMUM, {Dst}, {Src});
1981+
}
1982+
1983+
/// Build and insert \p Res = G_VECREDUCE_FMINIMUM \p Src
1984+
MachineInstrBuilder buildVecReduceFMinimum(const DstOp &Dst,
1985+
const SrcOp &Src) {
1986+
return buildInstr(TargetOpcode::G_VECREDUCE_FMINIMUM, {Dst}, {Src});
1987+
}
1988+
19761989
/// Build and insert \p Res = G_VECREDUCE_ADD \p Src
19771990
MachineInstrBuilder buildVecReduceAdd(const DstOp &Dst, const SrcOp &Src) {
19781991
return buildInstr(TargetOpcode::G_VECREDUCE_ADD, {Dst}, {Src});

llvm/include/llvm/CodeGen/GlobalISel/Utils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class APFloat;
5757
case TargetOpcode::G_VECREDUCE_FMUL: \
5858
case TargetOpcode::G_VECREDUCE_FMAX: \
5959
case TargetOpcode::G_VECREDUCE_FMIN: \
60+
case TargetOpcode::G_VECREDUCE_FMAXIMUM: \
61+
case TargetOpcode::G_VECREDUCE_FMINIMUM: \
6062
case TargetOpcode::G_VECREDUCE_ADD: \
6163
case TargetOpcode::G_VECREDUCE_MUL: \
6264
case TargetOpcode::G_VECREDUCE_AND: \
@@ -72,6 +74,8 @@ class APFloat;
7274
case TargetOpcode::G_VECREDUCE_FMUL: \
7375
case TargetOpcode::G_VECREDUCE_FMAX: \
7476
case TargetOpcode::G_VECREDUCE_FMIN: \
77+
case TargetOpcode::G_VECREDUCE_FMAXIMUM: \
78+
case TargetOpcode::G_VECREDUCE_FMINIMUM: \
7579
case TargetOpcode::G_VECREDUCE_ADD: \
7680
case TargetOpcode::G_VECREDUCE_MUL: \
7781
case TargetOpcode::G_VECREDUCE_AND: \

llvm/include/llvm/Support/TargetOpcodes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,8 @@ HANDLE_TARGET_OPCODE(G_VECREDUCE_FADD)
811811
HANDLE_TARGET_OPCODE(G_VECREDUCE_FMUL)
812812
HANDLE_TARGET_OPCODE(G_VECREDUCE_FMAX)
813813
HANDLE_TARGET_OPCODE(G_VECREDUCE_FMIN)
814+
HANDLE_TARGET_OPCODE(G_VECREDUCE_FMAXIMUM)
815+
HANDLE_TARGET_OPCODE(G_VECREDUCE_FMINIMUM)
814816
HANDLE_TARGET_OPCODE(G_VECREDUCE_ADD)
815817
HANDLE_TARGET_OPCODE(G_VECREDUCE_MUL)
816818
HANDLE_TARGET_OPCODE(G_VECREDUCE_AND)

llvm/include/llvm/Target/GenericOpcodes.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,6 +1398,8 @@ def G_VECREDUCE_FMUL : VectorReduction;
13981398

13991399
def G_VECREDUCE_FMAX : VectorReduction;
14001400
def G_VECREDUCE_FMIN : VectorReduction;
1401+
def G_VECREDUCE_FMAXIMUM : VectorReduction;
1402+
def G_VECREDUCE_FMINIMUM : VectorReduction;
14011403

14021404
def G_VECREDUCE_ADD : VectorReduction;
14031405
def G_VECREDUCE_MUL : VectorReduction;

llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ def : GINodeEquiv<G_LLROUND, llround>;
165165
def : GINodeEquiv<G_VECREDUCE_FADD, vecreduce_fadd>;
166166
def : GINodeEquiv<G_VECREDUCE_FMAX, vecreduce_fmax>;
167167
def : GINodeEquiv<G_VECREDUCE_FMIN, vecreduce_fmin>;
168+
def : GINodeEquiv<G_VECREDUCE_FMAXIMUM, vecreduce_fmaximum>;
169+
def : GINodeEquiv<G_VECREDUCE_FMINIMUM, vecreduce_fminimum>;
168170

169171
def : GINodeEquiv<G_STRICT_FADD, strict_fadd>;
170172
def : GINodeEquiv<G_STRICT_FSUB, strict_fsub>;

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,6 +1797,10 @@ unsigned IRTranslator::getSimpleIntrinsicOpcode(Intrinsic::ID ID) {
17971797
return TargetOpcode::G_VECREDUCE_FMIN;
17981798
case Intrinsic::vector_reduce_fmax:
17991799
return TargetOpcode::G_VECREDUCE_FMAX;
1800+
case Intrinsic::vector_reduce_fminimum:
1801+
return TargetOpcode::G_VECREDUCE_FMINIMUM;
1802+
case Intrinsic::vector_reduce_fmaximum:
1803+
return TargetOpcode::G_VECREDUCE_FMAXIMUM;
18001804
case Intrinsic::vector_reduce_add:
18011805
return TargetOpcode::G_VECREDUCE_ADD;
18021806
case Intrinsic::vector_reduce_mul:

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2649,6 +2649,8 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
26492649
}
26502650
case TargetOpcode::G_VECREDUCE_FMIN:
26512651
case TargetOpcode::G_VECREDUCE_FMAX:
2652+
case TargetOpcode::G_VECREDUCE_FMINIMUM:
2653+
case TargetOpcode::G_VECREDUCE_FMAXIMUM:
26522654
if (TypeIdx != 0)
26532655
return UnableToLegalize;
26542656
Observer.changingInstr(MI);

llvm/lib/CodeGen/MachineVerifier.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,8 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
17201720
case TargetOpcode::G_VECREDUCE_FMUL:
17211721
case TargetOpcode::G_VECREDUCE_FMAX:
17221722
case TargetOpcode::G_VECREDUCE_FMIN:
1723+
case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1724+
case TargetOpcode::G_VECREDUCE_FMINIMUM:
17231725
case TargetOpcode::G_VECREDUCE_ADD:
17241726
case TargetOpcode::G_VECREDUCE_MUL:
17251727
case TargetOpcode::G_VECREDUCE_AND:

0 commit comments

Comments
 (0)