re PR middle-end/36177 (g++.dg/opt/pr23714.C ICEs with 135041 -> 135057)

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
This commit is contained in:
Kenneth Zadeck 2008-05-09 12:14:57 +00:00 committed by Kenneth Zadeck
parent 7afa92c5a2
commit 5ba5ab9bdb
3 changed files with 66 additions and 11 deletions

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

View File

@ -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 ();
}

View 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}.