aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVictor Do Nascimento <victor.donascimento@arm.com>2024-10-10 12:55:04 +0100
committerVictor Do Nascimento <victor.donascimento@arm.com>2024-10-14 10:11:13 +0100
commita6f4404689f12fa169540d94c0d06532c7152c2f (patch)
treebf7869c13bebf22bb873cc60d9c4cb64df655869 /gcc
parent50e7c51b0a0e9dc1d93f829016ae743b4f2e5070 (diff)
downloadgcc-a6f4404689f12fa169540d94c0d06532c7152c2f.zip
gcc-a6f4404689f12fa169540d94c0d06532c7152c2f.tar.gz
gcc-a6f4404689f12fa169540d94c0d06532c7152c2f.tar.bz2
middle-end: [PR middle-end/116926] Allow widening optabs for vec-mode -> scalar-mode
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/optabs-query.cc6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/optabs-query.cc b/gcc/optabs-query.cc
index c3134d6..cc52bc0 100644
--- a/gcc/optabs-query.cc
+++ b/gcc/optabs-query.cc
@@ -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);