OSDN Git Service

/cp
[pf3gnuchains/gcc-fork.git] / gcc / function.c
index 0ee69ef..fa9236c 100644 (file)
@@ -5670,6 +5670,7 @@ convert_jumps_to_returns (basic_block last_bb, bool simple_p,
 
       /* Fix up the CFG for the successful change we just made.  */
       redirect_edge_succ (e, EXIT_BLOCK_PTR);
+      e->flags &= ~EDGE_CROSSING;
     }
   VEC_free (basic_block, heap, src_bbs);
   return unconverted;
@@ -5892,6 +5893,9 @@ thread_prologue_and_epilogue_insns (void)
       if (pic_offset_table_rtx)
        add_to_hard_reg_set (&set_up_by_prologue, Pmode,
                             PIC_OFFSET_TABLE_REGNUM);
+      if (stack_realign_drap && crtl->drap_reg)
+       add_to_hard_reg_set (&set_up_by_prologue, GET_MODE (crtl->drap_reg),
+                            REGNO (crtl->drap_reg));
 
       /* We don't use a different max size depending on
         optimize_bb_for_speed_p because increasing shrink-wrapping
@@ -6230,7 +6234,8 @@ thread_prologue_and_epilogue_insns (void)
              && !active_insn_between (BB_HEAD (last_bb), BB_END (last_bb)))
            convert_jumps_to_returns (last_bb, false, NULL);
 
-         if (EDGE_COUNT (exit_fallthru_edge->src->preds) != 0)
+         if (EDGE_COUNT (last_bb->preds) != 0
+             && single_succ_p (last_bb))
            {
              last_bb = emit_return_for_exit (exit_fallthru_edge, false);
              epilogue_end = returnjump = BB_END (last_bb);