aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cfglayout.c34
-rw-r--r--gcc/rtl.h3
3 files changed, 41 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33b331b..efe3e9d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2002-06-20 Jan Hubicka <jh@suse.cz>
+
+ * 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 <dave@hiauly1.hia.nrc.ca>
* pa-protos.h (pa_asm_output_mi_thunk): Change third argument to
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index 83bc6b7..bd58972 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 0b7a874..0fba875 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));