aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2003-12-19 14:39:05 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2003-12-19 14:39:05 +0100
commiteffed6551681c1411cfaebeb005979cb6996e528 (patch)
tree6bb121a9a36677cc5cb47841903d0d894ded6ae6 /gcc
parentc05fc0c2e1dc82c3e8c53a8d492bd7e0578868ec (diff)
downloadgcc-effed6551681c1411cfaebeb005979cb6996e528.zip
gcc-effed6551681c1411cfaebeb005979cb6996e528.tar.gz
gcc-effed6551681c1411cfaebeb005979cb6996e528.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/expect1.C17
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2865dc..dec8a80 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-12-19 Jakub Jelinek <jakub@redhat.com>
+
+ 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 <rearnsha@arm.com>
* arm.c (thumb_base_register_rtx_p): Use regno in comparison against
diff --git a/gcc/builtins.c b/gcc/builtins.c
index ba62446..d3dfb88 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 073216a..3010412 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-12-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/13239
+ * g++.dg/opt/expect1.C: New test.
+
2003-12-19 Hartmut Penner <hpenner@de.ibm.com>
* 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 0000000..90a871f
--- /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);
+}