]> git.ipfire.org Git - thirdparty/gcc.git/commit
widening_mul: Fix up .SAT_{ADD,SUB,MUL} pattern recognition [PR123372]
authorJakub Jelinek <jakub@redhat.com>
Sat, 3 Jan 2026 13:27:41 +0000 (14:27 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 3 Jan 2026 13:27:41 +0000 (14:27 +0100)
commitc7206efa282bdd121ae4bd5227b487d06c3874c2
treed0e47aae2a3c869a84ff87cf0b1f9b9cf9f0ca43
parentd5743234731ecc62d889e297a7576561600da41d
widening_mul: Fix up .SAT_{ADD,SUB,MUL} pattern recognition [PR123372]

The following testcase ICEs since r15-1671, because the match.pd pattern
now allows a cast and the function checks whether the ifn is supported
on a wrong type.  .SAT_{ADD,SUB,MUL} are binary ifns, so they care about
the type of their first operand:
  #define binary_direct { 0, 0, true }
where
  /* optabs can be parameterized by one or two modes.  These fields describe
     how to select those modes from the types of the return value and
     arguments.  A value of -1 says that the mode is determined by the
     return type while a value N >= 0 says that the mode is determined by
     the type of argument N.  A value of -2 says that this internal
     function isn't directly mapped to an optab.  */
but in this function (unlike the function right below it for the
same ifns) checks the type of the lhs which since that change can be
actually a different type (expansion performs the operation on the
argument types and then casts the result to the lhs type).
So, e.g. on x86_64 -m32, it checks wether ussubsi3 insn can be used
(which it can), but then actually uses it on DImode arguments and
ussubdi3 is TARGET_64BIT only.  Similarly for -m64 it checks ussubsi3 too
instead of ussubti3 (which doesn't exist).

2026-01-03  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/123372
* tree-ssa-math-opts.cc
(build_saturation_binary_arith_call_and_replace): Pass type of op_0
rather than type of lhs as second argument to
direct_internal_fn_supported_p.

* gcc.dg/tree-ssa/pr123372.c: New test.
gcc/testsuite/gcc.dg/tree-ssa/pr123372.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.cc