]> git.ipfire.org Git - thirdparty/gcc.git/commit
widening_mul: Fix UADDC/USUBC pattern matching [PR121104]
authorJakub Jelinek <jakub@redhat.com>
Mon, 2 Feb 2026 09:07:15 +0000 (10:07 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 2 Feb 2026 09:07:15 +0000 (10:07 +0100)
commit49c7fc2d534cb7e16f0e95fd89f47eb0b0d34762
tree428aa4798b805d07c676d161b4b635028d73a643
parent1c0305d7aea53d788f3f74ca9a2bd9fb764c0109
widening_mul: Fix UADDC/USUBC pattern matching [PR121104]

As the following testcase shows, I've missed a check that element type
of lhs type of ovf1/ovf2 (.ADD_OVERFLOW/.SUB_OVERFLOW) matches type (there
are some casts accepted on the way for the case of values in [0-1] range),
so the following testcase got also matched as .SUBC and we get an ICE on
type mismatch in there.  The other .{ADD,SUB}_OVERFLOW cases already check
even the result type, both
                    if (gimple_call_internal_p (ovf, code == PLUS_EXPR
                                                     ? IFN_ADD_OVERFLOW
                                                     : IFN_SUB_OVERFLOW))
...
                        ovf_lhs = gimple_call_lhs (ovf);
                        tree ovf_lhs_type = TREE_TYPE (TREE_TYPE (ovf_lhs));
                        ovf_arg1 = gimple_call_arg (ovf, 0);
                        ovf_arg2 = gimple_call_arg (ovf, 1);
                        /* In that case we need to punt if the types don't
                           mismatch.  */
                        if (!types_compatible_p (type, ovf_lhs_type)
                            || !types_compatible_p (type, TREE_TYPE (ovf_arg1))
                            || !types_compatible_p (type,
                                                    TREE_TYPE (ovf_arg2)))
                          ovf_lhs = NULL_TREE;
and
          gimple *ovf3
            = SSA_NAME_DEF_STMT (TREE_OPERAND (gimple_assign_rhs1 (im3), 0));
          if (gimple_call_internal_p (ovf3, ifn))
            {
              lhs = gimple_call_lhs (ovf3);
              arg1 = gimple_call_arg (ovf3, 0);
              arg2 = gimple_call_arg (ovf3, 1);
              if (types_compatible_p (type, TREE_TYPE (TREE_TYPE (lhs)))
                  && types_compatible_p (type, TREE_TYPE (arg1))
                  && types_compatible_p (type, TREE_TYPE (arg2)))

2026-02-02  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/121104
* tree-ssa-math-opts.cc (match_uaddc_usubc): Punt if
lhs of ovf1 or ovf2 doesn't have element type compatible with type.

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