Skip to content

Commit b79c0ee

Browse files
committed
Fix issue393:
Add issue393.c and issue393.expect. Add new func hard_reg_used_in_bb_insn_p. Add new arg filter_p to move_bb_insn_dead_vars, use it define what dead var to add. Adjust calls.
1 parent 5ce509e commit b79c0ee

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

c-tests/new/issue393.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <stdio.h>
2+
3+
struct string {
4+
char* begin;
5+
char* end;
6+
};
7+
8+
unsigned long size (struct string a) { return (a.end - a.begin) / sizeof (char); }
9+
10+
int main (void) {
11+
char c[3] = "foo";
12+
struct string s = {c, c + 3};
13+
printf ("%lu\n", size (s));
14+
return 0;
15+
}

c-tests/new/issue393.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3

mir-gen.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -513,12 +513,17 @@ static void remove_bb_insn_dead_var (gen_ctx_t gen_ctx, bb_insn_t bb_insn, MIR_r
513513
}
514514
}
515515

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)) {
517518
dead_var_t dv;
518519

519520
while ((dv = DLIST_HEAD (dead_var_t, from_bb_insn->dead_vars)) != NULL) {
520521
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+
}
522527
}
523528
}
524529

@@ -4555,6 +4560,18 @@ static void combine_process_op (gen_ctx_t gen_ctx, const MIR_op_t *op_ref, bb_in
45554560
}
45564561
}
45574562

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+
45584575
static int combine_delete_insn (gen_ctx_t gen_ctx, MIR_insn_t def_insn, bb_insn_t bb_insn) {
45594576
MIR_reg_t hr;
45604577

@@ -4566,7 +4583,7 @@ static int combine_delete_insn (gen_ctx_t gen_ctx, MIR_insn_t def_insn, bb_insn_
45664583
print_bb_insn (gen_ctx, def_insn->data, TRUE);
45674584
});
45684585
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);
45704587
/* We should delete the def insn here because of possible
45714588
substitution of the def insn 'r0 = ... r0 ...'. We still
45724589
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
49684985
if (sh == 0) {
49694986
new_insns[0] = MIR_new_insn (ctx, MIR_MOV, insn->ops[0], insn->ops[1]);
49704987
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);
49724989
DEBUG (2, {
49734990
fprintf (debug_file, " changing to ");
49744991
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
50235040
if (n < 6) {
50245041
for (n = 0; n < 6; n++) gen_delete_insn (gen_ctx, new_insns[n]);
50255042
} 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);
50275044
add_bb_insn_dead_var (gen_ctx, new_insns[5]->data, TEMP_INT_HARD_REG2);
50285045
DEBUG (2, {
50295046
fprintf (debug_file, " changing to ");

0 commit comments

Comments
 (0)