Tweak liveness analysis for while loops
diff --git a/internal/cgen/liveness.go b/internal/cgen/liveness.go
index 3fe51ee..893c665 100644
--- a/internal/cgen/liveness.go
+++ b/internal/cgen/liveness.go
@@ -429,28 +429,22 @@
h.loops[n] = l
copy(l.before, r)
- if err := h.doExpr(r, n.Condition()); err != nil {
- return err
- }
- copy(l.after, r)
- for {
- copy(r, l.after)
- if err := h.doBlock(r, n.Body(), depth); err != nil {
- return err
- }
- l.changed = l.before.reconcile(r) || l.changed
-
+ for l.changed = true; l.changed; {
+ l.changed = false
copy(r, l.before)
+
if err := h.doExpr(r, n.Condition()); err != nil {
return err
+ } else {
+ l.changed = l.after.reconcile(r) || l.changed
}
- l.changed = l.after.reconcile(r) || l.changed
- if !l.changed {
- break
+ if err := h.doBlock(r, n.Body(), depth); err != nil {
+ return err
+ } else {
+ l.changed = l.before.reconcile(r) || l.changed
}
- l.changed = false
}
copy(r, l.after)