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:
parent
57b4d355a1
commit
6c66f73369
|
@ -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>
|
2011-05-20 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR middle-end/48849
|
PR middle-end/48849
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Statement simplification on GIMPLE.
|
/* 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.
|
Split out from tree-ssa-ccp.c.
|
||||||
|
|
||||||
This file is part of GCC.
|
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)
|
else if (TREE_CODE (arg) == SSA_NAME)
|
||||||
{
|
{
|
||||||
tree temp = and_var_with_comparison (arg, invert,
|
tree temp;
|
||||||
code2, op2a, op2b);
|
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)
|
if (!temp)
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
else if (!result)
|
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)
|
else if (TREE_CODE (arg) == SSA_NAME)
|
||||||
{
|
{
|
||||||
tree temp = or_var_with_comparison (arg, invert,
|
tree temp;
|
||||||
code2, op2a, op2b);
|
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)
|
if (!temp)
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
else if (!result)
|
else if (!result)
|
||||||
|
|
|
@ -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>
|
2011-06-19 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
PR fortran/18918
|
PR fortran/18918
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/* Combining of if-expressions on trees.
|
/* 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>
|
Contributed by Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
@ -625,6 +625,7 @@ tree_ssa_ifcombine (void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
bbs = blocks_in_phiopt_order ();
|
bbs = blocks_in_phiopt_order ();
|
||||||
|
calculate_dominance_info (CDI_DOMINATORS);
|
||||||
|
|
||||||
for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; ++i)
|
for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; ++i)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue