+2019-10-25 Richard Biener <rguenther@suse.de>
+
+ * tree-vect-slp.c (vect_get_and_check_slp_defs): Only fail
+ swapping if we actually have to modify the IL on a shared stmt.
+ (vect_build_slp_tree_2): Never fail swapping on shared stmts
+ because we no longer modify the IL.
+
2019-10-25 Martin Liska <mliska@suse.cz>
* tree.c (dump_tree_statistics): Use sorted index 'j' and not 'i'.
/* Swap operands. */
if (swapped)
{
- /* If there are already uses of this stmt in a SLP instance then
- we've committed to the operand order and can't swap it. */
- if (STMT_VINFO_NUM_SLP_USES (stmt_info) != 0)
- {
- if (dump_enabled_p ())
- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
- "Build SLP failed: cannot swap operands of "
- "shared stmt %G", stmt_info->stmt);
- return -1;
- }
-
if (first_op_cond)
{
+ /* If there are already uses of this stmt in a SLP instance then
+ we've committed to the operand order and can't swap it. */
+ if (STMT_VINFO_NUM_SLP_USES (stmt_info) != 0)
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "Build SLP failed: cannot swap operands of "
+ "shared stmt %G", stmt_info->stmt);
+ return -1;
+ }
+
/* To get rid of this swapping we have to move the stmt code
to the SLP tree as well (and gather it here per stmt). */
gassign *stmt = as_a <gassign *> (stmt_info->stmt);
swap_not_matching = false;
break;
}
- /* Verify if we can safely swap or if we committed to a
- specific operand order already.
- ??? Instead of modifying GIMPLE stmts here we could
- record whether we want to swap operands in the SLP
- node and temporarily do that when processing it
- (or wrap operand accessors in a helper). */
- else if (swap[j] != 0
- || STMT_VINFO_NUM_SLP_USES (stmt_info))
- {
- if (!swap_not_matching)
- {
- if (dump_enabled_p ())
- dump_printf_loc (MSG_MISSED_OPTIMIZATION,
- vect_location,
- "Build SLP failed: cannot swap "
- "operands of shared stmt %G",
- stmts[j]->stmt);
- goto fail;
- }
- swap_not_matching = false;
- break;
- }
}
}
while (j != group_size);