------- Comment #5 from zadeck at naturalbridge dot com 2008-05-10 20:29 ------- Subject: Re: [4.4 Regression] wrong code with -O2 -fgcse-sm
rguenth at gcc dot gnu dot org wrote: > ------- Comment #3 from rguenth at gcc dot gnu dot org 2008-05-09 15:04 > ------- > Kenny, that's your PURE/CONST patch. > > > I am checking this in as obvious because given the frag from the first pure const patch, this is an obvious fix. I left out the '!' when I converted this conditional. (I also discussed this with Iant before i tested the fix). The patch was tested on x86-64. committed as revision 135185. Kenny @@ -5987,7 +5987,7 @@ store_killed_in_insn (const_rtx x, const { /* A normal or pure call might read from pattern, but a const call will not. */ - if (! CONST_OR_PURE_CALL_P (insn) || pure_call_p (insn)) + if (RTL_CONST_CALL_P (insn)) return true; /* But even a const call reads its parameters. Check whether the 2008-05-10 Kenneth Zadeck <[EMAIL PROTECTED]> * gcse.c (store_killed_in_insn): Negated call to RTL_CONST_CALL_P. 2008-05-10 Kenneth Zadeck <[EMAIL PROTECTED]> PR rtl-optimization/36185 * g++.dg/opt/pr36185.C Index: ChangeLog =================================================================== --- ChangeLog (revision 135153) +++ ChangeLog (working copy) @@ -1,3 +1,7 @@ +2008-05-10 Kenneth Zadeck <[EMAIL PROTECTED]> + + * gcse.c (store_killed_in_insn): Negated call to RTL_CONST_CALL_P. + 2008-05-10 H.J. Lu <[EMAIL PROTECTED]> * config/i386/i386.c (bdesc_ptest): Removed. Index: testsuite/g++.dg/opt/pr36185.C =================================================================== --- testsuite/g++.dg/opt/pr36185.C (revision 0) +++ testsuite/g++.dg/opt/pr36185.C (revision 0) @@ -0,0 +1,24 @@ +// PR rtl-optimization/36185 +// { dg-do run } +// { dg-options "-O2 -fgcse-sm" } + +struct Base { + virtual ~Base() {} + virtual void f() = 0; +}; +struct Derived : Base { + Derived(); + virtual void f() {} +}; +struct Foo { + Foo(Base&); +}; +Derived::Derived() { + Foo foo(*this); +} +Foo::Foo(Base& base) { + base.f(); +} +int main() { + Derived d; +} Index: gcse.c =================================================================== --- gcse.c (revision 135153) +++ gcse.c (working copy) @@ -5987,7 +5987,7 @@ store_killed_in_insn (const_rtx x, const { /* A normal or pure call might read from pattern, but a const call will not. */ - if (RTL_CONST_CALL_P (insn)) + if (!RTL_CONST_CALL_P (insn)) return true; /* But even a const call reads its parameters. Check whether the -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36185