summaryrefslogtreecommitdiff
path: root/gcc/cfglayout.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-10-09 20:04:10 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-10-09 20:04:10 +0000
commitfc6ce27c03b66a30e70293d4a4ebed684a5065df (patch)
tree0169af2955472328d5f862f7396b198dfc82b215 /gcc/cfglayout.c
parentf1b523fe77bddb69aca0162770e9f27efbda1897 (diff)
downloadgcc-fc6ce27c03b66a30e70293d4a4ebed684a5065df.tar.gz
* rtl.h (locator_eq): New decl.
* cfglayout.c (locator_scope): New function. (insn_scope): Use it. (locator_eq): New function. (fixup_reorder_chain): Search for last insn in src bb that has locator set or first insn in dest bb. Use locator_eq instead of == to compare locators. * cfgrtl.c (cfg_layout_merge_blocks): Likewise. * cfgcleanup.c (try_forward_edges): Use locator_eq instead of == to compare locators. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141009 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfglayout.c')
-rw-r--r--gcc/cfglayout.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index be1188d0b61..05e355d411f 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -448,13 +448,12 @@ change_scope (rtx orig_insn, tree s1, tree s2)
}
}
-/* Return lexical scope block insn belong to. */
+/* Return lexical scope block locator belongs to. */
static tree
-insn_scope (const_rtx insn)
+locator_scope (int loc)
{
int max = VEC_length (int, block_locators_locs);
int min = 0;
- int loc = INSN_LOCATOR (insn);
/* When block_locators_locs was initialized, the pro- and epilogue
insns didn't exist yet and can therefore not be found this way.
@@ -488,6 +487,13 @@ insn_scope (const_rtx insn)
return VEC_index (tree, block_locators_blocks, min);
}
+/* Return lexical scope block insn belongs to. */
+static tree
+insn_scope (const_rtx insn)
+{
+ return locator_scope (INSN_LOCATOR (insn));
+}
+
/* Return line number of the statement specified by the locator. */
static location_t
locator_location (int loc)
@@ -551,6 +557,17 @@ insn_file (const_rtx insn)
return locator_file (INSN_LOCATOR (insn));
}
+/* Return true if LOC1 and LOC2 locators have the same location and scope. */
+bool
+locator_eq (int loc1, int loc2)
+{
+ if (loc1 == loc2)
+ return true;
+ if (locator_location (loc1) != locator_location (loc2))
+ return false;
+ return locator_scope (loc1) == locator_scope (loc2);
+}
+
/* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
on the scope tree and the newly reordered instructions. */
@@ -900,24 +917,30 @@ fixup_reorder_chain (void)
if (e->goto_locus && !(e->flags & EDGE_ABNORMAL))
{
basic_block nb;
-
- if (simplejump_p (BB_END (e->src)))
+ rtx end;
+
+ insn = BB_END (e->src);
+ end = PREV_INSN (BB_HEAD (e->src));
+ while (insn != end
+ && (!INSN_P (insn) || INSN_LOCATOR (insn) == 0))
+ insn = PREV_INSN (insn);
+ if (insn != end
+ && locator_eq (INSN_LOCATOR (insn), (int) e->goto_locus))
+ continue;
+ if (simplejump_p (BB_END (e->src))
+ && INSN_LOCATOR (BB_END (e->src)) == 0)
{
- if (INSN_LOCATOR (BB_END (e->src)) == (int) e->goto_locus)
- continue;
- if (INSN_LOCATOR (BB_END (e->src)) == 0)
- {
- INSN_LOCATOR (BB_END (e->src)) = e->goto_locus;
- continue;
- }
+ INSN_LOCATOR (BB_END (e->src)) = e->goto_locus;
+ continue;
}
if (e->dest != EXIT_BLOCK_PTR)
{
insn = BB_HEAD (e->dest);
- if (!INSN_P (insn))
- insn = next_insn (insn);
- if (insn && INSN_P (insn)
- && INSN_LOCATOR (insn) == (int) e->goto_locus)
+ end = NEXT_INSN (BB_END (e->dest));
+ while (insn != end && !INSN_P (insn))
+ insn = NEXT_INSN (insn);
+ if (insn != end && INSN_LOCATOR (insn)
+ && locator_eq (INSN_LOCATOR (insn), (int) e->goto_locus))
continue;
}
nb = split_edge (e);