summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2003-01-24 21:16:28 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2003-01-24 21:16:28 +0000
commitcb9d405836c280a57170367f2f8e7d771c947097 (patch)
tree0ab1633992a620c31958f8f01d9cf11360a40f20
parent375540a17ffa3809caa9226dacc86587a3cb6bcf (diff)
downloadppe42-gcc-cb9d405836c280a57170367f2f8e7d771c947097.tar.gz
ppe42-gcc-cb9d405836c280a57170367f2f8e7d771c947097.zip
PR optimization/4382
* tree-inline.c (find_builtin_longjmp_call_1): New. (find_builtin_longjmp_call): New. (inlinable_function_p): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61732 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-inline.c41
2 files changed, 45 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f22df791000..1217bce6c85 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-01-24 Richard Henderson <rth@redhat.com>
+
+ PR optimization/4382
+ * tree-inline.c (find_builtin_longjmp_call_1): New.
+ (find_builtin_longjmp_call): New.
+ (inlinable_function_p): Use it.
+
2003-01-24 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* config/i386/i386-protos.h (function_arg_pass_by_reference): Declare.
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 110f93889c9..b095f121a87 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -125,6 +125,8 @@ static tree add_stmt_to_compound PARAMS ((tree, tree, tree));
#endif /* INLINER_FOR_JAVA */
static tree find_alloca_call_1 PARAMS ((tree *, int *, void *));
static tree find_alloca_call PARAMS ((tree));
+static tree find_builtin_longjmp_call_1 PARAMS ((tree *, int *, void *));
+static tree find_builtin_longjmp_call PARAMS ((tree));
/* The approximate number of instructions per statement. This number
need not be particularly accurate; it is used only to make
@@ -873,7 +875,7 @@ tree_inlinable_function_p (fn)
return inlinable_function_p (fn, NULL);
}
-/* if *TP is possibly call to alloca, return nonzero. */
+/* If *TP is possibly call to alloca, return nonzero. */
static tree
find_alloca_call_1 (tp, walk_subtrees, data)
tree *tp;
@@ -885,8 +887,7 @@ find_alloca_call_1 (tp, walk_subtrees, data)
return NULL;
}
-/* Return subexpression representing possible alloca call,
- if any. */
+/* Return subexpression representing possible alloca call, if any. */
static tree
find_alloca_call (exp)
tree exp;
@@ -894,6 +895,32 @@ find_alloca_call (exp)
return walk_tree (&exp, find_alloca_call_1, NULL, NULL);
}
+static tree
+find_builtin_longjmp_call_1 (tp, walk_subtrees, data)
+ tree *tp;
+ int *walk_subtrees ATTRIBUTE_UNUSED;
+ void *data ATTRIBUTE_UNUSED;
+{
+ tree exp = *tp, decl;
+
+ if (TREE_CODE (exp) == CALL_EXPR
+ && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
+ && (decl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
+ TREE_CODE (decl) == FUNCTION_DECL)
+ && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
+ && DECL_FUNCTION_CODE (decl) == BUILT_IN_LONGJMP)
+ return decl;
+
+ return NULL;
+}
+
+static tree
+find_builtin_longjmp_call (exp)
+ tree exp;
+{
+ return walk_tree (&exp, find_builtin_longjmp_call_1, NULL, NULL);
+}
+
/* Returns nonzero if FN is a function that can be inlined into the
inlining context ID_. If ID_ is NULL, check whether the function
can be inlined at all. */
@@ -934,6 +961,14 @@ inlinable_function_p (fn, id)
else if (! (*lang_hooks.tree_inlining.disregard_inline_limits) (fn)
&& currfn_insns > MAX_INLINE_INSNS_SINGLE)
;
+ /* We can't inline functions that call __builtin_longjmp at all.
+ The non-local goto machenery really requires the destination
+ be in a different function. If we allow the function calling
+ __builtin_longjmp to be inlined into the function calling
+ __builtin_setjmp, Things will Go Awry. */
+ /* ??? Need front end help to identify "regular" non-local goto. */
+ else if (find_builtin_longjmp_call (DECL_SAVED_TREE (fn)))
+ ;
/* Refuse to inline alloca call unless user explicitly forced so as this may
change program's memory overhead drastically when the function using alloca
is called in loop. In GCC present in SPEC2000 inlining into schedule_block
OpenPOWER on IntegriCloud