@@ -513,12 +513,17 @@ static void remove_bb_insn_dead_var (gen_ctx_t gen_ctx, bb_insn_t bb_insn, MIR_r
513
513
}
514
514
}
515
515
516
- static void move_bb_insn_dead_vars (bb_insn_t bb_insn , bb_insn_t from_bb_insn ) {
516
+ static void move_bb_insn_dead_vars (gen_ctx_t gen_ctx , bb_insn_t bb_insn , bb_insn_t from_bb_insn ,
517
+ int (* filter_p ) (gen_ctx_t , bb_insn_t , MIR_reg_t )) {
517
518
dead_var_t dv ;
518
519
519
520
while ((dv = DLIST_HEAD (dead_var_t , from_bb_insn -> dead_vars )) != NULL ) {
520
521
DLIST_REMOVE (dead_var_t , from_bb_insn -> dead_vars , dv );
521
- DLIST_APPEND (dead_var_t , bb_insn -> dead_vars , dv );
522
+ if (filter_p (gen_ctx , bb_insn , dv -> var )) {
523
+ DLIST_APPEND (dead_var_t , bb_insn -> dead_vars , dv );
524
+ } else {
525
+ free_dead_var (gen_ctx , dv );
526
+ }
522
527
}
523
528
}
524
529
@@ -4555,6 +4560,18 @@ static void combine_process_op (gen_ctx_t gen_ctx, const MIR_op_t *op_ref, bb_in
4555
4560
}
4556
4561
}
4557
4562
4563
+ static int hard_reg_used_in_bb_insn_p (gen_ctx_t gen_ctx , bb_insn_t bb_insn , MIR_reg_t reg ) {
4564
+ int op_num , out_p , mem_p ;
4565
+ size_t passed_mem_num ;
4566
+ MIR_reg_t r ;
4567
+ insn_var_iterator_t iter ;
4568
+
4569
+ FOREACH_INSN_VAR (gen_ctx , iter , bb_insn -> insn , r , op_num , out_p , mem_p , passed_mem_num ) {
4570
+ if (r == reg ) return TRUE;
4571
+ }
4572
+ return FALSE;
4573
+ }
4574
+
4558
4575
static int combine_delete_insn (gen_ctx_t gen_ctx , MIR_insn_t def_insn , bb_insn_t bb_insn ) {
4559
4576
MIR_reg_t hr ;
4560
4577
@@ -4566,7 +4583,7 @@ static int combine_delete_insn (gen_ctx_t gen_ctx, MIR_insn_t def_insn, bb_insn_
4566
4583
print_bb_insn (gen_ctx , def_insn -> data , TRUE);
4567
4584
});
4568
4585
remove_bb_insn_dead_var (gen_ctx , bb_insn , hr );
4569
- move_bb_insn_dead_vars (bb_insn , def_insn -> data );
4586
+ move_bb_insn_dead_vars (gen_ctx , bb_insn , def_insn -> data , hard_reg_used_in_bb_insn_p );
4570
4587
/* We should delete the def insn here because of possible
4571
4588
substitution of the def insn 'r0 = ... r0 ...'. We still
4572
4589
need valid entry for def here to find obsolete definiton,
@@ -4968,7 +4985,7 @@ static MIR_insn_t combine_mul_div_substitute (gen_ctx_t gen_ctx, bb_insn_t bb_in
4968
4985
if (sh == 0 ) {
4969
4986
new_insns [0 ] = MIR_new_insn (ctx , MIR_MOV , insn -> ops [0 ], insn -> ops [1 ]);
4970
4987
gen_add_insn_before (gen_ctx , insn , new_insns [0 ]);
4971
- move_bb_insn_dead_vars (new_insns [0 ]-> data , bb_insn );
4988
+ move_bb_insn_dead_vars (gen_ctx , new_insns [0 ]-> data , bb_insn , hard_reg_used_in_bb_insn_p );
4972
4989
DEBUG (2 , {
4973
4990
fprintf (debug_file , " changing to " );
4974
4991
print_bb_insn (gen_ctx , new_insns [0 ]-> data , TRUE);
@@ -5023,7 +5040,7 @@ static MIR_insn_t combine_mul_div_substitute (gen_ctx_t gen_ctx, bb_insn_t bb_in
5023
5040
if (n < 6 ) {
5024
5041
for (n = 0 ; n < 6 ; n ++ ) gen_delete_insn (gen_ctx , new_insns [n ]);
5025
5042
} else {
5026
- move_bb_insn_dead_vars (new_insns [3 ]-> data , bb_insn );
5043
+ move_bb_insn_dead_vars (gen_ctx , new_insns [3 ]-> data , bb_insn , hard_reg_used_in_bb_insn_p );
5027
5044
add_bb_insn_dead_var (gen_ctx , new_insns [5 ]-> data , TEMP_INT_HARD_REG2 );
5028
5045
DEBUG (2 , {
5029
5046
fprintf (debug_file , " changing to " );
0 commit comments