basic-block.h (CLEANUP_PRE_LOOP): New.

* basic-block.h (CLEANUP_PRE_LOOP): New.
	* except.c (finish_eh_generation): Update call of cleanup_cfg.
	* sibcall.c (optimize_sibling_calls): Likewise.
	* toplev.c (rest_of_compilation): Likewise.
	* flow.c (try_forward_edges): Take argument MODE;
	do not forward over loop pre-headers if CLEANUP_PRE_LOOP.
	(try_optimize_cfg): Update call of try_forward_edges.


	* (validate_replace_rtx_1): Fix simplification of MINUS.

From-SVN: r44458
This commit is contained in:
Jan Hubicka 2001-07-29 17:01:53 +00:00
parent df07e07d1a
commit 0068fd9637
7 changed files with 58 additions and 16 deletions

View File

@ -1,3 +1,18 @@
Sun Jul 29 18:59:13 CEST 2001 Jan Hubicka <jh@suse.cz>
* basic-block.h (CLEANUP_PRE_LOOP): New.
* except.c (finish_eh_generation): Update call of cleanup_cfg.
* sibcall.c (optimize_sibling_calls): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* flow.c (try_forward_edges): Take argument MODE;
do not forward over loop pre-headers if CLEANUP_PRE_LOOP.
(try_optimize_cfg): Update call of try_forward_edges.
Sun Jul 29 18:59:56 CEST 2001 Roman Zippel <zippel@linux-m68k.org>
Jan Hubicka <jh@suse.cz>
* (validate_replace_rtx_1): Fix simplification of MINUS.
2001-07-29 Neil Booth <neil@daikokuya.demon.co.uk>
PR preprocessor/3669

View File

@ -551,6 +551,8 @@ enum update_life_extent
to care REG_DEAD notes. */
#define CLEANUP_PRE_SIBCALL 8 /* Do not get confused by code hidden
inside call_placeholders.. */
#define CLEANUP_PRE_LOOP 16 /* Take care to preserve syntactic loop
notes. */
/* Flags for loop discovery. */
#define LOOP_TREE 1 /* Build loop hierarchy tree. */

View File

@ -2348,7 +2348,7 @@ finish_eh_generation ()
rebuild_jump_labels (get_insns ());
find_basic_blocks (get_insns (), max_reg_num (), 0);
cleanup_cfg (0);
cleanup_cfg (CLEANUP_PRE_LOOP);
/* These registers are used by the landing pads. Make sure they
have been generated. */
@ -2371,7 +2371,7 @@ finish_eh_generation ()
find_exception_handler_labels ();
rebuild_jump_labels (get_insns ());
find_basic_blocks (get_insns (), max_reg_num (), 0);
cleanup_cfg (0);
cleanup_cfg (CLEANUP_PRE_LOOP);
}
/* This section handles removing dead code for flow. */

View File

