From 1292ec0ce0781a96b58d6a465dfc0fe77ad3e7b5 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 21 Jun 2002 04:09:11 +0200 Subject: [PATCH] cfglayout.c (scope_to_insns_initialize): Call set_block_levels. * cfglayout.c (scope_to_insns_initialize): Call set_block_levels. (scope_to_insns_finalize): Do not call set_block_levels; handle sequences. (choose_inner_scope): New. * rtl.h (choose_inner_scope): Declare. From-SVN: r54868 --- gcc/ChangeLog | 8 ++++++++ gcc/cfglayout.c | 34 ++++++++++++++++++++++++++++++---- gcc/rtl.h | 3 +++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 33b331bc48d..efe3e9df808 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-06-20 Jan Hubicka + + * cfglayout.c (scope_to_insns_initialize): Call set_block_levels. + (scope_to_insns_finalize): Do not call set_block_levels; handle + sequences. + (choose_inner_scope): New. + * rtl.h (choose_inner_scope): Declare. + 2002-06-20 John David Anglin * pa-protos.h (pa_asm_output_mi_thunk): Change third argument to diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c index 83bc6b71d97..bd589728bdf 100644 --- a/gcc/cfglayout.c +++ b/gcc/cfglayout.c @@ -241,6 +241,10 @@ scope_to_insns_initialize () } } } + + /* Tag the blocks with a depth number so that change_scope can find + the common parent easily. */ + set_block_levels (DECL_INITIAL (cfun->decl), 0); } /* For each lexical block, set BLOCK_NUMBER to the depth at which it is @@ -259,6 +263,20 @@ set_block_levels (block, level) } } +/* Return sope resulting from combination of S1 and S2. */ +tree +choose_inner_scope (s1, s2) + tree s1, s2; +{ + if (!s1) + return s2; + if (!s2) + return s1; + if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2)) + return s1; + return s2; +} + /* Emit lexical block notes needed to change scope from S1 to S2. */ static void @@ -315,10 +333,6 @@ scope_to_insns_finalize () tree cur_block = DECL_INITIAL (cfun->decl); rtx insn, note; - /* Tag the blocks with a depth number so that change_scope can find - the common parent easily. */ - set_block_levels (cur_block, 0); - insn = get_insns (); if (!active_insn_p (insn)) insn = next_active_insn (insn); @@ -327,6 +341,18 @@ scope_to_insns_finalize () tree this_block; this_block = INSN_SCOPE (insn); + /* For sequences compute scope resulting from merging all scopes + of instructions nested inside. */ + if (GET_CODE (PATTERN (insn)) == SEQUENCE) + { + int i; + rtx body = PATTERN (insn); + + this_block = NULL; + for (i = 0; i < XVECLEN (body, 0); i++) + this_block = choose_inner_scope (this_block, + INSN_SCOPE (XVECEXP (body, 0, i))); + } if (! this_block) continue; diff --git a/gcc/rtl.h b/gcc/rtl.h index 0b7a874ee84..0fba875aa03 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -1414,6 +1414,9 @@ extern rtx next_label PARAMS ((rtx)); extern rtx next_cc0_user PARAMS ((rtx)); extern rtx prev_cc0_setter PARAMS ((rtx)); +/* In cfglayout.c */ +extern tree choose_inner_scope PARAMS ((tree, tree)); + /* In jump.c */ extern rtx next_nondeleted_insn PARAMS ((rtx)); extern enum rtx_code reverse_condition PARAMS ((enum rtx_code)); -- 2.30.2