]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end: [PR middle-end/116926] Allow widening optabs for vec-mode -> scalar-mode
authorVictor Do Nascimento <victor.donascimento@arm.com>
Thu, 10 Oct 2024 11:55:04 +0000 (12:55 +0100)
committerVictor Do Nascimento <victor.donascimento@arm.com>
Mon, 14 Oct 2024 09:11:13 +0000 (10:11 +0100)
The recent refactoring of the dot_prod optab to convert-type exposed a
limitation in how `find_widening_optab_handler_and_mode' is currently
implemented, owing to the fact that, while the function expects the

  GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)

condition to hold, the c6x backend implements a dot product from V2HI
to SI, which triggers an ICE.

Consequently, this patch adds some logic to allow widening optabs
which accumulate vector elements to a single scalar.

gcc/ChangeLog:

PR middle-end/116926
* optabs-query.cc (find_widening_optab_handler_and_mode): Add
handling of vector -> scalar optab handling.

gcc/optabs-query.cc

index c3134d6a2cee34f091c339efba947e841dabf6fd..cc52bc0f5ea74e582182010291ead77f0bbb9fad 100644 (file)
@@ -485,6 +485,12 @@ find_widening_optab_handler_and_mode (optab op, machine_mode to_mode,
       if (GET_MODE_CLASS (limit_mode) == MODE_PARTIAL_INT)
        limit_mode = GET_MODE_WIDER_MODE (limit_mode).require ();
     }
+  else if (is_a <scalar_int_mode> (to_mode))
+    {
+      gcc_checking_assert (VECTOR_MODE_P (from_mode)
+                          && GET_MODE_INNER (from_mode) < to_mode);
+      limit_mode = from_mode;
+    }
   else
     gcc_checking_assert (GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
                         && from_mode < to_mode);