------- Comment #6 from hp at bitrange dot com  2008-05-09 03:49 -------
Subject: Re:  [4.4 Regression] g++.dg/opt/pr23714.C
 ICEs with 135041 -> 135057

On Thu, 8 May 2008, zadeck at naturalbridge dot com wrote:
> I am testing this patch on x86.  But hp needs to test it on the cris
> before i will ask for approval.

For the record, anyone can test this target using
<gcc.gnu.org/simtest-howto.html> and
<http://gcc.gnu.org/ml/gcc-patches/2007-02/msg01571.html>.
Anyway, I'm doing it; I just made a baseline run.

The patch was malformed; applying it gave:
patching file doc/rtl.texi
patching file dce.c
Hunk #1 succeeded at 99 with fuzz 2.
Hunk #3 FAILED at 388.
1 out of 3 hunks FAILED -- saving rejects to file dce.c.rej

Apparently TABs had been expanded or something.  I applied the
rejected part manually and I'm testing the patch in the
attachment, which I hope is the same as what you have.

(I suggest attaching patches to the PR's by uploading them or
sending them as attachments; not cutnpasting into the web form
or whatever happened.  I sure hope the same doesn't happen to
this one!)

Thanks for your quick action!

brgds, H-PIndex: doc/rtl.texi
===================================================================
--- doc/rtl.texi        (revision 135097)
+++ doc/rtl.texi        (working copy)
@@ -559,14 +559,37 @@
 perhaps with the help of base registers.
 Stored in the @code{unchanging} field and printed as @samp{/u}.

[EMAIL PROTECTED] CONST_OR_PURE_CALL_P
[EMAIL PROTECTED] RTL_CONST_CALL_P
 @cindex @code{call_insn} and @samp{/u}
 @cindex @code{unchanging}, in @code{call_insn}
[EMAIL PROTECTED] CONST_OR_PURE_CALL_P (@var{x})
-In a @code{call_insn}, @code{note}, or an @code{expr_list} for notes,
-indicates that the insn represents a call to a const or pure function.
-Stored in the @code{unchanging} field and printed as @samp{/u}.
[EMAIL PROTECTED] RTLCONST_OR_PURE_CALL_P (@var{x})
+In a @code{call_insn} indicates that the insn represents a call to a
+const function.  Stored in the @code{unchanging} field and printed as
[EMAIL PROTECTED]/u}.

[EMAIL PROTECTED] RTL_PURE_CALL_P
[EMAIL PROTECTED] @code{call_insn} and @samp{/i}
[EMAIL PROTECTED] @code{return_val}, in @code{call_insn}
[EMAIL PROTECTED] RTLCONST_OR_PURE_CALL_P (@var{x})
+In a @code{call_insn} indicates that the insn represents a call to a
+pure function.  Stored in the @code{return_val} field and printed as
[EMAIL PROTECTED]/i}.
+
[EMAIL PROTECTED] RTL_CONST_OR_PURE_CALL_P
[EMAIL PROTECTED] @code{call_insn} and @samp{/u} or @samp{/i}
[EMAIL PROTECTED] RTL_CONST_OR_PURE_CALL_P (@var{x})
+In a @code{call_insn}, true if @code{RTL_CONST_CALL_P} or
[EMAIL PROTECTED] is true.
+
[EMAIL PROTECTED] RTL_LOOPING_CONST_OR_PURE_CALL_P
[EMAIL PROTECTED] @code{call_insn} and @samp{/c}
[EMAIL PROTECTED] @code{call}, in @code{call_insn}
[EMAIL PROTECTED] RTL_LOOPING_CONST_OR_PURE_CALL_P (@var{x})
+In a @code{call_insn} indicates that the insn represents a possibly
+infinite looping call to a const or pure function.  Stored in the
[EMAIL PROTECTED] field and printed as @samp{/c}.  Only true if one of
[EMAIL PROTECTED] or @code{RTL_PURE_CALL_P} is true.
+
 @findex INSN_ANNULLED_BRANCH_P
 @cindex @code{jump_insn} and @samp{/u}
 @cindex @code{call_insn} and @samp{/u}
@@ -869,6 +892,9 @@
 @item call
 In a @code{mem}, 1 means that the memory reference will not trap.

+In a @code{call}, 1 means that this pure or const call may possibly
+infinite loop.
+
 In an RTL dump, this flag is represented as @samp{/c}.

 @findex frame_related
@@ -938,6 +964,8 @@

 In @code{symbol_ref} expressions, 1 means the referenced symbol is weak.

+In @code{call} expressions, 1 means the call is pure.
+
 In an RTL dump, this flag is represented as @samp{/i}.

 @findex jump
@@ -967,8 +995,8 @@
 In a @code{symbol_ref} expression, 1 means that this symbol addresses
 something in the per-function constant pool.

-In a @code{call_insn}, @code{note}, or an @code{expr_list} of notes,
-1 means that this instruction is a call to a const or pure function.
+In a @code{call_insn} 1 means that this instruction is a call to a const
+function.

 In an RTL dump, this flag is represented as @samp{/u}.

Index: dce.c
===================================================================
--- dce.c       (revision 135097)
+++ dce.c       (working copy)
@@ -99,11 +99,16 @@
   rtx body, x;
   int i;

-  /* We can delete dead const or pure calls as long as they do not
-     infinite loop and are not sibling calls.  The problem with
-     sibling calls is that it is hard to see the result.  */
-  if (CALL_P (insn) 
+  if (CALL_P (insn)
+      /* We cannot delete calls inside of the recursive dce because
+        this may cause basic blocks to be deleted and this messes up
+        the rest of the stack of optimization passes.  */
+      && (!df_in_progress)
+      /* We cannot delete pure or const sibling calls because it is
+        hard to see the result.  */
       && (!SIBLING_CALL_P (insn))
+      /* We can delete dead const or pure calls as long as they do not
+         infinite loop.  */
       && (RTL_CONST_OR_PURE_CALL_P (insn)
          && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)))
     return true;
@@ -305,6 +310,7 @@
 {
   basic_block bb;
   rtx insn, next;
+  bool must_clean = false;

   FOR_EACH_BB (bb)
     FOR_BB_INSNS_SAFE (bb, insn, next)
@@ -382,9 +388,19 @@
              remove_note (XEXP (note, 0), libcall_note);
            }

+          /* If a pure or const call is deleted, this may make the cfg
+             have unreachable blocks.  We rememeber this and call
+             delete_unreachable_blocks at the end.  */
+          if (CALL_P (insn))
+            must_clean = true;
+
          /* Now delete the insn.  */
          delete_insn_and_edges (insn);
        }
+
+  /* Deleted a pure or const call.  */
+  if (must_clean)
+    delete_unreachable_blocks ();
 }




-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36177

Reply via email to