diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr57026.c | 22 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 3 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6349376..fea5059 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-04-23 Richard Biener <rguenther@suse.de> + + 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 <ak@linux.intel.com> * lto/lto.c (print_lto_report_1): Fix LTO report names. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d6be55c..538ed99 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-23 Richard Biener <rguenther@suse.de> + + PR tree-optimization/57026 + * gcc.dg/torture/pr57026.c: New testcase. + 2013-04-22 Janus Weil <janus@gcc.gnu.org> 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 0000000..e378954 --- /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 5b4321a..cb4a09a 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. */ |