@@ -53,57 +53,54 @@ impl<'tcx> MirPass<'tcx> for ConstGoto {
53
53
impl < ' a , ' tcx > Visitor < ' tcx > for ConstGotoOptimizationFinder < ' a , ' tcx > {
54
54
fn visit_terminator ( & mut self , terminator : & Terminator < ' tcx > , location : Location ) {
55
55
let _: Option < _ > = try {
56
- match terminator. kind {
57
- TerminatorKind :: Goto { target } => {
58
- // We only apply this optimization if the last statement is a const assignment
59
- let last_statement =
60
- self . body . basic_blocks ( ) [ location. block ] . statements . last ( ) ?;
56
+ let target = terminator. kind . as_goto ( ) ?;
57
+ // We only apply this optimization if the last statement is a const assignment
58
+ let last_statement =
59
+ self . body . basic_blocks ( ) [ location. block ] . statements . last ( ) ?;
61
60
62
- if let Some ( box ( place, Rvalue :: Use ( op) ) ) = last_statement. kind . as_assign ( ) {
63
- let _const = op. constant ( ) ?;
64
- // We found a constant being assigned to `place`.
65
- // Now check that the target of this Goto switches on this place.
66
- let target_bb = & self . body . basic_blocks ( ) [ target] ;
67
- // FIXME(simonvandel): We are conservative here when we don't allow
68
- // any statements in the target basic block.
69
- // This could probably be relaxed to allow `StorageDead`s which could be
70
- // copied to the predecessor of this block.
71
- if !target_bb. statements . is_empty ( ) {
72
- None ?
73
- }
61
+ if let Some ( box ( place, Rvalue :: Use ( op) ) ) = last_statement. kind . as_assign ( ) {
62
+ let _const = op. constant ( ) ?;
63
+ // We found a constant being assigned to `place`.
64
+ // Now check that the target of this Goto switches on this place.
65
+ let target_bb = & self . body . basic_blocks ( ) [ target] ;
66
+
67
+ // FIXME(simonvandel): We are conservative here when we don't allow
68
+ // any statements in the target basic block.
69
+ // This could probably be relaxed to allow `StorageDead`s which could be
70
+ // copied to the predecessor of this block.
71
+ if !target_bb. statements . is_empty ( ) {
72
+ None ?
73
+ }
74
74
75
- let target_bb_terminator = target_bb. terminator ( ) ;
76
- let ( discr, switch_ty, targets) = target_bb_terminator. kind . as_switch ( ) ?;
77
- if discr. place ( ) == Some ( * place) {
78
- // We now know that the Switch matches on the const place, and it is statementless
79
- // Now find which value in the Switch matches the const value.
80
- let const_value = _const. literal . try_eval_bits (
81
- self . tcx ,
82
- self . param_env ,
83
- switch_ty,
84
- ) ?;
85
- let found_value_idx_option = targets
86
- . iter ( )
87
- . enumerate ( )
88
- . find ( |( _, x) | const_value == x. 0 )
89
- . map ( |( idx, _) | idx) ;
75
+ let target_bb_terminator = target_bb. terminator ( ) ;
76
+ let ( discr, switch_ty, targets) = target_bb_terminator. kind . as_switch ( ) ?;
77
+ if discr. place ( ) == Some ( * place) {
78
+ // We now know that the Switch matches on the const place, and it is statementless
79
+ // Now find which value in the Switch matches the const value.
80
+ let const_value = _const. literal . try_eval_bits (
81
+ self . tcx ,
82
+ self . param_env ,
83
+ switch_ty,
84
+ ) ?;
85
+ let found_value_idx_option = targets
86
+ . iter ( )
87
+ . enumerate ( )
88
+ . find ( |( _, x) | const_value == x. 0 )
89
+ . map ( |( idx, _) | idx) ;
90
90
91
- let target_to_use_in_goto =
92
- if let Some ( found_value_idx) = found_value_idx_option {
93
- targets. iter ( ) . nth ( found_value_idx) . unwrap ( ) . 1
94
- } else {
95
- // If we did not find the const value in values, it must be the otherwise case
96
- targets. otherwise ( )
97
- } ;
91
+ let target_to_use_in_goto =
92
+ if let Some ( found_value_idx) = found_value_idx_option {
93
+ targets. iter ( ) . nth ( found_value_idx) . unwrap ( ) . 1
94
+ } else {
95
+ // If we did not find the const value in values, it must be the otherwise case
96
+ targets. otherwise ( )
97
+ } ;
98
98
99
- self . optimizations . push ( OptimizationToApply {
100
- bb_with_goto : location. block ,
101
- target_to_use_in_goto,
102
- } ) ;
103
- }
104
- }
99
+ self . optimizations . push ( OptimizationToApply {
100
+ bb_with_goto : location. block ,
101
+ target_to_use_in_goto,
102
+ } ) ;
105
103
}
106
- _ => { }
107
104
}
108
105
Some ( ( ) )
109
106
} ;
0 commit comments