diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-06-09 11:11:36 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-06-09 11:11:36 -0700 |
commit | e72f960431aa61185c40cf38a471b6d8b0924a58 (patch) | |
tree | 0a4cd996496a0b042667d689e1af7a87da5e6798 /inst.nsi | |
parent | 8187f1a3a27671d4d5b705901fa3fe30ed03cc5f (diff) | |
download | txr-e72f960431aa61185c40cf38a471b6d8b0924a58.tar.gz txr-e72f960431aa61185c40cf38a471b6d8b0924a58.tar.bz2 txr-e72f960431aa61185c40cf38a471b6d8b0924a58.zip |
optimizer: fix live set being unexpectedly nil.
The following test case throws an exception:
(compile-toplevel '(when-match @(or
@b @c)
nil nil))
the reason is that in the optimizer, the local-liveness method
resets the bl.live set of live registers to nil. The expectation
is that it will be recalculated. However, what happens is that
* stdlib/optimize.tl (basic-block): Initialize live slot to zero.
(basic-blocks local-liveness): Reset bl.live to 0, rather than nil.
The problem is that sometimes the block in question is not reached
in the graph traversal (down in the same function) which is
supposed to assign it a live value. This happens in the above
test case, and it's not due to any bug: the block is not reached
by the forward traversal because the block has become unreachable.
Diffstat (limited to 'inst.nsi')
0 files changed, 0 insertions, 0 deletions