tree-optimization/109672 - properly check emulated plus during vect
Checks
Commit Message
The following refactors the check for emulated vector support for
the cases of plus, minus and negate. In the PR we end up with
a SImode plus, supported by the target but emulated and in this
context fail to verify we are dealing with exactly word_mode.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/109672
* tree-vect-stmts.cc (vectorizable_operation): For plus,
minus and negate always check the vector mode is word mode.
---
gcc/tree-vect-stmts.cc | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
@@ -6384,29 +6384,26 @@ vectorizable_operation (vec_info *vinfo,
}
bool using_emulated_vectors_p = vect_emulated_vector_p (vectype);
- if (!target_support_p)
+ if (!target_support_p || using_emulated_vectors_p)
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
- "op not supported by target.\n");
+ "op not supported by target.\n");
/* Check only during analysis. */
- if (maybe_ne (GET_MODE_SIZE (vec_mode), UNITS_PER_WORD)
+ if (((code == PLUS_EXPR || code == MINUS_EXPR || code == NEGATE_EXPR)
+ && maybe_ne (GET_MODE_SIZE (vec_mode), UNITS_PER_WORD))
|| (!vec_stmt && !vect_can_vectorize_without_simd_p (code)))
- return false;
+ {
+ if (dump_enabled_p ())
+ dump_printf (MSG_NOTE, "using word mode not possible.\n");
+ return false;
+ }
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
"proceeding using word mode.\n");
using_emulated_vectors_p = true;
}
- if (using_emulated_vectors_p
- && !vect_can_vectorize_without_simd_p (code))
- {
- if (dump_enabled_p ())
- dump_printf (MSG_NOTE, "using word mode not possible.\n");
- return false;
- }
-
int reduc_idx = STMT_VINFO_REDUC_IDX (stmt_info);
vec_loop_masks *masks = (loop_vinfo ? &LOOP_VINFO_MASKS (loop_vinfo) : NULL);
internal_fn cond_fn = get_conditional_internal_fn (code);