gcse.c (insert_insn_end_bb): Correct placement of insns when the current block starts...
authorJeff Law <law@gcc.gnu.org>
Thu, 3 Jun 1999 00:19:42 +0000 (18:19 -0600)
committerJeff Law <law@gcc.gnu.org>
Thu, 3 Jun 1999 00:19:42 +0000 (18:19 -0600)

        * 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

index d7fde36ecd80fca4a9876ee15607114feb7c7ba8..deebc73e0a138b2cb761644eefff8e4eb7865162 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
     {