diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2009-11-08 20:44:56 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2009-11-08 20:44:56 +0000 |
commit | 642746839c4e86df01d0a6b34dd945ae10db7bc7 (patch) | |
tree | edcc85fbcd88b528cb2ca100cd3cd7cab5d4e1bb | |
parent | 379c6f48323d84640401189d7a3de619520bee1f (diff) | |
download | gcc-642746839c4e86df01d0a6b34dd945ae10db7bc7.zip gcc-642746839c4e86df01d0a6b34dd945ae10db7bc7.tar.gz gcc-642746839c4e86df01d0a6b34dd945ae10db7bc7.tar.bz2 |
df-problems.c: Fix documentation for forward simulation of LR.
2009-11-08 Paolo Bonzini <bonzini@gnu.org>
* df-problems.c: Fix documentation for forward simulation of LR.
(df_simulate_one_insn_forwards): Use df_simulate_find_defs.
(df_simulate_finalize_forwards): Remove.
* df.h (df_simulate_finalize_forwards): Remove.
From-SVN: r154012
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/df-problems.c | 52 | ||||
-rw-r--r-- | gcc/df.h | 1 |
3 files changed, 29 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41f5b64..845e282 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-11-08 Paolo Bonzini <bonzini@gnu.org> + + * df-problems.c: Fix documentation for forward simulation of LR. + (df_simulate_one_insn_forwards): Use df_simulate_find_defs. + (df_simulate_finalize_forwards): Remove. + * df.h (df_simulate_finalize_forwards): Remove. + 2009-11-08 Richard Guenther <rguenther@suse.de> * tree-ssa-structalias.c (build_succ_graph): Properly make diff --git a/gcc/df-problems.c b/gcc/df-problems.c index e9896e3..5aad97a 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -3722,9 +3722,11 @@ df_note_add_problem (void) You can either simulate in the forwards direction, starting from the top of a block or the backwards direction from the end of the - block. The main difference is that if you go forwards, the uses - are examined first then the defs, and if you go backwards, the defs - are examined first then the uses. + block. If you go backwards, defs are examined first to clear bits, + then uses are examined to set bits. If you go forwards, defs are + examined first to set bits, then REG_DEAD and REG_UNUSED notes + are examined to clear bits. In either case, the result of examining + a def can be undone (respectively by a use or a REG_UNUSED note). If you start at the top of the block, use one of DF_LIVE_IN or DF_LR_IN. If you start at the bottom of the block use one of @@ -3814,7 +3816,7 @@ df_simulate_fixup_sets (basic_block bb, bitmap live) df_simulate_initialize_backwards should be called first with a bitvector copyied from the DF_LIVE_OUT or DF_LR_OUT. Then df_simulate_one_insn_backwards should be called for each insn in - the block, starting with the last on. Finally, + the block, starting with the last one. Finally, df_simulate_finalize_backwards can be called to get a new value of the sets at the top of the block (this is rarely used). ----------------------------------------------------------------------------*/ @@ -3896,13 +3898,16 @@ df_simulate_finalize_backwards (basic_block bb, bitmap live) df_simulate_initialize_forwards should be called first with a bitvector copyied from the DF_LIVE_IN or DF_LR_IN. Then df_simulate_one_insn_forwards should be called for each insn in - the block, starting with the last on. Finally, - df_simulate_finalize_forwards can be called to get a new value - of the sets at the bottom of the block (this is rarely used). + the block, starting with the first one. ----------------------------------------------------------------------------*/ -/* Apply the artificial uses and defs at the top of BB in a backwards - direction. */ +/* Apply the artificial uses and defs at the top of BB in a forwards + direction. ??? This is wrong; defs mark the point where a pseudo + becomes live when scanning forwards (unless a def is unused). Since + there are no REG_UNUSED notes for artificial defs, passes that + require artificial defs probably should not call this function + unless (as is the case for fwprop) they are correct when liveness + bitmaps are *under*estimated. */ void df_simulate_initialize_forwards (basic_block bb, bitmap live) @@ -3918,7 +3923,7 @@ df_simulate_initialize_forwards (basic_block bb, bitmap live) } } -/* Simulate the backwards effects of INSN on the bitmap LIVE. */ +/* Simulate the forwards effects of INSN on the bitmap LIVE. */ void df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live) @@ -3927,10 +3932,15 @@ df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live) if (! INSN_P (insn)) return; - /* Make sure that the DF_NOTES really is an active df problem. */ + /* Make sure that DF_NOTE really is an active df problem. */ gcc_assert (df_note); - df_simulate_defs (insn, live); + /* Note that this is the opposite as how the problem is defined, because + in the LR problem defs _kill_ liveness. However, they do so backwards, + while here the scan is performed forwards! So, first assume that the + def is live, and if this is not true REG_UNUSED notes will rectify the + situation. */ + df_simulate_find_defs (insn, live); /* Clear all of the registers that go dead. */ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) @@ -3960,24 +3970,6 @@ df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live) } -/* Apply the artificial uses and defs at the end of BB in a backwards - direction. */ - -void -df_simulate_finalize_forwards (basic_block bb, bitmap live) -{ - df_ref *def_rec; - int bb_index = bb->index; - - for (def_rec = df_get_artificial_defs (bb_index); *def_rec; def_rec++) - { - df_ref def = *def_rec; - if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0) - bitmap_clear_bit (live, DF_REF_REGNO (def)); - } -} - - /*---------------------------------------------------------------------------- MULTIPLE DEFINITIONS @@ -985,7 +985,6 @@ extern void df_simulate_one_insn_backwards (basic_block, rtx, bitmap); extern void df_simulate_finalize_backwards (basic_block, bitmap); extern void df_simulate_initialize_forwards (basic_block, bitmap); extern void df_simulate_one_insn_forwards (basic_block, rtx, bitmap); -extern void df_simulate_finalize_forwards (basic_block, bitmap); /* Functions defined in df-scan.c. */ |