From 8569df70cc5389814855c62256bd02d3559337ec Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Mon, 5 Nov 2012 21:41:32 +0000 Subject: [PATCH] PR tree-optimization/54986 * gimple-fold.c (canonicalize_constructor_val): Strip again all no-op conversions on entry but add them back on exit if needed. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@193189 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 +++++ gcc/gimple-fold.c | 9 +++++-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.dg/torture/20121105-1.C | 42 +++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/20121105-1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 778c7a65fdb..52aa6f5b190 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-11-05 Eric Botcazou + + PR tree-optimization/54986 + * gimple-fold.c (canonicalize_constructor_val): Strip again all no-op + conversions on entry but add them back on exit if needed. + 2012-11-05 Richard Sandiford PR target/55204 diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 5980854d94d..5e4bd23db51 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -115,7 +115,8 @@ can_refer_decl_in_current_unit_p (tree decl) tree canonicalize_constructor_val (tree cval) { - STRIP_USELESS_TYPE_CONVERSION (cval); + tree orig_cval = cval; + STRIP_NOPS (cval); if (TREE_CODE (cval) == POINTER_PLUS_EXPR && TREE_CODE (TREE_OPERAND (cval, 1)) == INTEGER_CST) { @@ -146,8 +147,12 @@ canonicalize_constructor_val (tree cval) /* Fixup types in global initializers. */ if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0))) cval = build_fold_addr_expr (TREE_OPERAND (cval, 0)); + + if (!useless_type_conversion_p (TREE_TYPE (orig_cval), TREE_TYPE (cval))) + cval = fold_convert (TREE_TYPE (orig_cval), cval); + return cval; } - return cval; + return orig_cval; } /* If SYM is a constant variable with known value, return the value. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5dd0d2899b4..8e2c69b73bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-11-05 Eric Botcazou + + * g++.dg/torture/20121105-1.C: New test. + 2012-11-05 Jakub Jelinek Backported from mainline diff --git a/gcc/testsuite/g++.dg/torture/20121105-1.C b/gcc/testsuite/g++.dg/torture/20121105-1.C new file mode 100644 index 00000000000..03323421a5e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20121105-1.C @@ -0,0 +1,42 @@ +// PR tree-optimization/54986 +// Reported by Remi Vanicat +// Reduced testcase by Markus Trippelsdorf + +struct A; +struct B +{ + int *_ptr; + bool operator==(B *p1) + { + return p1->_ptr; + } +}; +struct C { + A* ref_SYMBptr(); +}; +struct A +{ + B sommet; +}; +typedef C *gen_op_context; +struct D +{ + D(gen_op_context) {} +}; + +D c(0); +const long d = (long)&c; +B *const e = (B *)&d; + +static bool +fn1(C& p1) +{ + return p1.ref_SYMBptr()->sommet == e; +} + +void +fn2() +{ + C b; + fn1(b); +} -- 2.11.0