[PATCH] rtl-optimization/105559 - avoid quadratic behavior in delete_insn_and_edges
Richard Biener
rguenther@suse.de
Wed May 11 11:45:13 GMT 2022
On Wed, 11 May 2022, Richard Biener wrote:
> When the insn to delete is a debug insn there's no point in figuring
> out whether it might be the last real insn and thus we have to purge
> dead edges.
>
> Bootstrap and regtest running on x86_64-unknown-linux-gnu.
Actually revisiting PR94618 which introduced this the following is better
and is what I'm going to test, making sure to never purge edges for
DEBUG_INSNs.
diff --git a/gcc/cfgrtl.cc b/gcc/cfgrtl.cc
index 74ea14efc61..06be46d75df 100644
--- a/gcc/cfgrtl.cc
+++ b/gcc/cfgrtl.cc
@@ -235,7 +235,7 @@ delete_insn_and_edges (rtx_insn *insn)
{
bool purge = false;
- if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
+ if (NONDEBUG_INSN_P (insn) && BLOCK_FOR_INSN (insn))
{
basic_block bb = BLOCK_FOR_INSN (insn);
if (BB_END (bb) == insn)
> 2022-05-11 Richard Biener <rguenther@suse.de>
>
> PR rtl-optimization/105559
> * cfgrtl.cc (delete_insn_and_edges): Only perform search to BB_END
> for non-debug insns.
> ---
> gcc/cfgrtl.cc | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/gcc/cfgrtl.cc b/gcc/cfgrtl.cc
> index 74ea14efc61..8e9fd1266b3 100644
> --- a/gcc/cfgrtl.cc
> +++ b/gcc/cfgrtl.cc
> @@ -240,7 +240,7 @@ delete_insn_and_edges (rtx_insn *insn)
> basic_block bb = BLOCK_FOR_INSN (insn);
> if (BB_END (bb) == insn)
> purge = true;
> - else if (DEBUG_INSN_P (BB_END (bb)))
> + else if (NONDEBUG_INSN_P (insn) && DEBUG_INSN_P (BB_END (bb)))
> for (rtx_insn *dinsn = NEXT_INSN (insn);
> DEBUG_INSN_P (dinsn); dinsn = NEXT_INSN (dinsn))
> if (BB_END (bb) == dinsn)
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)
More information about the Gcc-patches
mailing list