re PR tree-optimization/49073 (g++ optimizer breaks do-while code)

PR tree-optimization/49073
	* gimple-fold.c (and_comparisons_1, or_comparisons_1): Return
	NULL if PHI argument is SSA_NAME, whose def_stmt is dominated
	by the PHI.
	* tree-ssa-ifcombine.c (tree_ssa_ifcombine): Calculate dominators.

	* gcc.c-torture/execute/pr49073.c: New test.

From-SVN: r173948
This commit is contained in:
Jakub Jelinek 2011-05-20 16:19:05 +02:00 committed by Jakub Jelinek
parent 57b4d355a1
commit 6c66f73369
5 changed files with 68 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2011-05-20 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/49073
* gimple-fold.c (and_comparisons_1, or_comparisons_1): Return
NULL if PHI argument is SSA_NAME, whose def_stmt is dominated
by the PHI.
* tree-ssa-ifcombine.c (tree_ssa_ifcombine): Calculate dominators.
2011-05-20 Richard Guenther <rguenther@suse.de>
PR middle-end/48849

View File

@ -1,5 +1,5 @@
/* Statement simplification on GIMPLE.
Copyright (C) 2010 Free Software Foundation, Inc.
Copyright (C) 2010, 2011 Free Software Foundation, Inc.
Split out from tree-ssa-ccp.c.
This file is part of GCC.
@ -2278,8 +2278,19 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
}
else if (TREE_CODE (arg) == SSA_NAME)
{
tree temp = and_var_with_comparison (arg, invert,
code2, op2a, op2b);
tree temp;
gimple def_stmt = SSA_NAME_DEF_STMT (arg);
/* In simple cases we can look through PHI nodes,
but we have to be careful with loops.
See PR49073. */
if (! dom_info_available_p (CDI_DOMINATORS)
|| gimple_bb (def_stmt) == gimple_bb (stmt)
|| dominated_by_p (CDI_DOMINATORS,
gimple_bb (def_stmt),
gimple_bb (stmt)))
return NULL_TREE;
temp = and_var_with_comparison (arg, invert, code2,
op2a, op2b);
if (!temp)
return NULL_TREE;
else if (!result)
@ -2728,8 +2739,19 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
}
else if (TREE_CODE (arg) == SSA_NAME)
{
tree temp = or_var_with_comparison (arg, invert,
code2, op2a, op2b);
tree temp;
gimple def_stmt = SSA_NAME_DEF_STMT (arg);
/* In simple cases we can look through PHI nodes,
but we have to be careful with loops.
See PR49073. */
if (! dom_info_available_p (CDI_DOMINATORS)
|| gimple_bb (def_stmt) == gimple_bb (stmt)
|| dominated_by_p (CDI_DOMINATORS,
gimple_bb (def_stmt),
gimple_bb (stmt)))
return NULL_TREE;
temp = or_var_with_comparison (arg, invert, code2,
op2a, op2b);
if (!temp)
return NULL_TREE;
else if (!result)

View File

@ -1,3 +1,8 @@
2011-05-20 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/49073
* gcc.c-torture/execute/pr49073.c: New test.
2011-06-19 Tobias Burnus <burnus@net-b.de>
PR fortran/18918

View File

@ -0,0 +1,26 @@
/* PR tree-optimization/49073 */
extern void abort (void);
int a[] = { 1, 2, 3, 4, 5, 6, 7 }, c;
int
main ()
{
int d = 1, i = 1;
_Bool f = 0;
do
{
d = a[i];
if (f && d == 4)
{
++c;
break;
}
i++;
f = (d == 3);
}
while (d < 7);
if (c != 1)
abort ();
return 0;
}

View File

@ -1,5 +1,5 @@
/* Combining of if-expressions on trees.
Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
Contributed by Richard Guenther <rguenther@suse.de>
This file is part of GCC.
@ -625,6 +625,7 @@ tree_ssa_ifcombine (void)
int i;
bbs = blocks_in_phiopt_order ();
calculate_dominance_info (CDI_DOMINATORS);
for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; ++i)
{