Tweak GenKillAnalysis.

`GenKillAnalysis` has five methods that take a transfer function arg:
- `statement_effect`
- `before_statement_effect`
- `terminator_effect`
- `before_terminator_effect`
- `call_return_effect`

All the transfer function args have type `&mut impl GenKill<Self::Idx>`,
except for `terminator_effect`, which takes the simpler `Self::Domain`.

But only the first two need to be `impl GenKill`. The other
three can all be `Self::Domain`, just like `Analysis`. So this commit
changes the last two to take `Self::Domain`, making `GenKillAnalysis`
and `Analysis` more similar.

(Another idea would be to make all these methods `impl GenKill`. But
that doesn't work: `MaybeInitializedPlaces::terminator_effect` requires
the arg be `Self::Domain` so that `self_is_unwind_dead(place, state)`
can be called on it.)
This commit is contained in:
Nicholas Nethercote 2023-12-08 09:35:57 +11:00
parent 0158404e78
commit 4b364b6f0f
6 changed files with 24 additions and 21 deletions

View File

@ -585,7 +585,7 @@ fn statement_effect(
fn before_terminator_effect( fn before_terminator_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
_terminator: &mir::Terminator<'tcx>, _terminator: &mir::Terminator<'tcx>,
location: Location, location: Location,
) { ) {
@ -612,7 +612,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
_trans: &mut impl GenKill<Self::Idx>, _trans: &mut Self::Domain,
_block: mir::BasicBlock, _block: mir::BasicBlock,
_return_places: CallReturnPlaces<'_, 'tcx>, _return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {

View File

@ -248,18 +248,19 @@ fn into_engine<'mir>(
/// A gen/kill dataflow problem. /// A gen/kill dataflow problem.
/// ///
/// Each method in this trait has a corresponding one in `Analysis`. However, these methods only /// Each method in this trait has a corresponding one in `Analysis`. However, the first two methods
/// allow modification of the dataflow state via "gen" and "kill" operations. By defining transfer /// here only allow modification of the dataflow state via "gen" and "kill" operations. By defining
/// functions for each statement in this way, the transfer function for an entire basic block can /// transfer functions for each statement in this way, the transfer function for an entire basic
/// be computed efficiently. /// block can be computed efficiently. The remaining methods match up with `Analysis` exactly.
/// ///
/// `Analysis` is automatically implemented for all implementers of `GenKillAnalysis`. /// `Analysis` is automatically implemented for all implementers of `GenKillAnalysis` via a blanket
/// impl below.
pub trait GenKillAnalysis<'tcx>: Analysis<'tcx> { pub trait GenKillAnalysis<'tcx>: Analysis<'tcx> {
type Idx: Idx; type Idx: Idx;
fn domain_size(&self, body: &mir::Body<'tcx>) -> usize; fn domain_size(&self, body: &mir::Body<'tcx>) -> usize;
/// See `Analysis::apply_statement_effect`. /// See `Analysis::apply_statement_effect`. Note how the second arg differs.
fn statement_effect( fn statement_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut impl GenKill<Self::Idx>,
@ -267,7 +268,8 @@ fn statement_effect(
location: Location, location: Location,
); );
/// See `Analysis::apply_before_statement_effect`. /// See `Analysis::apply_before_statement_effect`. Note how the second arg
/// differs.
fn before_statement_effect( fn before_statement_effect(
&mut self, &mut self,
_trans: &mut impl GenKill<Self::Idx>, _trans: &mut impl GenKill<Self::Idx>,
@ -287,7 +289,7 @@ fn terminator_effect<'mir>(
/// See `Analysis::apply_before_terminator_effect`. /// See `Analysis::apply_before_terminator_effect`.
fn before_terminator_effect( fn before_terminator_effect(
&mut self, &mut self,
_trans: &mut impl GenKill<Self::Idx>, _trans: &mut Self::Domain,
_terminator: &mir::Terminator<'tcx>, _terminator: &mir::Terminator<'tcx>,
_location: Location, _location: Location,
) { ) {
@ -298,7 +300,7 @@ fn before_terminator_effect(
/// See `Analysis::apply_call_return_effect`. /// See `Analysis::apply_call_return_effect`.
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
block: BasicBlock, block: BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>, return_places: CallReturnPlaces<'_, 'tcx>,
); );
@ -313,6 +315,7 @@ fn switch_int_edge_effects<G: GenKill<Self::Idx>>(
} }
} }
// Blanket impl: any impl of `GenKillAnalysis` automatically impls `Analysis`.
impl<'tcx, A> Analysis<'tcx> for A impl<'tcx, A> Analysis<'tcx> for A
where where
A: GenKillAnalysis<'tcx>, A: GenKillAnalysis<'tcx>,

View File

@ -62,7 +62,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
_trans: &mut impl GenKill<Self::Idx>, _trans: &mut Self::Domain,
_block: BasicBlock, _block: BasicBlock,
_return_places: CallReturnPlaces<'_, 'tcx>, _return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {

View File

@ -376,7 +376,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
_block: mir::BasicBlock, _block: mir::BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>, return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {
@ -499,7 +499,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
_block: mir::BasicBlock, _block: mir::BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>, return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {
@ -617,7 +617,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
_block: mir::BasicBlock, _block: mir::BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>, return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {
@ -712,7 +712,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
block: mir::BasicBlock, block: mir::BasicBlock,
_return_places: CallReturnPlaces<'_, 'tcx>, _return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {

View File

@ -69,7 +69,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
_block: mir::BasicBlock, _block: mir::BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>, return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {

View File

@ -72,7 +72,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
_trans: &mut impl GenKill<Self::Idx>, _trans: &mut Self::Domain,
_block: BasicBlock, _block: BasicBlock,
_return_places: CallReturnPlaces<'_, 'tcx>, _return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {
@ -144,7 +144,7 @@ fn terminator_effect<'mir>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
_trans: &mut impl GenKill<Self::Idx>, _trans: &mut Self::Domain,
_block: BasicBlock, _block: BasicBlock,
_return_places: CallReturnPlaces<'_, 'tcx>, _return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {
@ -238,7 +238,7 @@ fn statement_effect(
fn before_terminator_effect( fn before_terminator_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
terminator: &Terminator<'tcx>, terminator: &Terminator<'tcx>,
loc: Location, loc: Location,
) { ) {
@ -334,7 +334,7 @@ fn terminator_effect<'t>(
fn call_return_effect( fn call_return_effect(
&mut self, &mut self,
trans: &mut impl GenKill<Self::Idx>, trans: &mut Self::Domain,
_block: BasicBlock, _block: BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>, return_places: CallReturnPlaces<'_, 'tcx>,
) { ) {