aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1999-06-02 18:19:42 -0600
committerJeff Law <law@gcc.gnu.org>1999-06-02 18:19:42 -0600
commitb1d26727ac4276f7f71b90530b2103afedd55b71 (patch)
treeb23daa7619a2d8de0701952f2424c2c285af000a
parentcd5828a94ee14ca00adfae9d37b6808128e1193d (diff)
downloadgcc-b1d26727ac4276f7f71b90530b2103afedd55b71.zip
gcc-b1d26727ac4276f7f71b90530b2103afedd55b71.tar.gz
gcc-b1d26727ac4276f7f71b90530b2103afedd55b71.tar.bz2
gcse.c (insert_insn_end_bb): Correct placement of insns when the current block starts with a CODE_LABEL and...
� * gcse.c (insert_insn_end_bb): Correct placement of insns when the current block starts with a CODE_LABEL and ends with a CALL and we can not find all the argument setup instructions for the CALL. From-SVN: r27321
-rw-r--r--gcc/gcse.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/gcc/gcse.c b/gcc/gcse.c
index d7fde36..deebc73 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -4189,9 +4189,26 @@ insert_insn_end_bb (expr, bb, pre)
}
}
- new_insn = emit_insn_before (pat, insn);
- if (BLOCK_HEAD (bb) == insn)
- BLOCK_HEAD (bb) = new_insn;
+ /* If we found all the parameter loads, then we want to insert
+ before the first parameter load.
+
+ If we did not find all the parameter loads, then we might have
+ stopped on the head of the block, which could be a CODE_LABEL.
+ If we inserted before the CODE_LABEL, then we would be putting
+ the insn in the wrong basic block. In that case, put the insn
+ after the CODE_LABEL.
+
+ ?!? Do we need to account for NOTE_INSN_BASIC_BLOCK here? */
+ if (GET_CODE (insn) != CODE_LABEL)
+ {
+ new_insn = emit_insn_before (pat, insn);
+ if (BLOCK_HEAD (bb) == insn)
+ BLOCK_HEAD (bb) = new_insn;
+ }
+ else
+ {
+ new_insn = emit_insn_after (pat, insn);
+ }
}
else
{