authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Jun 1999 00:19:42 +0000 (00:19 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Jun 1999 00:19:42 +0000 (00:19 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27321 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/gcse.c

index d7fde36..deebc73 100644 (file)
@@ -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
     {