diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2009-11-30 07:34:55 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2009-11-30 07:34:55 +0000 |
commit | f8682ff62fb7f0d4b5ecf25ef184e0956c7a2f0a (patch) | |
tree | f00884f0bf62a839c7294b60335acdff07cd665b /gcc/df-problems.c | |
parent | da55c6dac1184af5d8bb1dbe772574943c6146d7 (diff) | |
download | gcc-f8682ff62fb7f0d4b5ecf25ef184e0956c7a2f0a.zip gcc-f8682ff62fb7f0d4b5ecf25ef184e0956c7a2f0a.tar.gz gcc-f8682ff62fb7f0d4b5ecf25ef184e0956c7a2f0a.tar.bz2 |
re PR rtl-optimization/41812 (test 20071030-1.c fails execution on powerpc64)
2009-11-30 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/41812
* fwprop.c (local_md, local_lr): New globals.
(process_defs, process_uses): Remove local_md argument. Never
consider dead pseudos to have singleton def-use chains.
(single_def_use_enter_block): Perform LR simulation.
(build_single_def_use_links): Remove local_md local variable.
Add DF_NOTE. Allocate local_lr.
(fwprop_done): Do not remove DF_CHAIN, we do not use it anymore.
* df-problems.c (df_md_scratch): New.
(df_md_alloc, df_md_free): Allocate/free it.
(df_md_local_compute): Only include live registers in init.
(df_md_transfer_function): Prune the in-set computed by
the confluence function, and the gen-set too.
(df_simulate_one_insn_forwards): Fix typo.
From-SVN: r154753
Diffstat (limited to 'gcc/df-problems.c')
-rw-r--r-- | gcc/df-problems.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/gcc/df-problems.c b/gcc/df-problems.c index cc7ab88..e0ec167 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -1574,10 +1574,9 @@ df_live_transfer_function (int bb_index) bitmap gen = bb_info->gen; bitmap kill = bb_info->kill; - /* We need to use a scratch set here so that the value returned from - this function invocation properly reflects if the sets changed in - a significant way; i.e. not just because the lr set was anded - in. */ + /* We need to use a scratch set here so that the value returned from this + function invocation properly reflects whether the sets changed in a + significant way; i.e. not just because the lr set was anded in. */ bitmap_and (df_live_scratch, gen, bb_lr_info->out); /* No register may reach a location where it is not used. Thus we trim the rr result to the places where it is used. */ @@ -3975,8 +3974,8 @@ df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live) MULTIPLE DEFINITIONS Find the locations in the function reached by multiple definition sites - for a pseudo. In and out bitvectors are built for each basic - block. + for a live pseudo. In and out bitvectors are built for each basic + block. They are restricted for efficiency to live registers. The gen and kill sets for the problem are obvious. Together they include all defined registers in a basic block; the gen set includes @@ -4018,6 +4017,10 @@ df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live) propagating the information to BB3's successors. ---------------------------------------------------------------------------*/ +/* Scratch var used by transfer functions. This is used to do md analysis + only for live registers. */ +static bitmap df_md_scratch; + /* Set basic block info. */ static void @@ -4061,6 +4064,7 @@ df_md_alloc (bitmap all_blocks) sizeof (struct df_md_bb_info), 50); df_grow_bb_info (df_md); + df_md_scratch = BITMAP_ALLOC (NULL); EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi) { @@ -4236,8 +4240,10 @@ df_md_local_compute (bitmap all_blocks) bitmap kill = df_md_get_bb_info (bb_index)->kill; EXECUTE_IF_SET_IN_BITMAP (frontiers[bb_index], 0, df_bb_index, bi2) { + basic_block bb = BASIC_BLOCK (df_bb_index); if (bitmap_bit_p (all_blocks, df_bb_index)) - bitmap_ior_into (df_md_get_bb_info (df_bb_index)->init, kill); + bitmap_ior_and_into (df_md_get_bb_info (df_bb_index)->init, kill, + df_get_live_in (bb)); } } @@ -4267,13 +4273,23 @@ df_md_reset (bitmap all_blocks) static bool df_md_transfer_function (int bb_index) { + basic_block bb = BASIC_BLOCK (bb_index); struct df_md_bb_info *bb_info = df_md_get_bb_info (bb_index); bitmap in = bb_info->in; bitmap out = bb_info->out; bitmap gen = bb_info->gen; bitmap kill = bb_info->kill; - return bitmap_ior_and_compl (out, gen, in, kill); + /* We need to use a scratch set here so that the value returned from this + function invocation properly reflects whether the sets changed in a + significant way; i.e. not just because the live set was anded in. */ + bitmap_and (df_md_scratch, gen, df_get_live_out (bb)); + + /* Multiple definitions of a register are not relevant if it is not + live. Thus we trim the result to the places where it is live. */ + bitmap_and_into (in, df_get_live_in (bb)); + + return bitmap_ior_and_compl (out, df_md_scratch, in, kill); } /* Initialize the solution bit vectors for problem. */ @@ -4336,6 +4352,7 @@ df_md_free (void) } } + BITMAP_FREE (df_md_scratch); free_alloc_pool (df_md->block_pool); df_md->block_info_size = 0; |