qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit ae80e4f7caa6be31f83ae6a94a26ab3b60a5b064
parent 2b64b75c845d0491c7a701e44485d2856eeb686d
Author: Quentin Carbonneaux <quentin@c9x.me>
Date:   Thu, 17 Aug 2017 04:47:10 -0400

fix bug in jumps simplification

In presence of jump loops, the algorithm would
create cycles in the disjoint-set data structure.
This caused infinite recursion and stack overflows.

Diffstat:
Mcfg.c | 7+++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/cfg.c b/cfg.c @@ -304,8 +304,11 @@ simpljmp(Fn *fn) for (b=fn->start; b; b=b->link) { assert(!b->phi); if (b->nins == 0) - if (b->jmp.type == Jjmp) - uf[b->id] = b->s1; + if (b->jmp.type == Jjmp) { + uffind(&b->s1, uf); + if (b->s1 != b) + uf[b->id] = b->s1; + } } for (b=fn->start; b; b=b->link) { if (b->s1)