From b1d26727ac4276f7f71b90530b2103afedd55b71 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 2 Jun 1999 18:19:42 -0600 Subject: [PATCH] gcse.c (insert_insn_end_bb): Correct placement of insns when the current block starts with a CODE_LABEL and... MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit � * 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 --- gcc/gcse.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/gcc/gcse.c b/gcc/gcse.c index d7fde36ecd8..deebc73e0a1 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 { -- 2.30.2