Commit b0aef8a8 by Maxim Kuvyrkov Committed by Maxim Kuvyrkov

re PR middle-end/40815 (redundant neg instruction caused by loop-invariant)

	PR middle-end/40815
	* tree-ssa-reassoc.c (broken_up_substracts): Rename to plus_negates.
	(negate_value): Move code to push elements to broken_up_substracts ...
	(eliminate_plus_minus_pair): ... here.  Push operands that have no
	negative pair to plus_negates.
	(repropagate_negates, init_reassoc, fini_reassoc): Update.

	PR middle-end/40815
	* gcc.dg/tree-ssa/reassoc-19.c: New.

From-SVN: r158105
parent 0b2de948
2010-04-08 Maxim Kuvyrkov <maxim@codesourcery.com>
PR middle-end/40815
* tree-ssa-reassoc.c (broken_up_substracts): Rename to plus_negates.
(negate_value): Move code to push elements to broken_up_substracts ...
(eliminate_plus_minus_pair): ... here. Push operands that have no
negative pair to plus_negates.
(repropagate_negates, init_reassoc, fini_reassoc): Update.
2010-04-07 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> 2010-04-07 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* doc/install.texi (Configuration): Move description of * doc/install.texi (Configuration): Move description of
......
2010-04-08 Maxim Kuvyrkov <maxim@codesourcery.com>
PR middle-end/40815
* gcc.dg/tree-ssa/reassoc-19.c: New.
2010-04-07 Jakub Jelinek <jakub@redhat.com> 2010-04-07 Jakub Jelinek <jakub@redhat.com>
PR c/18624 PR c/18624
......
/* { dg-do compile } */
/* { dg-options "-Os -fdump-tree-reassoc2" } */
/* Slightly changed testcase from PR middle-end/40815. */
void bar(char*, char*, int);
void foo(char* left, char* rite, int element)
{
while (left <= rite)
{
/* This should expand into
D.zzzz = D.zzzz - D.xxxx;
and NOT to
D.D.yyyy = -D.xxxx; D.zzzz = D.zzzz + D.yyyy; */
rite -= element;
bar(left, rite, element);
}
}
/* There should be no " + " in the dump. */
/* { dg-final { scan-tree-dump-times " \\\+ " 0 "reassoc2" } } */
/* { dg-final { cleanup-tree-dump "reassoc2" } } */
...@@ -467,6 +467,8 @@ eliminate_duplicate_pair (enum tree_code opcode, ...@@ -467,6 +467,8 @@ eliminate_duplicate_pair (enum tree_code opcode,
return false; return false;
} }
static VEC(tree, heap) *plus_negates;
/* If OPCODE is PLUS_EXPR, CURR->OP is really a negate expression, /* If OPCODE is PLUS_EXPR, CURR->OP is really a negate expression,
look in OPS for a corresponding positive operation to cancel it look in OPS for a corresponding positive operation to cancel it
out. If we find one, remove the other from OPS, replace out. If we find one, remove the other from OPS, replace
...@@ -521,6 +523,10 @@ eliminate_plus_minus_pair (enum tree_code opcode, ...@@ -521,6 +523,10 @@ eliminate_plus_minus_pair (enum tree_code opcode,
} }
} }
/* CURR->OP is a negate expr in a plus expr: save it for later
inspection in repropagate_negates(). */
VEC_safe_push (tree, heap, plus_negates, curr->op);
return false; return false;
} }
...@@ -1500,8 +1506,6 @@ get_single_immediate_use (tree lhs) ...@@ -1500,8 +1506,6 @@ get_single_immediate_use (tree lhs)
return NULL; return NULL;
} }
static VEC(tree, heap) *broken_up_subtracts;
/* Recursively negate the value of TONEGATE, and return the SSA_NAME /* Recursively negate the value of TONEGATE, and return the SSA_NAME
representing the negated value. Insertions of any necessary representing the negated value. Insertions of any necessary
instructions go before GSI. instructions go before GSI.
...@@ -1544,7 +1548,6 @@ negate_value (tree tonegate, gimple_stmt_iterator *gsi) ...@@ -1544,7 +1548,6 @@ negate_value (tree tonegate, gimple_stmt_iterator *gsi)
tonegate = fold_build1 (NEGATE_EXPR, TREE_TYPE (tonegate), tonegate); tonegate = fold_build1 (NEGATE_EXPR, TREE_TYPE (tonegate), tonegate);
resultofnegate = force_gimple_operand_gsi (gsi, tonegate, true, resultofnegate = force_gimple_operand_gsi (gsi, tonegate, true,
NULL_TREE, true, GSI_SAME_STMT); NULL_TREE, true, GSI_SAME_STMT);
VEC_safe_push (tree, heap, broken_up_subtracts, resultofnegate);
return resultofnegate; return resultofnegate;
} }
...@@ -1700,7 +1703,7 @@ repropagate_negates (void) ...@@ -1700,7 +1703,7 @@ repropagate_negates (void)
unsigned int i = 0; unsigned int i = 0;
tree negate; tree negate;
for (i = 0; VEC_iterate (tree, broken_up_subtracts, i, negate); i++) for (i = 0; VEC_iterate (tree, plus_negates, i, negate); i++)
{ {
gimple user = get_single_immediate_use (negate); gimple user = get_single_immediate_use (negate);
...@@ -2014,7 +2017,7 @@ init_reassoc (void) ...@@ -2014,7 +2017,7 @@ init_reassoc (void)
free (bbs); free (bbs);
calculate_dominance_info (CDI_POST_DOMINATORS); calculate_dominance_info (CDI_POST_DOMINATORS);
broken_up_subtracts = NULL; plus_negates = NULL;
} }
/* Cleanup after the reassociation pass, and print stats if /* Cleanup after the reassociation pass, and print stats if
...@@ -2035,7 +2038,7 @@ fini_reassoc (void) ...@@ -2035,7 +2038,7 @@ fini_reassoc (void)
pointer_map_destroy (operand_rank); pointer_map_destroy (operand_rank);
free_alloc_pool (operand_entry_pool); free_alloc_pool (operand_entry_pool);
free (bb_rank); free (bb_rank);
VEC_free (tree, heap, broken_up_subtracts); VEC_free (tree, heap, plus_negates);
free_dominance_info (CDI_POST_DOMINATORS); free_dominance_info (CDI_POST_DOMINATORS);
loop_optimizer_finalize (); loop_optimizer_finalize ();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment