@@ -37,11 +37,11 @@ impl<'tcx> MirPass<'tcx> for MatchBranchSimplification {
3737 _ => continue ,
3838 } ;
3939
40- if SimplifyToIf . simplify ( tcx, body, bb_idx, param_env) {
40+ if SimplifyToIf . simplify ( tcx, body, bb_idx, param_env) . is_some ( ) {
4141 should_cleanup = true ;
4242 continue ;
4343 }
44- if SimplifyToExp :: default ( ) . simplify ( tcx, body, bb_idx, param_env) {
44+ if SimplifyToExp :: default ( ) . simplify ( tcx, body, bb_idx, param_env) . is_some ( ) {
4545 should_cleanup = true ;
4646 continue ;
4747 }
@@ -62,17 +62,15 @@ trait SimplifyMatch<'tcx> {
6262 body : & mut Body < ' tcx > ,
6363 switch_bb_idx : BasicBlock ,
6464 param_env : ParamEnv < ' tcx > ,
65- ) -> bool {
65+ ) -> Option < ( ) > {
6666 let bbs = & body. basic_blocks ;
6767 let ( discr, targets) = match bbs[ switch_bb_idx] . terminator ( ) . kind {
6868 TerminatorKind :: SwitchInt { ref discr, ref targets, .. } => ( discr, targets) ,
6969 _ => unreachable ! ( ) ,
7070 } ;
7171
7272 let discr_ty = discr. ty ( body. local_decls ( ) , tcx) ;
73- if !self . can_simplify ( tcx, targets, param_env, bbs, discr_ty) {
74- return false ;
75- }
73+ self . can_simplify ( tcx, targets, param_env, bbs, discr_ty) ?;
7674
7775 let mut patch = MirPatch :: new ( body) ;
7876
@@ -92,7 +90,7 @@ trait SimplifyMatch<'tcx> {
9290 patch. add_statement ( parent_end, StatementKind :: StorageDead ( discr_local) ) ;
9391 patch. patch_terminator ( switch_bb_idx, bbs[ first] . terminator ( ) . kind . clone ( ) ) ;
9492 patch. apply ( body) ;
95- true
93+ Some ( ( ) )
9694 }
9795
9896 /// Check that the BBs to be simplified satisfies all distinct and
@@ -105,7 +103,7 @@ trait SimplifyMatch<'tcx> {
105103 param_env : ParamEnv < ' tcx > ,
106104 bbs : & IndexSlice < BasicBlock , BasicBlockData < ' tcx > > ,
107105 discr_ty : Ty < ' tcx > ,
108- ) -> bool ;
106+ ) -> Option < ( ) > ;
109107
110108 fn new_stmts (
111109 & self ,
@@ -161,27 +159,27 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToIf {
161159 param_env : ParamEnv < ' tcx > ,
162160 bbs : & IndexSlice < BasicBlock , BasicBlockData < ' tcx > > ,
163161 _discr_ty : Ty < ' tcx > ,
164- ) -> bool {
162+ ) -> Option < ( ) > {
165163 if targets. iter ( ) . len ( ) != 1 {
166- return false ;
164+ return None ;
167165 }
168166 // We require that the possible target blocks all be distinct.
169167 let ( _, first) = targets. iter ( ) . next ( ) . unwrap ( ) ;
170168 let second = targets. otherwise ( ) ;
171169 if first == second {
172- return false ;
170+ return None ;
173171 }
174172 // Check that destinations are identical, and if not, then don't optimize this block
175173 if bbs[ first] . terminator ( ) . kind != bbs[ second] . terminator ( ) . kind {
176- return false ;
174+ return None ;
177175 }
178176
179177 // Check that blocks are assignments of consts to the same place or same statement,
180178 // and match up 1-1, if not don't optimize this block.
181179 let first_stmts = & bbs[ first] . statements ;
182180 let second_stmts = & bbs[ second] . statements ;
183181 if first_stmts. len ( ) != second_stmts. len ( ) {
184- return false ;
182+ return None ;
185183 }
186184 for ( f, s) in iter:: zip ( first_stmts, second_stmts) {
187185 match ( & f. kind , & s. kind ) {
@@ -199,10 +197,10 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToIf {
199197 && s_c. const_ . try_eval_bool ( tcx, param_env) . is_some ( ) => { }
200198
201199 // Otherwise we cannot optimize. Try another block.
202- _ => return false ,
200+ _ => return None ,
203201 }
204202 }
205- true
203+ Some ( ( ) )
206204 }
207205
208206 fn new_stmts (
@@ -340,16 +338,16 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToExp {
340338 param_env : ParamEnv < ' tcx > ,
341339 bbs : & IndexSlice < BasicBlock , BasicBlockData < ' tcx > > ,
342340 discr_ty : Ty < ' tcx > ,
343- ) -> bool {
341+ ) -> Option < ( ) > {
344342 if targets. iter ( ) . len ( ) < 2 || targets. iter ( ) . len ( ) > 64 {
345- return false ;
343+ return None ;
346344 }
347345 // We require that the possible target blocks all be distinct.
348346 if !targets. is_distinct ( ) {
349- return false ;
347+ return None ;
350348 }
351349 if !bbs[ targets. otherwise ( ) ] . is_empty_unreachable ( ) {
352- return false ;
350+ return None ;
353351 }
354352 let mut target_iter = targets. iter ( ) ;
355353 let ( first_val, first_target) = target_iter. next ( ) . unwrap ( ) ;
@@ -359,15 +357,15 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToExp {
359357 . iter ( )
360358 . all ( |( _, other_target) | first_terminator_kind == & bbs[ other_target] . terminator ( ) . kind )
361359 {
362- return false ;
360+ return None ;
363361 }
364362
365363 let discr_size = tcx. layout_of ( param_env. and ( discr_ty) ) . unwrap ( ) . size ;
366364 let first_stmts = & bbs[ first_target] . statements ;
367365 let ( second_val, second_target) = target_iter. next ( ) . unwrap ( ) ;
368366 let second_stmts = & bbs[ second_target] . statements ;
369367 if first_stmts. len ( ) != second_stmts. len ( ) {
370- return false ;
368+ return None ;
371369 }
372370
373371 fn int_equal ( l : ScalarInt , r : impl Into < u128 > , size : Size ) -> bool {
@@ -412,13 +410,13 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToExp {
412410 }
413411 }
414412 _ => {
415- return false ;
413+ return None ;
416414 }
417415 }
418416 }
419417
420418 // Otherwise we cannot optimize. Try another block.
421- _ => return false ,
419+ _ => return None ,
422420 } ;
423421 compare_types. push ( compare_type) ;
424422 }
@@ -427,7 +425,7 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToExp {
427425 for ( other_val, other_target) in target_iter {
428426 let other_stmts = & bbs[ other_target] . statements ;
429427 if compare_types. len ( ) != other_stmts. len ( ) {
430- return false ;
428+ return None ;
431429 }
432430 for ( f, s) in iter:: zip ( & compare_types, other_stmts) {
433431 match ( * f, & s. kind ) {
@@ -443,7 +441,7 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToExp {
443441 StatementKind :: Assign ( box ( lhs_s, Rvalue :: Use ( Operand :: Constant ( s_c) ) ) ) ,
444442 ) if lhs_f == lhs_s && s_c. const_ . ty ( ) == f_ty => {
445443 let Some ( f) = s_c. const_ . try_eval_scalar_int ( tcx, param_env) else {
446- return false ;
444+ return None ;
447445 } ;
448446 if is_signed
449447 && s_c. const_ . ty ( ) . is_signed ( )
@@ -454,14 +452,14 @@ impl<'tcx> SimplifyMatch<'tcx> for SimplifyToExp {
454452 if Some ( f) == ScalarInt :: try_from_uint ( other_val, f. size ( ) ) {
455453 continue ;
456454 }
457- return false ;
455+ return None ;
458456 }
459- _ => return false ,
457+ _ => return None ,
460458 }
461459 }
462460 }
463461 self . transfrom_types = compare_types. into_iter ( ) . map ( |c| c. into ( ) ) . collect ( ) ;
464- true
462+ Some ( ( ) )
465463 }
466464
467465 fn new_stmts (
0 commit comments