Skip to content

Commit 79d380f

Browse files
authored
[AArch64][SVE2] Add codegen patterns for SVE2 FAMINMAX (#107284)
Tablegen patterns were previously added to lower the following sequences from generic IR to NEON FAMIN/FAMAX instructions - `fminimum((abs(a), abs(b)) -> famin(a, b)` - `fmaximum((abs(a)), abs(b)) -> famax(a, b)` - #103027 - `fminnum[nnan](abs(a), abs(b)) -> famin(a, b)` - `fmaxnum[nnan](abs(a), abs(b)) -> famax(a, b)` - #104766 The same idea has been applied for the scalable vector variants of [FAMIN](https://developer.arm.com/documentation/ddi0602/2024-06/SVE-Instructions/FAMIN--Floating-point-absolute-minimum--predicated--)/[FAMAX](https://developer.arm.com/documentation/ddi0602/2024-06/SVE-Instructions/FAMAX--Floating-point-absolute-maximum--predicated--). ('nnan' documenatation: https://llvm.org/docs/LangRef.html#fast-math-flags). - Changes to LLVM - lib/target/AArch64/AArch64SVEInstrInfo.td - Add 'AArch64fminnm_p_nnan' and 'AArch64fmaxnm_p_nnan' patfrags (patterns predicated on the 'nnan' flag). - Add 'AArch64famax_p' and 'AArch64famin_p' - test/CodeGen/AArch64/aarch64-sve2-faminmax.ll - Add tests to verify the new patterns, including both positive and negative tests for 'nnan' predicated behavior.
1 parent f25b091 commit 79d380f

File tree

2 files changed

+691
-2
lines changed

2 files changed

+691
-2
lines changed

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,16 @@ def AArch64fsub_p_contract : PatFrag<(ops node:$op1, node:$op2, node:$op3),
218218
return N->getFlags().hasAllowContract();
219219
}]>;
220220

221+
def AArch64fminnm_p_nnan : PatFrag<(ops node:$op1, node:$op2, node:$op3),
222+
(AArch64fminnm_p node:$op1, node:$op2, node:$op3), [{
223+
return N->getFlags().hasNoNaNs();
224+
}]>;
225+
226+
def AArch64fmaxnm_p_nnan : PatFrag<(ops node:$op1, node:$op2, node:$op3),
227+
(AArch64fmaxnm_p node:$op1, node:$op2, node:$op3), [{
228+
return N->getFlags().hasNoNaNs();
229+
}]>;
230+
221231
def SDT_AArch64Arith_Imm : SDTypeProfile<1, 3, [
222232
SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVT<3,i32>,
223233
SDTCVecEltisVT<1,i1>, SDTCisSameAs<0,2>
@@ -469,6 +479,24 @@ def AArch64fmls_m1 : PatFrags<(ops node:$pg, node:$za, node:$zn, node:$zm),
469479
(vselect node:$pg, (AArch64fsub_p_contract (SVEAllActive), node:$za, (AArch64fmul_p_oneuse (SVEAllActive), node:$zn, node:$zm)), node:$za),
470480
(vselect node:$pg, (AArch64fma_p (SVEAllActive), (AArch64fneg_mt (SVEAllActive), node:$zn, (undef)), node:$zm, node:$za), node:$za)]>;
471481

482+
def AArch64famin_p : PatFrags<(ops node:$pred, node:$op1, node:$op2),
483+
[(int_aarch64_sve_famin_u node:$pred, node:$op1, node:$op2),
484+
(AArch64fmin_p node:$pred,
485+
(AArch64fabs_mt node:$pred, node:$op1, undef),
486+
(AArch64fabs_mt node:$pred, node:$op2, undef)),
487+
(AArch64fminnm_p_nnan node:$pred,
488+
(AArch64fabs_mt node:$pred, node:$op1, undef),
489+
(AArch64fabs_mt node:$pred, node:$op2, undef))]>;
490+
491+
def AArch64famax_p : PatFrags<(ops node:$pred, node:$op1, node:$op2),
492+
[(int_aarch64_sve_famax_u node:$pred, node:$op1, node:$op2),
493+
(AArch64fmax_p node:$pred,
494+
(AArch64fabs_mt node:$pred, node:$op1, undef),
495+
(AArch64fabs_mt node:$pred, node:$op2, undef)),
496+
(AArch64fmaxnm_p_nnan node:$pred,
497+
(AArch64fabs_mt node:$pred, node:$op1, undef),
498+
(AArch64fabs_mt node:$pred, node:$op2, undef))]>;
499+
472500
def AArch64add_m1 : VSelectUnpredOrPassthruPatFrags<int_aarch64_sve_add, add>;
473501
def AArch64sub_m1 : VSelectUnpredOrPassthruPatFrags<int_aarch64_sve_sub, sub>;
474502
def AArch64mul_m1 : VSelectCommPredOrPassthruPatFrags<int_aarch64_sve_mul, AArch64mul_p>;
@@ -4184,8 +4212,8 @@ let Predicates = [HasSVE2orSME2, HasFAMINMAX] in {
41844212
defm FAMIN_ZPmZ : sve_fp_2op_p_zds<0b1111, "famin", "FAMIN_ZPZZ", int_aarch64_sve_famin, DestructiveBinaryComm>;
41854213
defm FAMAX_ZPmZ : sve_fp_2op_p_zds<0b1110, "famax", "FAMAX_ZPZZ", int_aarch64_sve_famax, DestructiveBinaryComm>;
41864214

4187-
defm FAMAX_ZPZZ : sve_fp_bin_pred_hfd<int_aarch64_sve_famax_u>;
4188-
defm FAMIN_ZPZZ : sve_fp_bin_pred_hfd<int_aarch64_sve_famin_u>;
4215+
defm FAMAX_ZPZZ : sve_fp_bin_pred_hfd<AArch64famax_p>;
4216+
defm FAMIN_ZPZZ : sve_fp_bin_pred_hfd<AArch64famin_p>;
41894217
} // End HasSVE2orSME2, HasFAMINMAX
41904218

41914219
let Predicates = [HasSSVE_FP8FMA] in {

0 commit comments

Comments
 (0)