aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-02-13 22:28:03 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2006-02-13 22:28:03 +0100
commit6f538523d1e363cb51f08b52e31062304352e543 (patch)
tree1f4da557cb99e9845fb71b7c810d10b3f6f929cc
parent2ed8d2241e1e3ba077fc6dc3813f202f45414fbe (diff)
downloadgcc-6f538523d1e363cb51f08b52e31062304352e543.zip
gcc-6f538523d1e363cb51f08b52e31062304352e543.tar.gz
gcc-6f538523d1e363cb51f08b52e31062304352e543.tar.bz2
re PR middle-end/26092 (ICE on const function pointer assigned to a builtin function)
PR middle-end/26092 * gimplify.c (gimplify_call_expr): Don't call get_callee_fndecl twice if decl is a builtin. When trying again, call get_callee_fndecl first to verify it is still a builtin. * gcc.c-torture/compile/20060208-1.c: New test. From-SVN: r110927
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c28
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20060208-1.c10
4 files changed, 37 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15c3fc4..46d5b68 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/26092
+ * gimplify.c (gimplify_call_expr): Don't call get_callee_fndecl
+ twice if decl is a builtin. When trying again, call get_callee_fndecl
+ first to verify it is still a builtin.
+
2006-02-13 Geoffrey Keating <geoffk@apple.com>
* dwarf2out.c (base_type_die): Don't add AT_name here.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 7105698..82e747f 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1970,9 +1970,8 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
decl = get_callee_fndecl (*expr_p);
if (decl && DECL_BUILT_IN (decl))
{
- tree fndecl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1);
- tree new = fold_builtin (fndecl, arglist, !want_value);
+ tree new = fold_builtin (decl, arglist, !want_value);
if (new && new != *expr_p)
{
@@ -2026,19 +2025,22 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
/* Try this again in case gimplification exposed something. */
- if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
+ if (ret != GS_ERROR)
{
- tree fndecl = get_callee_fndecl (*expr_p);
- tree arglist = TREE_OPERAND (*expr_p, 1);
- tree new = fold_builtin (fndecl, arglist, !want_value);
-
- if (new && new != *expr_p)
+ decl = get_callee_fndecl (*expr_p);
+ if (decl && DECL_BUILT_IN (decl))
{
- /* There was a transformation of this call which computes the
- same value, but in a more efficient way. Return and try
- again. */
- *expr_p = new;
- return GS_OK;
+ tree arglist = TREE_OPERAND (*expr_p, 1);
+ tree new = fold_builtin (decl, arglist, !want_value);
+
+ if (new && new != *expr_p)
+ {
+ /* There was a transformation of this call which computes the
+ same value, but in a more efficient way. Return and try
+ again. */
+ *expr_p = new;
+ return GS_OK;
+ }
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1139140..1f2fdb7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/26092
+ * gcc.c-torture/compile/20060208-1.c: New test.
+
2006-02-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/26074
diff --git a/gcc/testsuite/gcc.c-torture/compile/20060208-1.c b/gcc/testsuite/gcc.c-torture/compile/20060208-1.c
new file mode 100644
index 0000000..01e471a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20060208-1.c
@@ -0,0 +1,10 @@
+/* PR middle-end/26092 */
+typedef __SIZE_TYPE__ size_t;
+extern void *malloc (size_t);
+
+void *(*const foo) (size_t) = malloc;
+
+void *test (void)
+{
+ return (*foo) (3);
+}