From 73dab33bce6cc186f05ac0cf45e42c58f9086b3c Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Mon, 19 Jun 2006 19:09:57 -0700 Subject: [PATCH] re PR middle-end/28075 (inliner introduces unnecessary type conversions) 2006-06-19 Andrew Pinski PR middle-end/28075 * tree-inline.c (setup_one_parameter): Strip useless type conversion before adding it to the IR. (declare_return_variable): Likewise. 2006-06-19 Andrew Pinski PR middle-end/28075 * gcc.dg/tree-ssa/inline-1.c: New test. From-SVN: r114801 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 7 ++++++- gcc/testsuite/gcc.dg/tree-ssa/inline-1.c | 25 ++++++++++++++++++++++++ gcc/tree-inline.c | 4 ++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/inline-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d1e6d074138..39489118b60b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-06-19 Andrew Pinski + + PR middle-end/28075 + * tree-inline.c (setup_one_parameter): Strip useless + type conversion before adding it to the IR. + (declare_return_variable): Likewise. + 2006-06-19 Martin Michlmayr PR c/27149 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 50ead2ca9461..96c862877850 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2006-06-19 Anatoly Sokolov +2006-06-19 Andrew Pinski + + PR middle-end/28075 + * gcc.dg/tree-ssa/inline-1.c: New test. + +2006-06-19 Anatoly Sokolov * gcc.dg/pr18241-1.c: Use __SIZE_TYPE__ instead of unsigned long in malloc prototype; remove XFAIL. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-1.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-1.c new file mode 100644 index 000000000000..bbf7e83aacf7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-1.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-final_cleanup" } */ + + +typedef struct { + double min; + double max; +} interval; +inline interval add(interval x, interval y) __attribute__((always_inline)); +inline interval add(interval x, interval y) +{ + interval r; + r.min = x.min + y.min; + r.max = x.max + y.max; + return r; +} +interval foo (interval a, interval b, interval c) +{ + return add (a, add (b, c)); +} + + +/* { dg-final { scan-tree-dump-times "\(struct interval\)" 0 "final_cleanup"} } */ +/* { dg-final { cleanup-tree-dump "final_cleanup" } } */ + diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 3aeb7b61341c..4749be519e3f 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1081,6 +1081,8 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn, if (rhs == error_mark_node) return; + + STRIP_USELESS_TYPE_CONVERSION (rhs); /* We want to use MODIFY_EXPR, not INIT_EXPR here so that we keep our trees in gimple form. */ @@ -1267,6 +1269,8 @@ declare_return_variable (copy_body_data *id, tree return_slot_addr, use = var; if (!lang_hooks.types_compatible_p (TREE_TYPE (var), caller_type)) use = fold_convert (caller_type, var); + + STRIP_USELESS_TYPE_CONVERSION (use); done: /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that