mirror of
https://github.com/danog/ir.git
synced 2024-11-26 20:34:53 +01:00
Disable LICM for overflow checking math
This commit is contained in:
parent
b1f2167ea5
commit
83edc3f8a1
33
ir_gcm.c
33
ir_gcm.c
@ -117,20 +117,33 @@ static void ir_gcm_schedule_late(ir_ctx *ctx, uint32_t *_blocks, ir_bitset visit
|
|||||||
}
|
}
|
||||||
IR_ASSERT(lca != 0 && "No Common Antecessor");
|
IR_ASSERT(lca != 0 && "No Common Antecessor");
|
||||||
b = lca;
|
b = lca;
|
||||||
uint32_t loop_depth = ctx->cfg_blocks[b].loop_depth;
|
|
||||||
if (loop_depth) {
|
if (b != _blocks[ref]) {
|
||||||
while (lca != ctx->cfg_blocks[_blocks[ref]].dom_parent) {
|
ir_block *bb = &ctx->cfg_blocks[b];
|
||||||
if (ctx->cfg_blocks[lca].loop_depth < loop_depth) {
|
uint32_t loop_depth = bb->loop_depth;
|
||||||
loop_depth = ctx->cfg_blocks[lca].loop_depth;
|
|
||||||
b = lca;
|
if (loop_depth) {
|
||||||
if (!loop_depth) {
|
insn = &ctx->ir_base[ref];
|
||||||
break;
|
if (insn->op >= IR_ADD_OV && insn->op <= IR_OVERFLOW) {
|
||||||
|
/* Don't move overflow checking math out of the loop */
|
||||||
|
// TODO: this should be turned into a more general check to prohibit LICM ???
|
||||||
|
} else {
|
||||||
|
lca = bb->dom_parent;
|
||||||
|
while (lca != _blocks[ref]) {
|
||||||
|
bb = &ctx->cfg_blocks[lca];
|
||||||
|
if (bb->loop_depth < loop_depth) {
|
||||||
|
loop_depth = bb->loop_depth;
|
||||||
|
b = lca;
|
||||||
|
if (!loop_depth) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lca = bb->dom_parent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lca = ctx->cfg_blocks[lca].dom_parent;
|
|
||||||
}
|
}
|
||||||
|
_blocks[ref] = b;
|
||||||
}
|
}
|
||||||
_blocks[ref] = b;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user