On Wed, Jan 28, 2026 at 5:01 PM Andrew Pinski <[email protected]> wrote: > > Currently if the rtl is either an arithmetic or an unary > rtl, noce_can_force_operand checks to see if there is an > optab for that rtl code. This works for more things except > on some targets they have a ss_minus instruction but don't > implement the optab for it. In the case of arm you can > generate a ss_minus with a builtin and then when it comes > to trying to do ifcvt, force_operand fails over. > In this case the optab, sssub was only supported for > fixed-point modes before and it was working as code_to_optab > would return there was not optabs. But after r15-1030-gabe6d39365476e, > the optab will be return. What the backend is doing is correct and will > most likely happen with other rtl codes/optabs later on. > > To fix this instead of just returning true if the optab exists, we need > to check if the optab entry for the mode exists.
I forgot to add: Bootstrapped and tested on x86_64-linux-gnu. > > PR rtl-optimization/122170 > > gcc/ChangeLog: > > * ifcvt.cc (noce_can_force_operand): Don;t only check if > there is an optab for the code check the entry for the > mode is non-null. > > Signed-off-by: Andrew Pinski <[email protected]> > --- > gcc/ifcvt.cc | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc > index 0858b3d2f6d..60fc97a3907 100644 > --- a/gcc/ifcvt.cc > +++ b/gcc/ifcvt.cc > @@ -919,13 +919,19 @@ noce_can_force_operand (rtx x) > switch (GET_CODE (x)) > { > case MULT: > - case DIV: > case MOD: > case UDIV: > case UMOD: > return true; > + case DIV: > + if (INTEGRAL_MODE_P (GET_MODE (x))) > + return true; > + /* FALLTHRU */ > default: > - return code_to_optab (GET_CODE (x)); > + auto optab = code_to_optab (GET_CODE (x)); > + if (!optab) > + return false; > + return optab_handler (optab, GET_MODE (x)); > } > } > if (UNARY_P (x)) > @@ -945,7 +951,10 @@ noce_can_force_operand (rtx x) > case UNSIGNED_FLOAT: > return true; > default: > - return code_to_optab (GET_CODE (x)); > + auto optab = code_to_optab (GET_CODE (x)); > + if (!optab) > + return false; > + return optab_handler (optab, GET_MODE (x)); > } > } > return false; > -- > 2.43.0 >
