diff options
author | Jeff Law <law@redhat.com> | 2004-03-17 21:20:38 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2004-03-17 21:20:38 +0000 |
commit | 4fb8639a524338009730052acb75fb3d9c47cfa7 (patch) | |
tree | a2ea097b8cd8e791d08c1eb4302527cb27e24c79 | |
parent | 23422c83b407a5ba236e9aaddb0b18670f2c9757 (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-ssa | 4 | ||||
-rw-r--r-- | gcc/tree-tailcall.c | 9 |
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; |