mirror of
https://github.com/danog/ir.git
synced 2024-11-27 04:45:38 +01:00
Avoid bitset clearing and copying
This commit is contained in:
parent
f72bb45e07
commit
f72e6dc388
20
ir_ra.c
20
ir_ra.c
@ -349,7 +349,7 @@ int ir_compute_live_ranges(ir_ctx *ctx)
|
|||||||
#ifdef IR_DEBUG
|
#ifdef IR_DEBUG
|
||||||
ir_bitset visited;
|
ir_bitset visited;
|
||||||
#endif
|
#endif
|
||||||
ir_bitset live;
|
ir_bitset live, bb_live;
|
||||||
ir_bitset loops = NULL;
|
ir_bitset loops = NULL;
|
||||||
ir_bitqueue queue;
|
ir_bitqueue queue;
|
||||||
ir_reg reg;
|
ir_reg reg;
|
||||||
@ -364,7 +364,7 @@ int ir_compute_live_ranges(ir_ctx *ctx)
|
|||||||
visited = ir_bitset_malloc(ctx->cfg_blocks_count + 1);
|
visited = ir_bitset_malloc(ctx->cfg_blocks_count + 1);
|
||||||
#endif
|
#endif
|
||||||
len = ir_bitset_len(ctx->vregs_count + 1);
|
len = ir_bitset_len(ctx->vregs_count + 1);
|
||||||
live = ir_bitset_malloc((ctx->cfg_blocks_count + 1) * len * 8 * sizeof(*live));
|
bb_live = ir_mem_malloc((ctx->cfg_blocks_count + 1) * len * sizeof(ir_bitset_base_t));
|
||||||
ctx->live_intervals = ir_mem_calloc(ctx->vregs_count + 1 + IR_REG_NUM + 1, sizeof(ir_live_interval*));
|
ctx->live_intervals = ir_mem_calloc(ctx->vregs_count + 1 + IR_REG_NUM + 1, sizeof(ir_live_interval*));
|
||||||
for (b = ctx->cfg_blocks_count; b > 0; b--) {
|
for (b = ctx->cfg_blocks_count; b > 0; b--) {
|
||||||
bb = &ctx->cfg_blocks[b];
|
bb = &ctx->cfg_blocks[b];
|
||||||
@ -375,6 +375,7 @@ int ir_compute_live_ranges(ir_ctx *ctx)
|
|||||||
#ifdef IR_DEBUG
|
#ifdef IR_DEBUG
|
||||||
ir_bitset_incl(visited, b);
|
ir_bitset_incl(visited, b);
|
||||||
#endif
|
#endif
|
||||||
|
live = bb_live + (len * b);
|
||||||
if (bb->successors_count == 0) {
|
if (bb->successors_count == 0) {
|
||||||
ir_bitset_clear(live, len);
|
ir_bitset_clear(live, len);
|
||||||
}
|
}
|
||||||
@ -386,9 +387,15 @@ int ir_compute_live_ranges(ir_ctx *ctx)
|
|||||||
#endif
|
#endif
|
||||||
/* live = union of successors.liveIn */
|
/* live = union of successors.liveIn */
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
ir_bitset_copy(live, live + (len * succ), len);
|
if (EXPECTED(succ > b)) {
|
||||||
|
ir_bitset_copy(live, bb_live + (len * succ), len);
|
||||||
} else {
|
} else {
|
||||||
ir_bitset_union(live, live + (len * succ), len);
|
IR_ASSERT(ctx->cfg_blocks[succ].flags & IR_BB_LOOP_HEADER);
|
||||||
|
ir_bitset_clear(live, len);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
IR_ASSERT(succ > b);
|
||||||
|
ir_bitset_union(live, bb_live + (len * succ), len);
|
||||||
}
|
}
|
||||||
/* for each phi function phi of successor */
|
/* for each phi function phi of successor */
|
||||||
succ_bb = &ctx->cfg_blocks[succ];
|
succ_bb = &ctx->cfg_blocks[succ];
|
||||||
@ -637,9 +644,6 @@ int ir_compute_live_ranges(ir_ctx *ctx)
|
|||||||
}
|
}
|
||||||
} while ((child = ir_bitqueue_pop(&queue)) >= 0);
|
} while ((child = ir_bitqueue_pop(&queue)) >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* b.liveIn = live */
|
|
||||||
ir_bitset_copy(live + (len * b), live, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unused) {
|
if (unused) {
|
||||||
@ -651,7 +655,7 @@ int ir_compute_live_ranges(ir_ctx *ctx)
|
|||||||
ir_bitqueue_free(&queue);
|
ir_bitqueue_free(&queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
ir_mem_free(live);
|
ir_mem_free(bb_live);
|
||||||
#ifdef IR_DEBUG
|
#ifdef IR_DEBUG
|
||||||
ir_mem_free(visited);
|
ir_mem_free(visited);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user