aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-17 21:20:38 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-17 21:20:38 +0000
commitacce927a74df27abf0920b633f01794010ecfbf4 (patch)
treea2ea097b8cd8e791d08c1eb4302527cb27e24c79
parente0146b4fb0a685f8e3be9afe85030d1b298bdaf5 (diff)
* tree-tailcall.c (find_tail_calls): Tighten test for tail recursion.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/tree-ssa-20020619-branch@79606 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.tree-ssa4
-rw-r--r--gcc/tree-tailcall.c9
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/ChangeLog.tree-ssa b/gcc/ChangeLog.tree-ssa
index cabec93c03d..b08d8a57384 100644
--- a/gcc/ChangeLog.tree-ssa
+++ b/gcc/ChangeLog.tree-ssa
@@ -1,3 +1,7 @@
+2004-03-17 Jeff Law <law@redhat.com>
+
+ * tree-tailcall.c (find_tail_calls): Tighten test for tail recursion.
+
2004-03-17 Diego Novillo <dnovillo@redhat.com>
PR optimization/14511
diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index 41887dd7eb6..b32f8998ad5 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -407,8 +407,13 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
param && args;
param = TREE_CHAIN (param), args = TREE_CHAIN (args))
if (param != TREE_VALUE (args)
- /* Make sure there are no problems with copying. */
- && !is_gimple_reg_type (TREE_TYPE (param)))
+ /* Make sure there are no problems with copying. Note we must
+ have a copyable type and the two arguments must have reasonably
+ equivalent types. The latter requirement could be relaxed if
+ we emitted a suitable type conversion statement. */
+ && (!is_gimple_reg_type (TREE_TYPE (param))
+ || (TYPE_MAIN_VARIANT (TREE_TYPE (param))
+ != TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (args))))))
break;
if (!args && !param)
tail_recursion = true;