aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2004-12-14 19:04:56 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2004-12-14 19:04:56 +0100
commit29bfcb6de7ffe290a8944f067eaba33622bac5f2 (patch)
tree138d28ee62311126a15e66e1d41d8da6f421547a /gcc
parent2a1a3cd51f8bb928fe7291d8dcb84492bc49f6ed (diff)
downloadgcc-29bfcb6de7ffe290a8944f067eaba33622bac5f2.zip
gcc-29bfcb6de7ffe290a8944f067eaba33622bac5f2.tar.gz
gcc-29bfcb6de7ffe290a8944f067eaba33622bac5f2.tar.bz2
re PR middle-end/18951 (Invalid code generated by expand_errno_check)
PR middle-end/18951 * builtins.c (expand_builtin_mathfn, expand_builtin_mathfn_2, expand_builtin_mathfn_3): Avoid using arguments passed to save_expr after that call. * gcc.c-torture/execute/20041213-1.c: New test. From-SVN: r92151
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/builtins.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20041213-1.c17
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fc0e9b6..4368aea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2004-12-14 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/18951
+ * builtins.c (expand_builtin_mathfn, expand_builtin_mathfn_2,
+ expand_builtin_mathfn_3): Avoid using arguments passed to
+ save_expr after that call.
+
* fold-const.c (fold_single_bit_test): If flag_syntax_only, pretend
LOAD_EXTEND_OP is not defined.
(fold): Likewise. If flag_syntax_only, don't depend on BITS_PER_WORD.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index dfad35c..a6a80cf 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -1771,6 +1771,7 @@ expand_builtin_mathfn (tree exp, rtx target, rtx subtarget)
narg = builtin_save_expr (arg);
if (narg != arg)
{
+ arg = narg;
arglist = build_tree_list (NULL_TREE, arg);
exp = build_function_call_expr (fndecl, arglist);
}
@@ -1910,6 +1911,7 @@ expand_builtin_mathfn_2 (tree exp, rtx target, rtx subtarget)
narg = builtin_save_expr (arg1);
if (narg != arg1)
{
+ arg1 = narg;
temp = build_tree_list (NULL_TREE, narg);
stable = false;
}
@@ -1919,6 +1921,7 @@ expand_builtin_mathfn_2 (tree exp, rtx target, rtx subtarget)
narg = builtin_save_expr (arg0);
if (narg != arg0)
{
+ arg0 = narg;
arglist = tree_cons (NULL_TREE, narg, temp);
stable = false;
}
@@ -2029,6 +2032,7 @@ expand_builtin_mathfn_3 (tree exp, rtx target, rtx subtarget)
narg = save_expr (arg);
if (narg != arg)
{
+ arg = narg;
arglist = build_tree_list (NULL_TREE, arg);
exp = build_function_call_expr (fndecl, arglist);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 18420bf..720506d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-12-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/18951
+ * gcc.c-torture/execute/20041213-1.c: New test.
+
2004-12-14 Nathan Sidwell <nathan@codesourcery.com>
PR c++/18949
diff --git a/gcc/testsuite/gcc.c-torture/execute/20041213-1.c b/gcc/testsuite/gcc.c-torture/execute/20041213-1.c
new file mode 100644
index 0000000..07bdf68
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20041213-1.c
@@ -0,0 +1,17 @@
+extern double sqrt (double);
+extern void abort (void);
+int once;
+
+double foo (void)
+{
+ if (once++)
+ abort ();
+ return 0.0 / 0.0;
+}
+
+double x;
+int main (void)
+{
+ x = sqrt (foo ());
+ return 0;
+}