Commit 2b9ed3bc by Bin Cheng Committed by Joey Ye

re PR tree-optimization/43491 (Unnecessary temporary for global register variable)

2011-12-22  Bin Cheng  <bin.cheng@arm.com>
	Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/43491
	* tree-ssa-pre.c (eliminate): Don't replace global register
	variable when it is the RHS of a single assign.

	testsuite:
	* gcc.dg/tree-ssa/pr43491.c: New test.


Co-Authored-By: Richard Guenther <rguenther@suse.de>

From-SVN: r182650
parent 994182df
2011-12-22 Bin Cheng <bin.cheng@arm.com>
Richard Guenther <rguenther@suse.de>
PR tree-optimization/43491
* tree-ssa-pre.c (eliminate): Don't replace global register
variable when it is the RHS of a single assign.
2011-12-22 Joey Ye <joey.ye@arm.com> 2011-12-22 Joey Ye <joey.ye@arm.com>
* toplev.c (process_options): Fix typo. * toplev.c (process_options): Fix typo.
2011-12-22 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/43491
* gcc.dg/tree-ssa/pr43491.c: New test.
2011-12-22 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> 2011-12-22 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR testsuite/50722 PR testsuite/50722
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-pre-stats" } */
#define REGISTER register
#if defined __arm__
# define REG1 asm("r4")
#elif defined __i386__
# define REG1 asm("ebx")
#elif defined __mips__
# define REG1 asm("s0")
#elif defined __x86_64__
# define REG1 asm("rbp")
#else
# undef REGISTER
# define REGISTER
# define REG1
#endif
REGISTER long data_0 REG1;
long data_3;
long foo(long data, long v)
{
long i;
long t, u;
if (data)
i = data_0 + data_3;
else {
v = 2;
i = 5;
}
t = data_0 + data_3;
u = i;
return v * t * u;
}
/* We should not eliminate global register variable when it is the RHS of
a single assignment. */
/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "pre" { target { arm-*-* i?86-*-* mips*-*-* x86_64-*-* } } } } */
/* { dg-final { scan-tree-dump-times "Eliminated: 3" 1 "pre" { target { ! { arm-*-* i?86-*-* mips*-*-* x86_64-*-* } } } } } */
/* { dg-final { cleanup-tree-dump "pre" } } */
...@@ -4161,28 +4161,40 @@ eliminate (void) ...@@ -4161,28 +4161,40 @@ eliminate (void)
{ {
for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi)) for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
{ {
tree lhs = NULL_TREE;
tree rhs = NULL_TREE;
stmt = gsi_stmt (gsi); stmt = gsi_stmt (gsi);
if (gimple_has_lhs (stmt))
lhs = gimple_get_lhs (stmt);
if (gimple_assign_single_p (stmt))
rhs = gimple_assign_rhs1 (stmt);
/* Lookup the RHS of the expression, see if we have an /* Lookup the RHS of the expression, see if we have an
available computation for it. If so, replace the RHS with available computation for it. If so, replace the RHS with
the available computation. */ the available computation.
See PR43491.
We don't replace global register variable when it is a the RHS of
a single assign. We do replace local register variable since gcc
does not guarantee local variable will be allocated in register. */
if (gimple_has_lhs (stmt) if (gimple_has_lhs (stmt)
&& TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME && TREE_CODE (lhs) == SSA_NAME
&& !gimple_assign_ssa_name_copy_p (stmt) && !gimple_assign_ssa_name_copy_p (stmt)
&& (!gimple_assign_single_p (stmt) && (!gimple_assign_single_p (stmt)
|| !is_gimple_min_invariant (gimple_assign_rhs1 (stmt))) || (!is_gimple_min_invariant (rhs)
&& (gimple_assign_rhs_code (stmt) != VAR_DECL
|| !is_global_var (rhs)
|| !DECL_HARD_REGISTER (rhs))))
&& !gimple_has_volatile_ops (stmt) && !gimple_has_volatile_ops (stmt)
&& !has_zero_uses (gimple_get_lhs (stmt))) && !has_zero_uses (lhs))
{ {
tree lhs = gimple_get_lhs (stmt);
tree rhs = NULL_TREE;
tree sprime = NULL; tree sprime = NULL;
pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs); pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs);
pre_expr sprimeexpr; pre_expr sprimeexpr;
if (gimple_assign_single_p (stmt))
rhs = gimple_assign_rhs1 (stmt);
sprimeexpr = bitmap_find_leader (AVAIL_OUT (b), sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
get_expr_value_id (lhsexpr), get_expr_value_id (lhsexpr),
NULL); NULL);
...@@ -4298,10 +4310,9 @@ eliminate (void) ...@@ -4298,10 +4310,9 @@ eliminate (void)
dead. */ dead. */
else if (gimple_assign_single_p (stmt) else if (gimple_assign_single_p (stmt)
&& !is_gimple_reg (gimple_assign_lhs (stmt)) && !is_gimple_reg (gimple_assign_lhs (stmt))
&& (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME && (TREE_CODE (rhs) == SSA_NAME
|| is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))) || is_gimple_min_invariant (rhs)))
{ {
tree rhs = gimple_assign_rhs1 (stmt);
tree val; tree val;
val = vn_reference_lookup (gimple_assign_lhs (stmt), val = vn_reference_lookup (gimple_assign_lhs (stmt),
gimple_vuse (stmt), VN_WALK, NULL); gimple_vuse (stmt), VN_WALK, NULL);
......
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