From 999c11718ded2d02734a6ecdf7572f7467cf5dc6 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 23 Apr 2013 08:08:25 +0000 Subject: [PATCH] re PR middle-end/57026 (ice: SSA corruption) 2013-04-23 Richard Biener PR tree-optimization/57026 * tree-vrp.c (simplify_conversion_using_ranges): Do not propagate from SSA names occuring in abnormal PHI nodes. * gcc.dg/torture/pr57026.c: New testcase. From-SVN: r198175 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr57026.c | 22 ++++++++++++++++++++++ gcc/tree-vrp.c | 3 ++- 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr57026.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63493767893..fea5059e8e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-04-23 Richard Biener + + PR tree-optimization/57026 + * tree-vrp.c (simplify_conversion_using_ranges): Do not propagate + from SSA names occuring in abnormal PHI nodes. + 2013-04-22 Andi Kleen * lto/lto.c (print_lto_report_1): Fix LTO report names. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d6be55c605f..538ed997b2d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-23 Richard Biener + + PR tree-optimization/57026 + * gcc.dg/torture/pr57026.c: New testcase. + 2013-04-22 Janus Weil PR fortran/53685 diff --git a/gcc/testsuite/gcc.dg/torture/pr57026.c b/gcc/testsuite/gcc.dg/torture/pr57026.c new file mode 100644 index 00000000000..e37895486d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57026.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +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 = 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 = f; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 5b4321a3a27..cb4a09aa75c 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -8752,7 +8752,8 @@ simplify_conversion_using_ranges (gimple stmt) || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))) return false; innerop = gimple_assign_rhs1 (def_stmt); - if (TREE_CODE (innerop) != SSA_NAME) + if (TREE_CODE (innerop) != SSA_NAME + || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop)) return false; /* Get the value-range of the inner operand. */ -- 2.30.2