re PR tree-optimization/33920 (Segfault in combine_blocks/tree-if-conv.c)

PR tree-optimization/33920
        * tree-if-conv.c (tree_if_conversion): Force predicate of single
        successor bb to true when predecessor bb has NULL predicate.
        (find_phi_replacement_condition): Assert that tmp_cond is non-null.

testsuite/ChangeLog:

        PR tree-optimization/33920
        * gcc.dg/tree-ssa/pr33290.c: New test.

From-SVN: r129696
This commit is contained in:
Uros Bizjak 2007-10-28 15:57:50 +01:00
parent c8d6f9e7e5
commit 77bd31de7e
4 changed files with 74 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2007-10-28 Uros Bizjak <ubizjak@gmail.com>
PR tree-optimization/33920
* tree-if-conv.c (tree_if_conversion): Force predicate of single
successor bb to true when predecessor bb has NULL predicate.
(find_phi_replacement_condition): Assert that tmp_cond is non-null.
2007-10-28 Richard Sandiford <rsandifo@nildram.co.uk>
* config/mips/mips.md: Add combiner patterns for DImode extensions

View File

@ -1,3 +1,9 @@
2007-10-28 Martin Michlmayr <tbm@cyrius.com>
Uros Bizjak <ubizjak@gmail.com>
PR tree-optimization/33920
* gcc.dg/tree-ssa/pr33290.c: New test.
2007-10-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/31306

View File

@ -0,0 +1,51 @@
/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
/* { dg-do compile } */
/* { dg-options "-O3" } */
typedef union lispunion *object;
struct character
{
long e;
};
extern struct symbol Cnil_body;
extern struct symbol Ct_body;
struct vector
{
object *v_self;
};
union lispunion
{
struct vector v;
};
void init_code ()
{
object V659;
object _x, _y;
object V643;
long V648;
unsigned char V653;
object V651;
object V654;
object V658;
T1240:
if (V648 >= (long)V651)
goto T1243;
V653 = ((char *) V654->v.v_self)[V648];
V659 = (object) V654 + V653;
T1261:
V658 =
(object)
V659 ? (object) & Ct_body : (object) & Cnil_body;
if (V658 == (object) & Cnil_body)
goto T1249;
goto T1224;
T1249:
V648 = (long) V648 + 1;
goto T1240;
T1243:
V643 = (object) & Cnil_body;
T1224:
_y = V643;
number_plus (_x, _y);
}

View File

@ -189,8 +189,14 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer)
if (single_succ_p (bb))
{
basic_block bb_n = single_succ (bb);
if (cond != NULL_TREE)
add_to_predicate_list (bb_n, cond);
/* Successor bb inherits predicate of its predecessor. If there
is no predicate in predecessor bb, then consider successor bb
as always executed. */
if (cond == NULL_TREE)
cond = boolean_true_node;
add_to_predicate_list (bb_n, cond);
}
}
@ -724,6 +730,8 @@ find_phi_replacement_condition (struct loop *loop,
/* Select condition that is not TRUTH_NOT_EXPR. */
tmp_cond = (first_edge->src)->aux;
gcc_assert (tmp_cond);
if (TREE_CODE (tmp_cond) == TRUTH_NOT_EXPR)
{
edge tmp_edge;