From: Jakub Jelinek Date: Thu, 7 Jul 2016 21:43:34 +0000 (+0200) Subject: backport: re PR tree-optimization/64280 (ICE in replace_uses_by, at tree-cfg.c:1789) X-Git-Tag: releases/gcc-4.9.4~98 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e39c899574f426e0c5f341f28e2f8b7b5f86a975;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/64280 (ICE in replace_uses_by, at tree-cfg.c:1789) Backported from mainline 2014-12-12 Richard Biener PR middle-end/64280 * tree-cfg.c (replace_uses_by): Guard assert properly. * g++.dg/torture/pr64280.C: New testcase. From-SVN: r238132 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78a009c3a458..5b4d4dfe847e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-07-07 Jakub Jelinek + + Backported from mainline + 2014-12-12 Richard Biener + + PR middle-end/64280 + * tree-cfg.c (replace_uses_by): Guard assert properly. + 2016-07-07 Richard Biener Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 650afb05ed11..445c86baa9eb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-07-07 Jakub Jelinek + + Backported from mainline + 2014-12-12 Richard Biener + + PR middle-end/64280 + * g++.dg/torture/pr64280.C: New testcase. + 2016-07-07 Richard Biener Backport from mainline diff --git a/gcc/testsuite/g++.dg/torture/pr64280.C b/gcc/testsuite/g++.dg/torture/pr64280.C new file mode 100644 index 000000000000..6ea31481bd57 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr64280.C @@ -0,0 +1,42 @@ +// { dg-do compile } + +class A +{ +public: + A (); +}; +class B +{ +public: + B (int); + operator void *() { return m_fn1 () ? 0 : this; } + int m_fn1 (); +}; +typedef int jmp_buf[]; +struct C +{ + jmp_buf cond_; +}; +class F +{ + C what_; + bool m_fn2 (); +}; +int _setjmp (int[]); +void longjmp (); +class D +{ +public: + D () { longjmp (); } +}; +bool +F::m_fn2 () +{ + B a (0); + if (a) + if (_setjmp (what_.cond_)) + return 0; + else + D (); + A b; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 1469d782f733..1dc221099027 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1719,7 +1719,8 @@ replace_uses_by (tree name, tree val) if (gimple_code (stmt) == GIMPLE_PHI) { e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use)); - if (e->flags & EDGE_ABNORMAL) + if (e->flags & EDGE_ABNORMAL + && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val)) { /* This can only occur for virtual operands, since for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))