aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2004-03-17 21:20:38 +0000
committerJeff Law <law@redhat.com>2004-03-17 21:20:38 +0000
commit4fb8639a524338009730052acb75fb3d9c47cfa7 (patch)
treea2ea097b8cd8e791d08c1eb4302527cb27e24c79
parent23422c83b407a5ba236e9aaddb0b18670f2c9757 (diff)
* tree-tailcall.c (find_tail_calls): Tighten test for tail recursion.
git-svn-id: https://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;