Files
mercury/tests/valid/complex_failure.m
Zoltan Somogyi 68a6586ca4 Fix bugs in the handling of temporaries.
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.
1998-11-03 01:36:00 +00:00

129 lines
2.2 KiB
Mathematica

% This test case is a copy of tests/general/complex_failure, and tests
% whether this test case can be compiled with --use-trail; this caused
% a compiler abort with the 21 September, 1998 version of the compiler.
%
% Unfortunately, we cannot just specify --use-trail for complex_failure
% 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.
:- module complex_failure.
:- interface.
:- import_module io.
:- pred main(io__state::di, io__state::uo) is det.
:- implementation.
:- import_module std_util, list, int.
main -->
{ solutions(p1, Xs1) },
print_list(Xs1),
{ solutions(p2, Xs2) },
print_list(Xs2),
{ solutions(p3, Xs3) },
print_list(Xs3).
:- pred p1(int::out) is nondet.
p1(X) :-
p(1, X).
:- pred p2(int::out) is nondet.
p2(X) :-
p(2, X).
:- pred p3(int::out) is nondet.
p3(X) :-
p(3, X).
:- pred p(int::in, int::out) is nondet.
p(A, X) :-
% The first if-then-else can hijack the redoip/redofr slots
% of p's frame.
( if
some [B] ( q(A, B) ; r(A, B) )
then
C is B * 10
% s(B, C)
else
C is A * 10
% s(A, C)
),
% The second if-then-else cannot hijack the redoip/redofr slots
% of p's frame, since this may not be (and usually won't be)
% on top when execution gets here.
( if
some [D] ( q(C, D) ; r(C, D) )
then
s(D, X)
else
s(C, X)
).
:- pred q(int::in, int::out) is nondet.
q(1, 15).
q(1, 16).
q(2, 25).
q(2, 26).
q(3, 35).
q(150, 660).
q(161, 661).
q(281, 662).
:- pred r(int::in, int::out) is nondet.
r(1, 18).
r(1, 19).
r(2, 28).
r(2, 29).
r(3, 38).
r(260, 690).
r(370, 698).
:- pred s(int::in, int::out) is nondet.
s(F, G) :-
F < 695,
(
G is 10 * F
;
G is 10 * F + 1
).
:- pred print_list(list(int), io__state, io__state).
:- mode print_list(in, di, uo) is det.
print_list(Xs) -->
(
{ Xs = [] }
->
io__write_string("[]\n")
;
io__write_string("["),
print_list_2(Xs),
io__write_string("]\n")
).
:- pred print_list_2(list(int), io__state, io__state).
:- mode print_list_2(in, di, uo) is det.
print_list_2([]) --> [].
print_list_2([X|Xs]) -->
io__write_int(X),
(
{ Xs = [] }
->
[]
;
io__write_string(", "),
print_list_2(Xs)
).