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