From: Jakub Jelinek Date: Fri, 19 Dec 2003 13:39:05 +0000 (+0100) Subject: re PR c++/13239 (Assertion does not seem to work correctly anymore) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=effed6551681c1411cfaebeb005979cb6996e528;p=gcc.git re PR c++/13239 (Assertion does not seem to work correctly anymore) PR c++/13239 * builtins.c (expand_builtin_expect_jump): Update TREE_VALUE (arglist) if unsave_expr_now langhook created a new tree. * g++.dg/opt/expect1.C: New test. From-SVN: r74832 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2865dcbb40..dec8a807a4b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-12-19 Jakub Jelinek + + PR c++/13239 + * builtins.c (expand_builtin_expect_jump): Update + TREE_VALUE (arglist) if unsave_expr_now langhook + created a new tree. + 2003-12-19 Richard Earnshaw * arm.c (thumb_base_register_rtx_p): Use regno in comparison against diff --git a/gcc/builtins.c b/gcc/builtins.c index ba624463660..d3dfb8824d7 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4460,6 +4460,14 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label) ret = get_insns (); end_sequence (); + /* For mildly unsafe builtin jump's, if unsave_expr_now + creates a new tree instead of changing the old one + TREE_VALUE (arglist) needs to be updated. */ + if (arg0 != TREE_VALUE (arglist) + && TREE_CODE (arg0) == UNSAVE_EXPR + && TREE_OPERAND (arg0, 0) != TREE_VALUE (arglist)) + TREE_VALUE (arglist) = TREE_OPERAND (arg0, 0); + /* Now that the __builtin_expect has been validated, go through and add the expect's to each of the conditional jumps. If we run into an error, just give up and generate the 'safe' code of doing a SCC diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 073216aba1b..3010412fce1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-12-19 Jakub Jelinek + + PR c++/13239 + * g++.dg/opt/expect1.C: New test. + 2003-12-19 Hartmut Penner * gcc.dg/altivec-varargs-1.c: Enable testcase on ppc linux. diff --git a/gcc/testsuite/g++.dg/opt/expect1.C b/gcc/testsuite/g++.dg/opt/expect1.C new file mode 100644 index 00000000000..90a871f377a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/expect1.C @@ -0,0 +1,17 @@ +// PR c++/13239 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); + +struct Y { + int i; +}; + +bool foo () { return true; } +Y bar () { Y y = {0}; return y; } + +int main () +{ + __builtin_expect (foo () && (bar ().i) == 0, 0) ? 0 : (abort (), 1); +}