re PR tree-optimization/79411 (ICE: SSA corruption (fail_abnormal_edge_coalesce))
PR tree-optimization/79411 * tree-ssa-reassoc.c (is_reassociable_op): Return false if stmt operands are SSA_NAMEs used in abnormal phis. (can_reassociate_p): Return false if op is SSA_NAME used in abnormal phis. * gcc.c-torture/compile/pr79411.c: New test. From-SVN: r245324
This commit is contained in:
parent
e8f45b6c35
commit
6139a3b76c
4 changed files with 49 additions and 1 deletions
|
@ -1,3 +1,11 @@
|
|||
2017-02-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/79411
|
||||
* tree-ssa-reassoc.c (is_reassociable_op): Return false if
|
||||
stmt operands are SSA_NAMEs used in abnormal phis.
|
||||
(can_reassociate_p): Return false if op is SSA_NAME used in abnormal
|
||||
phis.
|
||||
|
||||
2017-02-09 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
PR ipa/70795
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2017-02-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/79411
|
||||
* gcc.c-torture/compile/pr79411.c: New test.
|
||||
|
||||
2017-02-09 Jakub Jelinek <jakub@redhat.com>
|
||||
Jason Merrill <jason@redhat.com>
|
||||
|
||||
|
|
22
gcc/testsuite/gcc.c-torture/compile/pr79411.c
Normal file
22
gcc/testsuite/gcc.c-torture/compile/pr79411.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* PR tree-optimization/79411 */
|
||||
|
||||
typedef struct __jmp_buf_tag { char buf[1024]; } jmp_buf[1];
|
||||
extern int setjmp (jmp_buf);
|
||||
extern int bar (unsigned int *);
|
||||
extern jmp_buf *baz (void);
|
||||
struct C { int c1; unsigned int c2, c3, c4; };
|
||||
|
||||
void
|
||||
foo (struct C *x, const int *y, unsigned int *z, unsigned int e, unsigned int g)
|
||||
{
|
||||
unsigned int d = 0;
|
||||
unsigned long f;
|
||||
setjmp (*baz ());
|
||||
f = 1 + d;
|
||||
if ((x->c1 || x->c2) && g && (!e || d >= 8))
|
||||
d = 16;
|
||||
else
|
||||
d = 8;
|
||||
if ((!x->c3 && !x->c4 || *y == 0) && !e && bar (z))
|
||||
*z = 1 + f;
|
||||
}
|
|
@ -605,7 +605,18 @@ is_reassociable_op (gimple *stmt, enum tree_code code, struct loop *loop)
|
|||
if (is_gimple_assign (stmt)
|
||||
&& gimple_assign_rhs_code (stmt) == code
|
||||
&& has_single_use (gimple_assign_lhs (stmt)))
|
||||
return true;
|
||||
{
|
||||
tree rhs1 = gimple_assign_rhs1 (stmt);
|
||||
tree rhs2 = gimple_assign_rhs1 (stmt);
|
||||
if (TREE_CODE (rhs1) == SSA_NAME
|
||||
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
|
||||
return false;
|
||||
if (rhs2
|
||||
&& TREE_CODE (rhs2) == SSA_NAME
|
||||
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -4989,6 +5000,8 @@ static bool
|
|||
can_reassociate_p (tree op)
|
||||
{
|
||||
tree type = TREE_TYPE (op);
|
||||
if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
|
||||
return false;
|
||||
if ((ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type))
|
||||
|| NON_SAT_FIXED_POINT_TYPE_P (type)
|
||||
|| (flag_associative_math && FLOAT_TYPE_P (type)))
|
||||
|
|
Loading…
Add table
Reference in a new issue