re PR middle-end/36177 (g++.dg/opt/pr23714.C ICEs with 135041 -> 135057)
authorKenneth Zadeck <zadeck@naturalbridge.com>
Fri, 9 May 2008 12:14:57 +0000 (12:14 +0000)
committerKenneth Zadeck <zadeck@gcc.gnu.org>
Fri, 9 May 2008 12:14:57 +0000 (12:14 +0000)
2008-05-08  Kenneth Zadeck  <zadeck@naturalbridge.com>

PR middle-end/36117
* dce.c (deletable_insn_p): Do not delete calls if
df_in_progress.
(delete_unmarked_insns): When deleting a call, call
delete_unreachable_blocks.
* rtl.texi (RTL_CONST_CALL_P, RTL_PURE_CALL_P,
RTL_CONST_OR_PURE_CALL_P, RTL_LOOPING_CONST_OR_PURE_CALL_P): Fixed
doc.

From-SVN: r135113

gcc/ChangeLog
gcc/dce.c
gcc/doc/rtl.texi

index f3f60fb7fca363642a5e565eb786f516dff1fc3a..a74526bb14fdb2f4262409baa90cedfd5dd19248 100644 (file)
@@ -1,3 +1,14 @@
+2008-05-08  Kenneth Zadeck  <zadeck@naturalbridge.com>
+
+       PR middle-end/36117
+       * dce.c (deletable_insn_p): Do not delete calls if 
+       df_in_progress.
+       (delete_unmarked_insns): When deleting a call, call 
+       delete_unreachable_blocks.
+       * rtl.texi (RTL_CONST_CALL_P, RTL_PURE_CALL_P,
+       RTL_CONST_OR_PURE_CALL_P, RTL_LOOPING_CONST_OR_PURE_CALL_P): Fixed
+       doc.
+       
 2008-05-08  Richard Guenther  <rguenther@suse.de>
 
        * doc/invoke.texi (-fdump-tree-salias): Remove documentation.
index 403d09937e21ca6ecb0af997c05c3aace9f06c63..91cc9aa5c281516313091197de9eb2a38635c6be 100644 (file)
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -99,11 +99,16 @@ deletable_insn_p (rtx insn, bool fast)
   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 @@ delete_unmarked_insns (void)
 {
   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 @@ delete_unmarked_insns (void)
              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 ();
 }
 
 
index e99b381a9ae2f341e29d7ccaaf138142fc901642..d698ceede610a06406cadacfd2ce7b6019d4d489 100644 (file)
@@ -559,13 +559,36 @@ In either case GCC assumes these addresses can be addressed directly,
 perhaps with the help of base registers.
 Stored in the @code{unchanging} field and printed as @samp{/u}.
 
-@findex CONST_OR_PURE_CALL_P
+@findex RTL_CONST_CALL_P
 @cindex @code{call_insn} and @samp{/u}
 @cindex @code{unchanging}, in @code{call_insn}
-@item 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}.
+@item 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
+@samp{/u}.
+
+@findex RTL_PURE_CALL_P
+@cindex @code{call_insn} and @samp{/i}
+@cindex @code{return_val}, in @code{call_insn}
+@item 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
+@samp{/i}.
+
+@findex RTL_CONST_OR_PURE_CALL_P
+@cindex @code{call_insn} and @samp{/u} or @samp{/i}
+@item RTL_CONST_OR_PURE_CALL_P (@var{x})
+In a @code{call_insn}, true if @code{RTL_CONST_CALL_P} or
+@code{RTL_PURE_CALL_P} is true.
+
+@findex RTL_LOOPING_CONST_OR_PURE_CALL_P
+@cindex @code{call_insn} and @samp{/c}
+@cindex @code{call}, in @code{call_insn}
+@item 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
+@code{call} field and printed as @samp{/c}.  Only true if one of
+@code{RTL_CONST_CALL_P} or @code{RTL_PURE_CALL_P} is true.
 
 @findex INSN_ANNULLED_BRANCH_P
 @cindex @code{jump_insn} and @samp{/u}
@@ -869,6 +892,9 @@ These are the fields to which the above macros refer:
 @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 @@ known not to be a member of a structure, union, or array.
 
 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 @@ instruction, 1 means an annulling branch should be used.
 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}.