From 14e4c2af4386b531f94a0ccdeb64d6282bc60415 Mon Sep 17 00:00:00 2001 From: Easwaran Raman Date: Fri, 5 Sep 2014 22:23:26 +0000 Subject: [PATCH] re PR rtl-optimization/62146 (CSE replaces constant with an expression incorrectly) 2014-09-05 Easwaran Raman PR rtl-optimization/62146 * ifcvt.c (dead_or_predicable): Make removal of REG_EQUAL note of hoisted instruction unconditional. testsuite: * testsuite/g++.dg/opt/pr62146.C: New. From-SVN: r214977 --- gcc/ChangeLog | 6 ++++ gcc/ifcvt.c | 7 ++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/opt/pr62146.C | 51 ++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr62146.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 18951b3b47e..07988cdc42c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-09-05 Easwaran Raman + + PR rtl-optimization/62146 + * ifcvt.c (dead_or_predicable): Make removal of REG_EQUAL note of + hoisted instruction unconditional. + 2014-09-05 Segher Boessenkool PR target/63187 diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index eee04cc2d04..bce9fb3f0fe 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -4403,17 +4403,14 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, insn = head; do { - rtx note, set; + rtx note; if (! INSN_P (insn)) continue; note = find_reg_note (insn, REG_EQUAL, NULL_RTX); if (! note) continue; - set = single_set (insn); - if (!set || !function_invariant_p (SET_SRC (set)) - || !function_invariant_p (XEXP (note, 0))) - remove_note (insn, note); + remove_note (insn, note); } while (insn != end && (insn = NEXT_INSN (insn))); /* PR46315: when moving insns above a conditional branch, the REG_EQUAL diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b6422c958eb..582f538857c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-09-05 Easwaran Raman + + PR rtl-optimization/62146 + * testsuite/g++.dg/opt/pr62146.C: New. + 2014-09-05 Marat Zakirov * gcc.dg/vect/vect-109.c: Skip predicate added. diff --git a/gcc/testsuite/g++.dg/opt/pr62146.C b/gcc/testsuite/g++.dg/opt/pr62146.C new file mode 100644 index 00000000000..dbe41743424 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr62146.C @@ -0,0 +1,51 @@ +/* PR rtl-optimization/62146 */ +/* { dg-do compile } */ +/* { dg-options "-O2 " } */ +class F +{ +public: + virtual ~ F (); +}; +template < class CL > class G:public F +{ + int *member_; +public: + G ( int *b): member_ (0) + { + } +}; + +class D +{ +public: + template < class CL > void RegisterNonTagCallback (int, + void (CL:: + *p3) ()) + { + InternalRegisterNonTag (p3 ? new G < CL > ( 0) : 0); + } void InternalRegisterNonTag (F *); +}; + +void fn1 (); +class C1 +{ + void foo(); + class TokenType + { + public: + void AddToken () + { + } + }; + C1::TokenType bar_t; +}; +D a; +void C1::foo() +{ + if (&bar_t) + fn1 (); + for (int i = 0; i < sizeof 0; ++i) + a.RegisterNonTagCallback (0, &TokenType::AddToken); +} + +/* { dg-final { scan-assembler-not "mov.*_ZN2C19TokenType8AddTokenEv, .\\\(" } } */ -- 2.30.2