@ -396,7 +396,7 @@ static bool try_optimize_cfg PARAMS ((int));
static bool can_fallthru PARAMS ((basic_block, basic_block));
static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
static bool try_simplify_condjump PARAMS ((basic_block));
static bool try_forward_edges PARAMS ((basic_block));
static bool try_forward_edges PARAMS ((int, basic_block));
static void tidy_fallthru_edges PARAMS ((void));
static int verify_wide_reg_1 PARAMS ((rtx *, void *));
static void verify_wide_reg PARAMS ((int, rtx, rtx));
@ -3182,8 +3182,9 @@ try_simplify_condjump (cbranch_block)
Return true if sucessful. */
static bool
try_forward_edges (b)
try_forward_edges (mode, b)
basic_block b;
int mode;
{
bool changed = false;
edge e, next;
@ -3216,6 +3217,30 @@ try_forward_edges (b)
/* Bypass trivial infinite loops. */
if (target == target->succ->dest)
counter = n_basic_blocks;
/* Avoid killing of loop pre-headers, as it is the place loop
optimizer wants to hoist code to.
For fallthru forwarders, the LOOP_BEG note must appear between
the header of block and CODE_LABEL of the loop, for non forwarders
it must appear before the JUMP_INSN. */
if (mode & CLEANUP_PRE_LOOP)
{
rtx insn = (target->succ->flags & EDGE_FALLTHRU
? target->head : prev_nonnote_insn (target->end));
if (GET_CODE (insn) != NOTE)
insn = NEXT_INSN (insn);
for (;insn && GET_CODE (insn) != CODE_LABEL && !INSN_P (insn);
insn = NEXT_INSN (insn))
if (GET_CODE (insn) == NOTE
&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
break;
if (GET_CODE (insn) == NOTE)
break;
}
target = target->succ->dest, counter++;
}
@ -3953,7 +3978,7 @@ try_optimize_cfg (mode)
changed_here = true;
/* Simplify branch to branch. */
if (try_forward_edges (b))
if (try_forward_edges (mode, b))
changed_here = true;
/* Look for shared code between blocks. */

View File

@ -521,8 +521,8 @@ validate_replace_rtx_1 (loc, from, to, object)
simplify_gen_binary
(PLUS, GET_MODE (x), XEXP (x, 0),
simplify_gen_unary (NEG,
op0_mode, XEXP (x, 1),
op0_mode)), 1);
GET_MODE (x), XEXP (x, 1),
GET_MODE (x))), 1);
break;
case ZERO_EXTEND:
case SIGN_EXTEND:

View File

@ -569,7 +569,7 @@ optimize_sibling_and_tail_recursive_calls ()
/* We need cfg information to determine which blocks are succeeded
only by the epilogue. */
find_basic_blocks (insns, max_reg_num (), 0);
cleanup_cfg (CLEANUP_PRE_SIBCALL);
cleanup_cfg (CLEANUP_PRE_SIBCALL | CLEANUP_PRE_LOOP);
/* If there are no basic blocks, then there is nothing to do. */
if (n_basic_blocks == 0)

View File

@ -2737,7 +2737,7 @@ rest_of_compilation (decl)
rebuild_jump_labels (insns);
find_exception_handler_labels ();
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_PRE_SIBCALL);
cleanup_cfg (CLEANUP_PRE_SIBCALL | CLEANUP_PRE_LOOP);
optimize = saved_optimize;
}
@ -2846,7 +2846,7 @@ rest_of_compilation (decl)
reg_scan (insns, max_reg_num (), 0);
rebuild_jump_labels (insns);
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP);
copy_loop_headers (insns);
purge_line_number_notes (insns);
@ -2870,7 +2870,7 @@ rest_of_compilation (decl)
open_dump_file (DFI_ssa, decl);
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
convert_to_ssa ();
close_dump_file (DFI_ssa, print_rtl_with_bb, insns);
@ -2935,7 +2935,7 @@ rest_of_compilation (decl)
if (optimize > 0)
{
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
/* ??? Run if-conversion before delete_null_pointer_checks,
since the later does not preserve the CFG. This should
@ -2992,7 +2992,7 @@ rest_of_compilation (decl)
timevar_push (TV_JUMP);
rebuild_jump_labels (insns);
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
timevar_pop (TV_JUMP);
}
@ -3006,7 +3006,7 @@ rest_of_compilation (decl)
timevar_push (TV_JUMP);
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
delete_null_pointer_checks (insns);
timevar_pop (TV_JUMP);
@ -3040,7 +3040,7 @@ rest_of_compilation (decl)
open_dump_file (DFI_gcse, decl);
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
tem = gcse_main (insns, rtl_dump_file);
save_csb = flag_cse_skip_blocks;
@ -3067,7 +3067,7 @@ rest_of_compilation (decl)
rebuild_jump_labels (insns);
delete_trivially_dead_insns (insns, max_reg_num (), 0);
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
timevar_pop (TV_JUMP);
if (flag_expensive_optimizations)