------- 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