https://gcc.gnu.org/g:a1810364cd0c36d6408a4c386bdc504a021d68c7
commit r15-985-ga1810364cd0c36d6408a4c386bdc504a021d68c7 Author: Richard Biener <rguent...@suse.de> Date: Fri May 31 15:17:10 2024 +0200 Avoid ICE with pointer reduction There's another case where we can refer to neutral_op before eventually converting it from pointer to integer so simply do that unconditionally. * tree-vect-loop.cc (get_initial_defs_for_reduction): Always convert neutral_op. Diff: --- gcc/tree-vect-loop.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 5b85cffb37f..b6e0b9616d5 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -5606,6 +5606,12 @@ get_initial_defs_for_reduction (loop_vec_info loop_vinfo, tree_vector_builder elts (vector_type, nunits, 1); elts.quick_grow (nunits); gimple_seq ctor_seq = NULL; + if (neutral_op + && !useless_type_conversion_p (TREE_TYPE (vector_type), + TREE_TYPE (neutral_op))) + neutral_op = gimple_convert (&ctor_seq, + TREE_TYPE (vector_type), + neutral_op); for (j = 0; j < nunits * number_of_vectors; ++j) { tree op; @@ -5614,14 +5620,7 @@ get_initial_defs_for_reduction (loop_vec_info loop_vinfo, /* Get the def before the loop. In reduction chain we have only one initial value. Else we have as many as PHIs in the group. */ if (i >= initial_values.length () || (j > i && neutral_op)) - { - if (!useless_type_conversion_p (TREE_TYPE (vector_type), - TREE_TYPE (neutral_op))) - neutral_op = gimple_convert (&ctor_seq, - TREE_TYPE (vector_type), - neutral_op); - op = neutral_op; - } + op = neutral_op; else { if (!useless_type_conversion_p (TREE_TYPE (vector_type),