re PR tree-optimization/81555 (Wrong code at -O1)
PR tree-optimization/81555 PR tree-optimization/81556 * tree-ssa-reassoc.c (rewrite_expr_tree): Add NEXT_CHANGED argument, if true, force CHANGED for the recursive invocation. (reassociate_bb): Remember original length of ops array, pass len != orig_len as NEXT_CHANGED in rewrite_expr_tree call. * gcc.c-torture/execute/pr81555.c: New test. * gcc.c-torture/execute/pr81556.c: New test. From-SVN: r250610
This commit is contained in:
parent
01cee97570
commit
26590fc68b
|
@ -1,3 +1,12 @@
|
||||||
|
2017-07-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/81555
|
||||||
|
PR tree-optimization/81556
|
||||||
|
* tree-ssa-reassoc.c (rewrite_expr_tree): Add NEXT_CHANGED argument,
|
||||||
|
if true, force CHANGED for the recursive invocation.
|
||||||
|
(reassociate_bb): Remember original length of ops array, pass
|
||||||
|
len != orig_len as NEXT_CHANGED in rewrite_expr_tree call.
|
||||||
|
|
||||||
2017-07-27 Martin Liska <mliska@suse.cz>
|
2017-07-27 Martin Liska <mliska@suse.cz>
|
||||||
|
|
||||||
Backport from mainline
|
Backport from mainline
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2017-07-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/81555
|
||||||
|
PR tree-optimization/81556
|
||||||
|
* gcc.c-torture/execute/pr81555.c: New test.
|
||||||
|
* gcc.c-torture/execute/pr81556.c: New test.
|
||||||
|
|
||||||
2017-07-27 Martin Liska <mliska@suse.cz>
|
2017-07-27 Martin Liska <mliska@suse.cz>
|
||||||
|
|
||||||
Backport from mainline
|
Backport from mainline
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* PR tree-optimization/81555 */
|
||||||
|
|
||||||
|
unsigned int a = 1, d = 0xfaeU, e = 0xe376U;
|
||||||
|
_Bool b = 0, f = 1;
|
||||||
|
unsigned char g = 1;
|
||||||
|
|
||||||
|
void
|
||||||
|
foo (void)
|
||||||
|
{
|
||||||
|
_Bool c = a != b;
|
||||||
|
if (c)
|
||||||
|
f = 0;
|
||||||
|
if (e & c & (unsigned char)d & c)
|
||||||
|
g = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
foo ();
|
||||||
|
if (f || g != 1)
|
||||||
|
__builtin_abort ();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/* PR tree-optimization/81556 */
|
||||||
|
|
||||||
|
unsigned long long int b = 0xb82ff73c5c020599ULL;
|
||||||
|
unsigned long long int c = 0xd4e8188733a29d8eULL;
|
||||||
|
unsigned long long int d = 2, f = 1, g = 0, h = 0;
|
||||||
|
unsigned long long int e = 0xf27771784749f32bULL;
|
||||||
|
|
||||||
|
__attribute__((noinline, noclone)) void
|
||||||
|
foo (void)
|
||||||
|
{
|
||||||
|
_Bool a = d > 1;
|
||||||
|
g = f % ((d > 1) << 9);
|
||||||
|
h = a & (e & (a & b & c));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
foo ();
|
||||||
|
if (g != 1 || h != 0)
|
||||||
|
__builtin_abort ();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -4188,11 +4188,15 @@ insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
|
||||||
|
|
||||||
/* Recursively rewrite our linearized statements so that the operators
|
/* Recursively rewrite our linearized statements so that the operators
|
||||||
match those in OPS[OPINDEX], putting the computation in rank
|
match those in OPS[OPINDEX], putting the computation in rank
|
||||||
order. Return new lhs. */
|
order. Return new lhs.
|
||||||
|
CHANGED is true if we shouldn't reuse the lhs SSA_NAME both in
|
||||||
|
the current stmt and during recursive invocations.
|
||||||
|
NEXT_CHANGED is true if we shouldn't reuse the lhs SSA_NAME in
|
||||||
|
recursive invocations. */
|
||||||
|
|
||||||
static tree
|
static tree
|
||||||
rewrite_expr_tree (gimple *stmt, unsigned int opindex,
|
rewrite_expr_tree (gimple *stmt, unsigned int opindex,
|
||||||
vec<operand_entry *> ops, bool changed)
|
vec<operand_entry *> ops, bool changed, bool next_changed)
|
||||||
{
|
{
|
||||||
tree rhs1 = gimple_assign_rhs1 (stmt);
|
tree rhs1 = gimple_assign_rhs1 (stmt);
|
||||||
tree rhs2 = gimple_assign_rhs2 (stmt);
|
tree rhs2 = gimple_assign_rhs2 (stmt);
|
||||||
|
@ -4283,7 +4287,8 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
|
||||||
be the non-leaf side. */
|
be the non-leaf side. */
|
||||||
tree new_rhs1
|
tree new_rhs1
|
||||||
= rewrite_expr_tree (SSA_NAME_DEF_STMT (rhs1), opindex + 1, ops,
|
= rewrite_expr_tree (SSA_NAME_DEF_STMT (rhs1), opindex + 1, ops,
|
||||||
changed || oe->op != rhs2);
|
changed || oe->op != rhs2 || next_changed,
|
||||||
|
false);
|
||||||
|
|
||||||
if (oe->op != rhs2 || new_rhs1 != rhs1)
|
if (oe->op != rhs2 || new_rhs1 != rhs1)
|
||||||
{
|
{
|
||||||
|
@ -5637,6 +5642,7 @@ reassociate_bb (basic_block bb)
|
||||||
gimple_set_visited (stmt, true);
|
gimple_set_visited (stmt, true);
|
||||||
linearize_expr_tree (&ops, stmt, true, true);
|
linearize_expr_tree (&ops, stmt, true, true);
|
||||||
ops.qsort (sort_by_operand_rank);
|
ops.qsort (sort_by_operand_rank);
|
||||||
|
int orig_len = ops.length ();
|
||||||
optimize_ops_list (rhs_code, &ops);
|
optimize_ops_list (rhs_code, &ops);
|
||||||
if (undistribute_ops_list (rhs_code, &ops,
|
if (undistribute_ops_list (rhs_code, &ops,
|
||||||
loop_containing_stmt (stmt)))
|
loop_containing_stmt (stmt)))
|
||||||
|
@ -5727,7 +5733,8 @@ reassociate_bb (basic_block bb)
|
||||||
|
|
||||||
new_lhs = rewrite_expr_tree (stmt, 0, ops,
|
new_lhs = rewrite_expr_tree (stmt, 0, ops,
|
||||||
powi_result != NULL
|
powi_result != NULL
|
||||||
|| negate_result);
|
|| negate_result,
|
||||||
|
len != orig_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we combined some repeated factors into a
|
/* If we combined some repeated factors into a
|
||||||
|
|
Loading…
Reference in New Issue