This code:
/* Make sure we don't accidentally use the old condition. */
cond_expr = NULL_TREE;
was misplaced, since it triggered even when we needed to force the
original unmodified cond_expr into a mask temporary and then invert it.
2019-12-31 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-stmts.c (vectorizable_condition): Only nullify cond_expr
if we've created a new condition. Don't nullify it if we've decided
to keep it and then invert the result.
gcc/testsuite/
* gcc.dg/vect/vect-cond-reduc-6.c: New test.
From-SVN: r279804
2020-12-31 Richard Sandiford <richard.sandiford@arm.com>
+ * tree-vect-stmts.c (vectorizable_condition): Only nullify cond_expr
+ if we've created a new condition. Don't nullify it if we've decided
+ to keep it and then invert the result.
+
+2020-12-31 Richard Sandiford <richard.sandiford@arm.com>
+
* tree-vect-loop-manip.c (create_lcssa_for_virtual_phi): Return
the incoming virtual operand definition.
(vect_do_peeling): When vectorizing an epilogue loop, handle the
2020-12-31 Richard Sandiford <richard.sandiford@arm.com>
+ * gcc.dg/vect/vect-cond-reduc-6.c: New test.
+
+2020-12-31 Richard Sandiford <richard.sandiford@arm.com>
+
* gcc.dg/vect/vect-epilogues-2.c: New test.
2019-12-30 Olivier Hainque <hainque@adacore.com>
--- /dev/null
+/* { dg-do compile } */
+
+int
+f (int *y)
+{
+ int res = 0;
+ for (int i = 0; i < 100; ++i)
+ res = (y[i] & 1) == 0 && (y[i] < 10) ? res : 1;
+ return res;
+}
if (new_code == ERROR_MARK)
must_invert_cmp_result = true;
else
- cond_code = new_code;
+ {
+ cond_code = new_code;
+ /* Make sure we don't accidentally use the old condition. */
+ cond_expr = NULL_TREE;
+ }
}
- /* Make sure we don't accidentally use the old condition. */
- cond_expr = NULL_TREE;
std::swap (then_clause, else_clause);
}