| diff -durN gcc-4.4.0.orig/gcc/Makefile.in gcc-4.4.0/gcc/Makefile.in |
| --- gcc-4.4.0.orig/gcc/Makefile.in 2009-03-25 13:00:32.000000000 +0100 |
| +++ gcc-4.4.0/gcc/Makefile.in 2009-05-27 21:38:50.000000000 +0200 |
| @@ -2785,7 +2785,8 @@ |
| value-prof.h $(TREE_INLINE_H) $(TARGET_H) |
| cfgrtl.o : cfgrtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ |
| $(FLAGS_H) insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h \ |
| - output.h $(TOPLEV_H) $(FUNCTION_H) except.h $(TM_P_H) insn-config.h $(EXPR_H) \ |
| + output.h $(TOPLEV_H) $(FUNCTION_H) except.h $(TM_P_H) $(INSN_ATTR_H) \ |
| + insn-config.h $(EXPR_H) \ |
| $(CFGLAYOUT_H) $(CFGLOOP_H) $(OBSTACK_H) $(TARGET_H) $(TREE_H) \ |
| tree-pass.h $(DF_H) $(GGC_H) |
| cfganal.o : cfganal.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ |
| diff -durN gcc-4.4.0.orig/gcc/cfgrtl.c gcc-4.4.0/gcc/cfgrtl.c |
| --- gcc-4.4.0.orig/gcc/cfgrtl.c 2008-12-12 22:16:09.000000000 +0100 |
| +++ gcc-4.4.0/gcc/cfgrtl.c 2009-05-27 21:38:50.000000000 +0200 |
| @@ -53,6 +53,7 @@ |
| #include "toplev.h" |
| #include "tm_p.h" |
| #include "obstack.h" |
| +#include "insn-attr.h" |
| #include "insn-config.h" |
| #include "cfglayout.h" |
| #include "expr.h" |
| @@ -427,13 +428,27 @@ |
| return 0; |
| } |
| |
| +static unsigned int |
| +rest_of_pass_free_cfg (void) |
| +{ |
| +#ifdef DELAY_SLOTS |
| + /* The resource.c machinery uses DF but the CFG isn't guaranteed to be |
| + valid at that point so it would be too late to call df_analyze. */ |
| + if (optimize > 0 && flag_delayed_branch) |
| + df_analyze (); |
| +#endif |
| + |
| + free_bb_for_insn (); |
| + return 0; |
| +} |
| + |
| struct rtl_opt_pass pass_free_cfg = |
| { |
| { |
| RTL_PASS, |
| NULL, /* name */ |
| NULL, /* gate */ |
| - free_bb_for_insn, /* execute */ |
| + rest_of_pass_free_cfg, /* execute */ |
| NULL, /* sub */ |
| NULL, /* next */ |
| 0, /* static_pass_number */ |
| diff -durN gcc-4.4.0.orig/gcc/resource.c gcc-4.4.0/gcc/resource.c |
| --- gcc-4.4.0.orig/gcc/resource.c 2009-02-20 16:20:38.000000000 +0100 |
| +++ gcc-4.4.0/gcc/resource.c 2009-05-27 21:38:50.000000000 +0200 |
| @@ -135,8 +135,6 @@ |
| static int |
| find_basic_block (rtx insn, int search_limit) |
| { |
| - basic_block bb; |
| - |
| /* Scan backwards to the previous BARRIER. Then see if we can find a |
| label that starts a basic block. Return the basic block number. */ |
| for (insn = prev_nonnote_insn (insn); |
| @@ -157,11 +155,8 @@ |
| for (insn = next_nonnote_insn (insn); |
| insn && LABEL_P (insn); |
| insn = next_nonnote_insn (insn)) |
| - { |
| - FOR_EACH_BB (bb) |
| - if (insn == BB_HEAD (bb)) |
| - return bb->index; |
| - } |
| + if (BLOCK_FOR_INSN (insn)) |
| + return BLOCK_FOR_INSN (insn)->index; |
| |
| return -1; |
| } |
| @@ -848,13 +843,12 @@ |
| (with no intervening active insns) to see if any of them start a basic |
| block. If we hit the start of the function first, we use block 0. |
| |
| - Once we have found a basic block and a corresponding first insns, we can |
| - accurately compute the live status from basic_block_live_regs and |
| - reg_renumber. (By starting at a label following a BARRIER, we are immune |
| - to actions taken by reload and jump.) Then we scan all insns between |
| - that point and our target. For each CLOBBER (or for call-clobbered regs |
| - when we pass a CALL_INSN), mark the appropriate registers are dead. For |
| - a SET, mark them as live. |
| + Once we have found a basic block and a corresponding first insn, we can |
| + accurately compute the live status (by starting at a label following a |
| + BARRIER, we are immune to actions taken by reload and jump.) Then we |
| + scan all insns between that point and our target. For each CLOBBER (or |
| + for call-clobbered regs when we pass a CALL_INSN), mark the appropriate |
| + registers are dead. For a SET, mark them as live. |
| |
| We have to be careful when using REG_DEAD notes because they are not |
| updated by such things as find_equiv_reg. So keep track of registers |
| @@ -954,13 +948,10 @@ |
| TARGET. Otherwise, we must assume everything is live. */ |
| if (b != -1) |
| { |
| - regset regs_live = DF_LR_IN (BASIC_BLOCK (b)); |
| + regset regs_live = df_get_live_in (BASIC_BLOCK (b)); |
| rtx start_insn, stop_insn; |
| |
| - /* Compute hard regs live at start of block -- this is the real hard regs |
| - marked live, plus live pseudo regs that have been renumbered to |
| - hard regs. */ |
| - |
| + /* Compute hard regs live at start of block. */ |
| REG_SET_TO_HARD_REG_SET (current_live_regs, regs_live); |
| |
| /* Get starting and ending insn, handling the case where each might |
| @@ -1046,10 +1037,24 @@ |
| |
| else if (LABEL_P (real_insn)) |
| { |
| + basic_block bb; |
| + |
| /* A label clobbers the pending dead registers since neither |
| reload nor jump will propagate a value across a label. */ |
| AND_COMPL_HARD_REG_SET (current_live_regs, pending_dead_regs); |
| CLEAR_HARD_REG_SET (pending_dead_regs); |
| + |
| + /* We must conservatively assume that all registers that used |
| + to be live here still are. The fallthrough edge may have |
| + left a live register uninitialized. */ |
| + bb = BLOCK_FOR_INSN (real_insn); |
| + if (bb) |
| + { |
| + HARD_REG_SET extra_live; |
| + |
| + REG_SET_TO_HARD_REG_SET (extra_live, df_get_live_in (bb)); |
| + IOR_HARD_REG_SET (current_live_regs, extra_live); |
| + } |
| } |
| |
| /* The beginning of the epilogue corresponds to the end of the |
| @@ -1121,6 +1126,7 @@ |
| init_resource_info (rtx epilogue_insn) |
| { |
| int i; |
| + basic_block bb; |
| |
| /* Indicate what resources are required to be valid at the end of the current |
| function. The condition code never is and memory always is. If the |
| @@ -1189,6 +1195,11 @@ |
| /* Allocate and initialize the tables used by mark_target_live_regs. */ |
| target_hash_table = XCNEWVEC (struct target_info *, TARGET_HASH_PRIME); |
| bb_ticks = XCNEWVEC (int, last_basic_block); |
| + |
| + /* Set the BLOCK_FOR_INSN of each label that starts a basic block. */ |
| + FOR_EACH_BB (bb) |
| + if (LABEL_P (BB_HEAD (bb))) |
| + BLOCK_FOR_INSN (BB_HEAD (bb)) = bb; |
| } |
| |
| /* Free up the resources allocated to mark_target_live_regs (). This |
| @@ -1197,6 +1208,8 @@ |
| void |
| free_resource_info (void) |
| { |
| + basic_block bb; |
| + |
| if (target_hash_table != NULL) |
| { |
| int i; |
| @@ -1222,6 +1235,10 @@ |
| free (bb_ticks); |
| bb_ticks = NULL; |
| } |
| + |
| + FOR_EACH_BB (bb) |
| + if (LABEL_P (BB_HEAD (bb))) |
| + BLOCK_FOR_INSN (BB_HEAD (bb)) = NULL; |
| } |
| |
| /* Clear any hashed information that we have stored for INSN. */ |