Estimated hours taken: 10
Fix bugs in the handling of temporaries.
compiler/code_info.m:
Reorganize the way temporary slots are handled. Create a stack slot
to slot_contents map that is part of the permanent state, so each
slot can be used for only one purpose within a procedure; this is
to make garbage collection of these slots possible. Make the set
of temporary slots in use be part of the location dependent state.
At the ends of branched control structures, consider a temp slot
in use if it was in use at the end of any branch. (Previously,
we considered it live after the control structure if it was live
at the end of the last branch. We got that right for branched
structures that manipulate temp slots, i.e. disjunctions and
if-then-elses, but we got it wrong for switches.
Rename some predicates to get rid of the double meaning of the word
"discard" as applied to a temporary, which used to mean either
"release the slot" or "execute the discard_ticket operation".
It now means only the latter; the word "release" refers to the former.
compiler/disj_gen.m:
compiler/ite_gen.m:
Conform to the new method of handling temporary slots.
tests/valid/complex_failure.m:
tests/valid/semi_fail_in_non_ite.m:
Copies of the test cases from tests/general.
tests/valid/Mmakefile:
Enable the new test cases, running them with --use-trail.
Unfortunately, we cannot just specify --use-trail for them
in tests/general, since that would cause a link error in the usual
case that the runtime being linked with is not in a trailing grade.