@@ -22,7 +22,6 @@ pub(crate) fn optimize_instructions(
2222 self_func_addr,
2323 imported_memory_count,
2424 track_local_memory_usage,
25- options. optimize_branch_inversion ( ) ,
2625 )
2726 } else {
2827 track_local_memory_usage
@@ -40,7 +39,6 @@ fn rewrite(
4039 self_func_addr : u32 ,
4140 imported_memory_count : u32 ,
4241 track_local_memory_usage : bool ,
43- optimize_branch_inversion : bool ,
4442) -> bool {
4543 use Instruction :: * ;
4644 let mut uses_local_memory = false ;
@@ -416,9 +414,6 @@ fn rewrite(
416414 ( 0 , CmpOp :: Ne ) => JumpIfNonZero64 ( target) ,
417415 ( imm, op) => JumpCmpStackConst64 { target_ip: target, imm, op } ,
418416 } ) ;
419- if optimize_branch_inversion {
420- invert_conditional_over_jump ( instrs, i) ;
421- }
422417 canonicalize_jump_like ( instrs, i) ;
423418 if let JumpIfZero ( current) = & mut instrs[ i] {
424419 * current = target;
@@ -478,9 +473,6 @@ fn rewrite(
478473 ( 0 , CmpOp :: Ne ) => JumpIfNonZero64 ( target) ,
479474 ( imm, op) => JumpCmpStackConst64 { target_ip: target, imm, op } ,
480475 } ) ;
481- if optimize_branch_inversion {
482- invert_conditional_over_jump ( instrs, i) ;
483- }
484476 canonicalize_jump_like ( instrs, i) ;
485477 if let JumpIfNonZero ( current) = & mut instrs[ i] {
486478 * current = target;
@@ -489,9 +481,6 @@ fn rewrite(
489481 JumpIfZero32 ( ip) => {
490482 let target = resolve_jump_target ( instrs, ip) ;
491483 rewrite ! ( instrs, i, [ LocalGet32 ( local) ] => JumpIfLocalZero32 { target_ip: target, local } ) ;
492- if optimize_branch_inversion {
493- invert_conditional_over_jump ( instrs, i) ;
494- }
495484 canonicalize_jump_like ( instrs, i) ;
496485 if let JumpIfZero32 ( current) = & mut instrs[ i] {
497486 * current = target;
@@ -500,9 +489,6 @@ fn rewrite(
500489 JumpIfNonZero32 ( ip) => {
501490 let target = resolve_jump_target ( instrs, ip) ;
502491 rewrite ! ( instrs, i, [ LocalGet32 ( local) ] => JumpIfLocalNonZero32 { target_ip: target, local } ) ;
503- if optimize_branch_inversion {
504- invert_conditional_over_jump ( instrs, i) ;
505- }
506492 canonicalize_jump_like ( instrs, i) ;
507493 if let JumpIfNonZero32 ( current) = & mut instrs[ i] {
508494 * current = target;
@@ -511,9 +497,6 @@ fn rewrite(
511497 JumpIfZero64 ( ip) => {
512498 let target = resolve_jump_target ( instrs, ip) ;
513499 rewrite ! ( instrs, i, [ LocalGet64 ( local) ] => JumpIfLocalZero64 { target_ip: target, local } ) ;
514- if optimize_branch_inversion {
515- invert_conditional_over_jump ( instrs, i) ;
516- }
517500 canonicalize_jump_like ( instrs, i) ;
518501 if let JumpIfZero64 ( current) = & mut instrs[ i] {
519502 * current = target;
@@ -522,9 +505,6 @@ fn rewrite(
522505 JumpIfNonZero64 ( ip) => {
523506 let target = resolve_jump_target ( instrs, ip) ;
524507 rewrite ! ( instrs, i, [ LocalGet64 ( local) ] => JumpIfLocalNonZero64 { target_ip: target, local } ) ;
525- if optimize_branch_inversion {
526- invert_conditional_over_jump ( instrs, i) ;
527- }
528508 canonicalize_jump_like ( instrs, i) ;
529509 if let JumpIfNonZero64 ( current) = & mut instrs[ i] {
530510 * current = target;
@@ -536,9 +516,6 @@ fn rewrite(
536516 CmpOp :: Ne => instrs[ i] = JumpIfNonZero32 ( target_ip) ,
537517 _ => { }
538518 }
539- if optimize_branch_inversion {
540- invert_conditional_over_jump ( instrs, i) ;
541- }
542519 canonicalize_jump_like ( instrs, i) ;
543520 }
544521 JumpCmpStackConst64 { target_ip, imm : 0 , op } => {
@@ -547,9 +524,6 @@ fn rewrite(
547524 CmpOp :: Ne => instrs[ i] = JumpIfNonZero64 ( target_ip) ,
548525 _ => { }
549526 }
550- if optimize_branch_inversion {
551- invert_conditional_over_jump ( instrs, i) ;
552- }
553527 canonicalize_jump_like ( instrs, i) ;
554528 }
555529 JumpCmpLocalConst32 { target_ip, local, imm : 0 , op } => {
@@ -558,9 +532,6 @@ fn rewrite(
558532 CmpOp :: Ne => instrs[ i] = JumpIfLocalNonZero32 { target_ip, local } ,
559533 _ => { }
560534 }
561- if optimize_branch_inversion {
562- invert_conditional_over_jump ( instrs, i) ;
563- }
564535 canonicalize_jump_like ( instrs, i) ;
565536 }
566537 JumpCmpLocalConst64 { target_ip, local, imm : 0 , op } => {
@@ -569,9 +540,6 @@ fn rewrite(
569540 CmpOp :: Ne => instrs[ i] = JumpIfLocalNonZero64 { target_ip, local } ,
570541 _ => { }
571542 }
572- if optimize_branch_inversion {
573- invert_conditional_over_jump ( instrs, i) ;
574- }
575543 canonicalize_jump_like ( instrs, i) ;
576544 }
577545 JumpCmpStackConst32 { .. }
@@ -584,9 +552,6 @@ fn rewrite(
584552 | JumpIfLocalNonZero32 { .. }
585553 | JumpIfLocalZero64 { .. }
586554 | JumpIfLocalNonZero64 { .. } => {
587- if optimize_branch_inversion {
588- invert_conditional_over_jump ( instrs, i) ;
589- }
590555 canonicalize_jump_like ( instrs, i) ;
591556 }
592557 _ => { }
@@ -710,7 +675,6 @@ define_local_source_resolver!(
710675 get = LocalGet32 ,
711676 tee = LocalTee32 ,
712677 set = LocalSet32 ,
713- copy = LocalCopy32 ,
714678 binop_local_local_tee = BinOpLocalLocalTee32 ,
715679 binop_local_local_set = BinOpLocalLocalSet32 ,
716680 binop_local_const_tee = BinOpLocalConstTee32 ,
@@ -724,7 +688,6 @@ define_local_source_resolver!(
724688 get = LocalGet64 ,
725689 tee = LocalTee64 ,
726690 set = LocalSet64 ,
727- copy = LocalCopy64 ,
728691 binop_local_local_tee = BinOpLocalLocalTee64 ,
729692 binop_local_local_set = BinOpLocalLocalSet64 ,
730693 binop_local_const_tee = BinOpLocalConstTee64 ,
@@ -736,7 +699,6 @@ define_local_source_resolver!(
736699 get = LocalGet128 ,
737700 tee = LocalTee128 ,
738701 set = LocalSet128 ,
739- copy = LocalCopy128 ,
740702 binop_local_local_tee = BinOpLocalLocalTee128 ,
741703 binop_local_local_set = BinOpLocalLocalSet128 ,
742704 binop_local_const_tee = BinOpLocalConstTee128 ,
@@ -881,30 +843,6 @@ fn set_jump_target(instr: &mut Instruction, target: u32) {
881843 }
882844}
883845
884- fn invert_jump ( instr : Instruction , target : u32 ) -> Option < Instruction > {
885- Some ( match instr {
886- Instruction :: JumpCmpStackConst32 { imm, op, .. } => {
887- Instruction :: JumpCmpStackConst32 { target_ip : target, imm, op : inverse_cmp_op ( op) }
888- }
889- Instruction :: JumpCmpStackConst64 { imm, op, .. } => {
890- Instruction :: JumpCmpStackConst64 { target_ip : target, imm, op : inverse_cmp_op ( op) }
891- }
892- Instruction :: JumpCmpLocalConst32 { local, imm, op, .. } => {
893- Instruction :: JumpCmpLocalConst32 { target_ip : target, local, imm, op : inverse_cmp_op ( op) }
894- }
895- Instruction :: JumpCmpLocalConst64 { local, imm, op, .. } => {
896- Instruction :: JumpCmpLocalConst64 { target_ip : target, local, imm, op : inverse_cmp_op ( op) }
897- }
898- Instruction :: JumpCmpLocalLocal32 { left, right, op, .. } => {
899- Instruction :: JumpCmpLocalLocal32 { target_ip : target, left, right, op : inverse_cmp_op ( op) }
900- }
901- Instruction :: JumpCmpLocalLocal64 { left, right, op, .. } => {
902- Instruction :: JumpCmpLocalLocal64 { target_ip : target, left, right, op : inverse_cmp_op ( op) }
903- }
904- _ => return None ,
905- } )
906- }
907-
908846fn canonicalize_jump_like ( instrs : & mut [ Instruction ] , idx : usize ) {
909847 let Some ( target) = jump_target ( instrs[ idx] ) else {
910848 return ;
@@ -918,42 +856,6 @@ fn canonicalize_jump_like(instrs: &mut [Instruction], idx: usize) {
918856 }
919857}
920858
921- fn invert_conditional_over_jump ( instrs : & mut [ Instruction ] , idx : usize ) {
922- let Some ( target) = jump_target ( instrs[ idx] ) else {
923- return ;
924- } ;
925- if matches ! ( instrs[ idx] , Instruction :: Jump ( _) ) {
926- return ;
927- }
928-
929- let target_idx = next_non_nop ( instrs, target as usize ) ;
930- if target_idx >= instrs. len ( ) || target_idx <= idx + 1 {
931- return ;
932- }
933-
934- let Some ( jump_idx) = ( ( idx + 1 ) ..target_idx)
935- . rev ( )
936- . find ( |& candidate| !matches ! ( instrs[ candidate] , Instruction :: Nop | Instruction :: MergeBarrier ) )
937- else {
938- return ;
939- } ;
940-
941- let Instruction :: Jump ( exit_target) = instrs[ jump_idx] else {
942- return ;
943- } ;
944- if next_non_nop ( instrs, jump_idx + 1 ) != target_idx {
945- return ;
946- }
947-
948- let exit_target = resolve_jump_target ( instrs, exit_target) ;
949- let Some ( inverted) = invert_jump ( instrs[ idx] , exit_target) else {
950- return ;
951- } ;
952-
953- instrs[ idx] = inverted;
954- instrs[ jump_idx] = Instruction :: Nop ;
955- }
956-
957859fn remove_nop ( instructions : & mut Vec < Instruction > , function_data : & mut WasmFunctionData ) {
958860 let old_len = instructions. len ( ) ;
959861 if old_len == 0 {
0 commit comments