<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-14116</id>
	<title>Nabble - Mercury</title>
	<updated>2009-11-30T01:39:04Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/Mercury-f14116.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Mercury-f14116.html" />
	<subtitle type="html">Mercury is a new logic/functional programming language, which combines the clarity and expressiveness of declarative programming with advanced static analysis and error detection features. Mercury home is &lt;a href=&quot;http://www.cs.mu.oz.au/research/mercury/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26571746</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-30T01:39:04Z</published>
	<updated>2009-11-30T01:39:04Z</updated>
	<author>
		<name>Julien Fischer-2</name>
	</author>
	<content type="html">&lt;br&gt;On Mon, 30 Nov 2009, Paul Bone wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 30, 2009 at 02:38:45PM +1100, Ian MacLarty wrote:
&lt;br&gt;&amp;gt;&amp;gt; On Mon, Nov 30, 2009 at 2:01 PM, Peter Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26571746&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;novalazy@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On 2009-11-30, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26571746&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;     Announce gcc 4 support.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;     Update list of working compilers.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;     Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; What about the issues with Boehm GC with the most recent OS X?  Have we fixed
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; that?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Don't think so, but hlc.gc seems to work at least.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Not sure which Boegm GC issue is being refered to, but there was an
&lt;br&gt;&amp;gt;&amp;gt; issue to do with an undefined macro &amp;nbsp;which prevented Mercury from
&lt;br&gt;&amp;gt;&amp;gt; working on Snow Leopard at all. &amp;nbsp;That issue has been fixed, so Snow
&lt;br&gt;&amp;gt;&amp;gt; Leopard can now run programs compiled in the none.gc and hlc.gc
&lt;br&gt;&amp;gt;&amp;gt; grades.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Ok,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I seem to recall there being an issue that the Sydney/Canberra G12 people
&lt;br&gt;&amp;gt; stumbled apon. &amp;nbsp;Julian has probably fixed it.
&lt;/div&gt;&lt;/div&gt;Actually, Ian fixed it - the fix was the pass -m32 to gcc and a couple
&lt;br&gt;of minor edits to one of the header files.
&lt;br&gt;&lt;br&gt;Julien.&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26571746.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26571733</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-30T01:37:19Z</published>
	<updated>2009-11-30T01:37:19Z</updated>
	<author>
		<name>Julien Fischer-2</name>
	</author>
	<content type="html">&lt;br&gt;On Mon, 30 Nov 2009, Ian MacLarty wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 30, 2009 at 2:01 PM, Peter Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26571733&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;novalazy@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; On 2009-11-30, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26571733&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;     Announce gcc 4 support.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;     Update list of working compilers.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;     Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; What about the issues with Boehm GC with the most recent OS X?  Have we fixed
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; that?
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Don't think so, but hlc.gc seems to work at least.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Not sure which Boegm GC issue is being refered to, but there was an
&lt;br&gt;&amp;gt; issue to do with an undefined macro &amp;nbsp;which prevented Mercury from
&lt;br&gt;&amp;gt; working on Snow Leopard at all. &amp;nbsp;That issue has been fixed, so Snow
&lt;br&gt;&amp;gt; Leopard can now run programs compiled in the none.gc and hlc.gc
&lt;br&gt;&amp;gt; grades.
&lt;/div&gt;&lt;/div&gt;IIRC, the verison of Boehm GC we have doesn't compile with the 64-bit
&lt;br&gt;variant of OS X (which happens to be the default on Snow Leopard.).
&lt;br&gt;&lt;br&gt;Julien.&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26571733.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26569484</id>
	<title>Re: A diff of adding a new option for RBMM</title>
	<published>2009-11-29T20:31:36Z</published>
	<updated>2009-11-29T20:31:36Z</updated>
	<author>
		<name>Ralph Becket-2</name>
	</author>
	<content type="html">Zoltan Somogyi, Monday, 30 November 2009:
&lt;br&gt;&amp;gt; On 29-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569484&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; Good luck with the completion of your Phd!
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Quan got his PhD last monday.
&lt;br&gt;&lt;br&gt;Well done!
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569484&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569484&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569484&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-diff-of-adding-a-new-option-for-RBMM-tp26544205p26569484.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26569229</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-29T19:44:08Z</published>
	<updated>2009-11-29T19:44:08Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Mon, Nov 30, 2009 at 02:38:45PM +1100, Ian MacLarty wrote:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 30, 2009 at 2:01 PM, Peter Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569229&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;novalazy@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; On 2009-11-30, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569229&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; Branches: main
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;     Announce gcc 4 support.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;     Update list of working compilers.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;     Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; What about the issues with Boehm GC with the most recent OS X?  Have we fixed
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; that?
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Don't think so, but hlc.gc seems to work at least.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Not sure which Boegm GC issue is being refered to, but there was an
&lt;br&gt;&amp;gt; issue to do with an undefined macro &amp;nbsp;which prevented Mercury from
&lt;br&gt;&amp;gt; working on Snow Leopard at all. &amp;nbsp;That issue has been fixed, so Snow
&lt;br&gt;&amp;gt; Leopard can now run programs compiled in the none.gc and hlc.gc
&lt;br&gt;&amp;gt; grades.
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;/div&gt;Ok,
&lt;br&gt;&lt;br&gt;I seem to recall there being an issue that the Sydney/Canberra G12 people
&lt;br&gt;stumbled apon. &amp;nbsp;Julian has probably fixed it.
&lt;br&gt;&lt;br&gt;My concerns regarding this have been satisfied, go ahead and commit it.
&lt;br&gt;&lt;br&gt;Thanks.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26569229/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26569229.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26569175</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-29T19:38:45Z</published>
	<updated>2009-11-29T19:38:45Z</updated>
	<author>
		<name>Ian MacLarty-4</name>
	</author>
	<content type="html">On Mon, Nov 30, 2009 at 2:01 PM, Peter Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569175&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;novalazy@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 2009-11-30, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569175&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; Branches: main
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;     Announce gcc 4 support.
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;     Update list of working compilers.
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;     Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; What about the issues with Boehm GC with the most recent OS X?  Have we fixed
&lt;br&gt;&amp;gt;&amp;gt; that?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Don't think so, but hlc.gc seems to work at least.
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;Not sure which Boegm GC issue is being refered to, but there was an
&lt;br&gt;issue to do with an undefined macro &amp;nbsp;which prevented Mercury from
&lt;br&gt;working on Snow Leopard at all. &amp;nbsp;That issue has been fixed, so Snow
&lt;br&gt;Leopard can now run programs compiled in the none.gc and hlc.gc
&lt;br&gt;grades.
&lt;br&gt;&lt;br&gt;Ian.
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569175&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569175&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569175&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26569175.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26568957</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-29T19:01:01Z</published>
	<updated>2009-11-29T19:01:01Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">On 2009-11-30, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568957&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt; &amp;gt; Branches: main
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt; &amp;gt; 	Announce gcc 4 support.
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt; &amp;gt; 	Update list of working compilers.
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; 	Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; What about the issues with Boehm GC with the most recent OS X? &amp;nbsp;Have we fixed
&lt;br&gt;&amp;gt; that?
&lt;/div&gt;&lt;br&gt;Don't think so, but hlc.gc seems to work at least.
&lt;br&gt;&lt;br&gt;Peter
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568957&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568957&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568957&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26568957.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26568827</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-29T18:34:25Z</published>
	<updated>2009-11-29T18:34:25Z</updated>
	<author>
		<name>Ian MacLarty-4</name>
	</author>
	<content type="html">On Mon, Nov 30, 2009 at 12:48 PM, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568827&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt;&amp;gt;       Announce gcc 4 support.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt;&amp;gt;       Update list of working compilers.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;       Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; What about the issues with Boehm GC with the most recent OS X?  Have we fixed
&lt;br&gt;&amp;gt; that?
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;Yes, as far as I know. (It works on my Mac anyway, which is running
&lt;br&gt;Snow Leopard).
&lt;br&gt;&lt;br&gt;Ian.
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568827&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568827&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568827&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26568827.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26568745</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-29T18:08:54Z</published>
	<updated>2009-11-29T18:08:54Z</updated>
	<author>
		<name>Ian MacLarty-4</name>
	</author>
	<content type="html">On Mon, Nov 30, 2009 at 12:32 PM, Peter Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568745&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;novalazy@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt;        Announce gcc 4 support.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt;        Update list of working compilers.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        Add Mac OS X to list of working OSes.
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;That looks fine.
&lt;br&gt;&lt;br&gt;Ian.
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568745&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568745&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568745&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26568745.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26568514</id>
	<title>Re: for review: update web site for gcc 4</title>
	<published>2009-11-29T17:48:09Z</published>
	<updated>2009-11-29T17:48:09Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Mon, Nov 30, 2009 at 12:32:43PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; news/newsdb.inc:
&lt;br&gt;&amp;gt; 	Announce gcc 4 support.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; download/include/rotd.inc:
&lt;br&gt;&amp;gt; 	Update list of working compilers.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	Add Mac OS X to list of working OSes.
&lt;br&gt;&lt;br&gt;What about the issues with Boehm GC with the most recent OS X? &amp;nbsp;Have we fixed
&lt;br&gt;that?
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26568514/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26568514.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26568421</id>
	<title>for review: update web site for gcc 4</title>
	<published>2009-11-29T17:32:43Z</published>
	<updated>2009-11-29T17:32:43Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">Branches: main
&lt;br&gt;&lt;br&gt;news/newsdb.inc:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Announce gcc 4 support.
&lt;br&gt;&lt;br&gt;download/include/rotd.inc:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Update list of working compilers.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add Mac OS X to list of working OSes.
&lt;br&gt;&lt;br&gt;Index: download/include/rotd.inc
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/w3/download/include/rotd.inc,v
&lt;br&gt;retrieving revision 1.15
&lt;br&gt;diff -u -p -r1.15 rotd.inc
&lt;br&gt;--- download/include/rotd.inc	1 Oct 2009 07:11:11 -0000	1.15
&lt;br&gt;+++ download/include/rotd.inc	30 Nov 2009 01:30:45 -0000
&lt;br&gt;@@ -80,6 +80,7 @@ tested for every release of the day.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; x86 machines running FreeBSD 3.0
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; x86 machines running other BSD Unix systems
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; x86 machines running SunOS 5.x
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; x86 machines running Mac OS X
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; PowerPC machines running Linux
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; PowerPC machines running Mac OS 10.3 and above
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;li&amp;gt; Sun SPARC machines running SunOS 4.x and 5.x
&lt;br&gt;@@ -102,15 +103,13 @@ tested for every release of the day.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; We recommend GCC 3.4.x.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;
&lt;br&gt;+	 GCC 4.1 - 4.4 also work (on Linux x86/x86-64).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GCC 3.0, 3.3.1 and 4.0 will NOT work. 
&lt;br&gt;&amp;nbsp;	 They have bugs which cause 
&lt;br&gt;&amp;nbsp;	 internal compiler errors when compiling the C code generated by the 
&lt;br&gt;&amp;nbsp;	 Mercury compiler.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;
&lt;br&gt;-	 GCC 4.1 - 4.4 do not work well with the low-level C grades.
&lt;br&gt;-	 gcc-specific optimisations will be disabled, so performance will
&lt;br&gt;-	 be much worse than it should be. &amp;nbsp;We are working on it.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Avoid GCC 2.96 (distributed with Red Hat Linux 7.x) and
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; other unofficial releases of GCC. &amp;nbsp;Also avoid versions of GCC less 
&lt;br&gt;&amp;nbsp;	 than GCC 2.95.X.
&lt;br&gt;Index: news/newsdb.inc
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/w3/news/newsdb.inc,v
&lt;br&gt;retrieving revision 1.113
&lt;br&gt;diff -u -p -r1.113 newsdb.inc
&lt;br&gt;--- news/newsdb.inc	25 Sep 2009 07:07:41 -0000	1.113
&lt;br&gt;+++ news/newsdb.inc	30 Nov 2009 01:30:45 -0000
&lt;br&gt;@@ -21,6 +21,11 @@
&lt;br&gt;&amp;nbsp;*/
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;$newsdb = array(
&lt;br&gt;+&amp;quot;30 November 2009&amp;quot; =&amp;gt; array(&amp;quot;GCC 4.x supprt&amp;quot;,
&lt;br&gt;+&amp;quot;You can now use GCC 4.1 - 4.4 to build Mercury programs in
&lt;br&gt;+low-level C grades, on Linux/x86 and Linux/x86-64.
&lt;br&gt;+You will need a release of the day.
&lt;br&gt;+&amp;quot;),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;quot;25 September 2009&amp;quot; =&amp;gt; array(&amp;quot;Java backend&amp;quot;,
&lt;br&gt;&amp;nbsp;&amp;quot;The Java backend was restored and improved over the last few months.
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568421&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568421&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568421&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-update-web-site-for-gcc-4-tp26568421p26568421.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26568359</id>
	<title>gcc 4.x support</title>
	<published>2009-11-29T17:10:19Z</published>
	<updated>2009-11-29T17:10:19Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;rotd-2009-11-26 is compatible with gcc 4.1 through 4.4 for asm_fast and
&lt;br&gt;reg grades, on Linux/x86 and Linux/x86-64. &amp;nbsp;Windows is untested.
&lt;br&gt;Mac OS X is still broken for different reasons.
&lt;br&gt;&lt;br&gt;As noted, the usual address isn't working so you'll have to go via
&lt;br&gt;&lt;a href=&quot;http://www.mercury.csse.unimelb.edu.au/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.mercury.csse.unimelb.edu.au/&lt;/a&gt;&lt;br&gt;&lt;br&gt;Peter
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-users mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568359&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-users@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568359&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-users@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26568359&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-users-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Users-f14118.html&quot; embed=&quot;fixTarget[14118]&quot; target=&quot;_top&quot; &gt;Mercury - Users&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/gcc-4.x-support-tp26568359p26568359.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26565584</id>
	<title>Re: for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-29T12:16:00Z</published>
	<updated>2009-11-29T12:16:00Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Mon, Nov 30, 2009 at 06:14:05AM +1100, Zoltan Somogyi wrote:
&lt;br&gt;&amp;gt; On 27-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26565584&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; This change passes bootcheck and the test suite in the asm_fast.gc.par grade.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; library/thread.semaphore.m:
&lt;br&gt;&amp;gt; 	Fix bug that prevented the library from compiling in grade hlc.gc.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Thanks.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26565584/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26565584.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26565008</id>
	<title>Re: for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-29T11:14:05Z</published>
	<updated>2009-11-29T11:14:05Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">On 27-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26565008&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; This change passes bootcheck and the test suite in the asm_fast.gc.par grade.
&lt;br&gt;&lt;br&gt;library/thread.semaphore.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix bug that prevented the library from compiling in grade hlc.gc.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;&lt;br&gt;cvs diff: Diffing .
&lt;br&gt;Index: thread.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/library/thread.m,v
&lt;br&gt;retrieving revision 1.16
&lt;br&gt;diff -u -b -r1.16 thread.m
&lt;br&gt;--- thread.m	5 Aug 2009 06:08:13 -0000	1.16
&lt;br&gt;+++ thread.m	29 Nov 2009 19:08:29 -0000
&lt;br&gt;@@ -372,7 +372,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_LOCK(&amp;MR_thread_barrier_lock, &amp;quot;&amp;quot;ML_thread_wrapper&amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_thread_barrier_count--;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (MR_thread_barrier_count == 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;MR_thread_barrier_cond);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;MR_thread_barrier_cond, &amp;quot;&amp;quot;ML_thread_wrapper&amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_thread_barrier_lock, &amp;quot;&amp;quot;ML_thread_wrapper&amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;Index: thread.semaphore.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/library/thread.semaphore.m,v
&lt;br&gt;retrieving revision 1.17
&lt;br&gt;diff -u -b -r1.17 thread.semaphore.m
&lt;br&gt;--- thread.semaphore.m	5 Aug 2009 06:08:13 -0000	1.17
&lt;br&gt;+++ thread.semaphore.m	29 Nov 2009 19:08:29 -0000
&lt;br&gt;@@ -246,7 +246,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;#else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;sem-&amp;gt;count++;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;(sem-&amp;gt;cond));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;(sem-&amp;gt;cond), &amp;quot;&amp;quot;semaphore.signal&amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;(sem-&amp;gt;lock), &amp;quot;&amp;quot;semaphore__signal&amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IO = IO0;
&lt;br&gt;@@ -329,7 +329,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** return prematurely with the error code EINTR in glibc 2.3.2
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** if the thread is sent a signal.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (MR_WAIT(&amp;(sem-&amp;gt;cond), &amp;(sem-&amp;gt;lock)) != 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (MR_WAIT(&amp;(sem-&amp;gt;cond), &amp;(sem-&amp;gt;lock), &amp;quot;&amp;quot;semaphore.wait&amp;quot;&amp;quot;) != 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* do nothing */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26565008&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26565008&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26565008&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26565008.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26562643</id>
	<title>Re: A diff of adding a new option for RBMM</title>
	<published>2009-11-29T06:45:22Z</published>
	<updated>2009-11-29T06:45:22Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">On 29-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26562643&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; Good luck with the completion of your Phd!
&lt;br&gt;&lt;br&gt;Quan got his PhD last monday.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26562643&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26562643&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26562643&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-diff-of-adding-a-new-option-for-RBMM-tp26544205p26562643.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26557970</id>
	<title>Re: A diff of adding a new option for RBMM</title>
	<published>2009-11-28T15:23:49Z</published>
	<updated>2009-11-28T15:23:49Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Sun, Nov 29, 2009 at 10:16:10AM +1100, Zoltan Somogyi wrote:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 29-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26557970&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; issue 'cvs add' for files that you're adding as part of this change?
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; I'm getting the following error when I try to build Mercury:
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; make[1]: *** No rule to make target `rbmm.actual_region_arguments.m', needed by `transform_hlds.date0'. &amp;nbsp;Stop.
&lt;br&gt;&amp;gt; &amp;gt; make[1]: *** Waiting for unfinished jobs....
&lt;br&gt;&amp;gt; &amp;gt; make[1]: Leaving directory `/mnt/mercury/taura-workspaces/pbone/par-runtime-profiling/compiler'
&lt;br&gt;&amp;gt; &amp;gt; make: *** [compiler] Error 2
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; This diff REMOVED rbmm.actual_region_arguments.m. The reason why you are
&lt;br&gt;&amp;gt; getting the error is that you haven't done removed that module's now obsolete
&lt;br&gt;&amp;gt; interface files and done a &amp;quot;mmake depend&amp;quot;.
&lt;/div&gt;&lt;/div&gt;Sorry Quan.
&lt;br&gt;&lt;br&gt;I was mistaken. &amp;nbsp;I thought I had cleaned it properly but after I found that
&lt;br&gt;using 'cvs up -D' to roll back to a previous version still didn't work that I
&lt;br&gt;misunderstood the problem.
&lt;br&gt;&lt;br&gt;Next time I'll test my claim by building a freshly checked-out workspace. :-)
&lt;br&gt;Good luck with the completion of your Phd!
&lt;br&gt;&lt;br&gt;Thanks.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26557970/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-diff-of-adding-a-new-option-for-RBMM-tp26544205p26557970.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26557922</id>
	<title>Re: A diff of adding a new option for RBMM</title>
	<published>2009-11-28T15:16:10Z</published>
	<updated>2009-11-28T15:16:10Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">On 29-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26557922&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; issue 'cvs add' for files that you're adding as part of this change?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I'm getting the following error when I try to build Mercury:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; make[1]: *** No rule to make target `rbmm.actual_region_arguments.m', needed by `transform_hlds.date0'. &amp;nbsp;Stop.
&lt;br&gt;&amp;gt; make[1]: *** Waiting for unfinished jobs....
&lt;br&gt;&amp;gt; make[1]: Leaving directory `/mnt/mercury/taura-workspaces/pbone/par-runtime-profiling/compiler'
&lt;br&gt;&amp;gt; make: *** [compiler] Error 2
&lt;br&gt;&lt;br&gt;This diff REMOVED rbmm.actual_region_arguments.m. The reason why you are
&lt;br&gt;getting the error is that you haven't done removed that module's now obsolete
&lt;br&gt;interface files and done a &amp;quot;mmake depend&amp;quot;.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26557922&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26557922&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26557922&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-diff-of-adding-a-new-option-for-RBMM-tp26544205p26557922.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26557832</id>
	<title>Re: A diff of adding a new option for RBMM</title>
	<published>2009-11-28T15:05:21Z</published>
	<updated>2009-11-28T15:05:21Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Fri, Nov 27, 2009 at 04:50:09PM +0100, Quan Phan wrote:
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; This diff has been reviewed by Zoltan.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Hi Quan, I noticed that you've commited this already, but did you remember to
&lt;br&gt;issue 'cvs add' for files that you're adding as part of this change?
&lt;br&gt;&lt;br&gt;I'm getting the following error when I try to build Mercury:
&lt;br&gt;&lt;br&gt;make[1]: *** No rule to make target `rbmm.actual_region_arguments.m', needed by `transform_hlds.date0'. &amp;nbsp;Stop.
&lt;br&gt;make[1]: *** Waiting for unfinished jobs....
&lt;br&gt;make[1]: Leaving directory `/mnt/mercury/taura-workspaces/pbone/par-runtime-profiling/compiler'
&lt;br&gt;make: *** [compiler] Error 2
&lt;br&gt;&lt;br&gt;Thanks.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26557832/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-diff-of-adding-a-new-option-for-RBMM-tp26544205p26557832.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26544205</id>
	<title>A diff of adding a new option for RBMM</title>
	<published>2009-11-27T07:50:09Z</published>
	<updated>2009-11-27T07:50:09Z</updated>
	<author>
		<name>Quan Phan</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;This diff has been reviewed by Zoltan.
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;Quan.
&lt;br&gt;&lt;br&gt;&lt;br&gt;compiler/options.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Add a new option that allows us to distinguish between the rbmm2 and rbmm3
&lt;br&gt;&amp;nbsp; &amp;nbsp; versions of the system in the paper.
&lt;br&gt;&lt;br&gt;compiler/rbmm.add_rbmm_goal_infos.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Use the new option to decide whether to apply the optimization
&lt;br&gt;&amp;nbsp; &amp;nbsp; that distinguishes rbmm3.
&lt;br&gt;&lt;br&gt;compiler/rbmm.points_to_graph.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Add a utility predicate needed by the new code in
&lt;br&gt;&amp;nbsp; &amp;nbsp; rbmm.add_rbmm_goal_infos.m.
&lt;br&gt;&lt;br&gt;compiler/rbmm.region_arguments.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; A new module that replaces rbmm.actual_region_arguments.m. It computes
&lt;br&gt;&amp;nbsp; &amp;nbsp; the regions in one place, not in several.
&lt;br&gt;&lt;br&gt;compiler/rbmm.actual_region_arguments.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Remove this replaced module.
&lt;br&gt;&lt;br&gt;compiler/rbmm.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Replace the old module with the new one.
&lt;br&gt;&lt;br&gt;compiler/rbmm.points_to_analysis.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Apply rule T6 from my thesis.
&lt;br&gt;&lt;br&gt;compiler/rbmm.points_to_info.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Add meaningful names to some types.
&lt;br&gt;&lt;br&gt;compiler/rbmm.interproc_region_lifetime.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Use the new type name.
&lt;br&gt;&lt;br&gt;compiler/rbmm.region_transformation.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Use the new type name, and use the new data structure representing
&lt;br&gt;&amp;nbsp; &amp;nbsp; procedure arguments.
&lt;br&gt;&lt;br&gt;cvs diff: Diffing .
&lt;br&gt;Index: options.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/options.m,v
&lt;br&gt;retrieving revision 1.660
&lt;br&gt;diff -u -r1.660 options.m
&lt;br&gt;--- options.m	30 Oct 2009 03:33:17 -0000	1.660
&lt;br&gt;+++ options.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -372,6 +372,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; extend_stacks_when_needed
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack_segments
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; use_regions
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; use_alloc_regions
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; use_regions_debug
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; use_regions_profiling
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; source_to_source_debug
&lt;br&gt;@@ -1247,6 +1248,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;extend_stacks_when_needed &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;stack_segments &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;use_regions &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(no),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;use_alloc_regions &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(yes),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;use_regions_debug &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;use_regions_profiling &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;use_minimal_model_stack_copy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &amp;nbsp; bool(no),
&lt;br&gt;@@ -2112,6 +2114,7 @@
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;extend-stacks-when-needed&amp;quot;, &amp;nbsp; &amp;nbsp;extend_stacks_when_needed).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;stack-segments&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp; stack_segments).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;use-regions&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use_regions).
&lt;br&gt;+long_option(&amp;quot;use-alloc-regions&amp;quot;, &amp;nbsp; &amp;nbsp;use_alloc_regions).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;use-regions-debug&amp;quot;, &amp;nbsp; &amp;nbsp;use_regions_debug).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;use-regions-profiling&amp;quot;,use_regions_profiling).
&lt;br&gt;&amp;nbsp;% Data representation options
&lt;br&gt;@@ -4201,6 +4204,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% should also document rbmmd rbmmp rbmmdp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%&amp;quot;--use-regions\t\t(grade modifier: `.rbmm')&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%&amp;quot;\tEnable support for region-based memory managment.&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%&amp;quot;--use-alloc-regions&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%&amp;quot;\tCompute and use the exact set of regions&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%&amp;quot;\t that may be allocated into by a call.&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;]),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;\n &amp;nbsp; &amp;nbsp;LLDS back-end compilation model options:\n&amp;quot;),
&lt;br&gt;Index: rbmm.actual_region_arguments.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: rbmm.actual_region_arguments.m
&lt;br&gt;diff -N rbmm.actual_region_arguments.m
&lt;br&gt;--- rbmm.actual_region_arguments.m	23 Dec 2008 01:37:40 -0000	1.4
&lt;br&gt;+++ /dev/null	1 Jan 1970 00:00:00 -0000
&lt;br&gt;@@ -1,268 +0,0 @@
&lt;br&gt;-% -----------------------------------------------------------------------------%
&lt;br&gt;-% vim: ft=mercury ts=4 sw=4 et
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-% Copyright (C) 2007-2008 The University of Melbourne.
&lt;br&gt;-% This file may only be copied under the terms of the GNU General
&lt;br&gt;-% Public License - see the file COPYING in the Mercury distribution.
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%
&lt;br&gt;-% File: rbmm.actual_region_arguments.m.
&lt;br&gt;-% Main author: Quan Phan.
&lt;br&gt;-%
&lt;br&gt;-% We will pass regions as extra arguments in procedure calls. The extra formal
&lt;br&gt;-% region arguments are already known from live region analysis.
&lt;br&gt;-% This module derives the corresponding actual region arguments at call sites
&lt;br&gt;-% in each procedure. This information will be used to extend the argument
&lt;br&gt;-% lists of calls in the HLDS.
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-
&lt;br&gt;-:- module transform_hlds.rbmm.actual_region_arguments.
&lt;br&gt;-:- interface.
&lt;br&gt;-
&lt;br&gt;-:- import_module hlds.
&lt;br&gt;-:- import_module hlds.hlds_module.
&lt;br&gt;-:- import_module hlds.hlds_pred.
&lt;br&gt;-:- import_module transform_hlds.rbmm.points_to_graph.
&lt;br&gt;-:- import_module transform_hlds.rbmm.points_to_info.
&lt;br&gt;-:- import_module transform_hlds.rbmm.region_liveness_info.
&lt;br&gt;-:- import_module transform_hlds.smm_common.
&lt;br&gt;-
&lt;br&gt;-:- import_module list.
&lt;br&gt;-:- import_module map.
&lt;br&gt;-
&lt;br&gt;-:- type proc_pp_actual_region_args_table
&lt;br&gt;- &amp;nbsp; &amp;nbsp;== &amp;nbsp;map(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pred_proc_id,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pp_actual_region_args_table
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- type pp_actual_region_args_table
&lt;br&gt;- &amp;nbsp; &amp;nbsp;== &amp;nbsp;map(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;program_point,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;actual_region_args
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- type actual_region_args
&lt;br&gt;- &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;actual_region_args(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list(rptg_node), &amp;nbsp; &amp;nbsp;% constant (carried) region arguments.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list(rptg_node), &amp;nbsp; &amp;nbsp;% inputs (removed).
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list(rptg_node) &amp;nbsp; &amp;nbsp; % outputs (created).
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-:- pred record_actual_region_arguments(module_info::in, rpta_info_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-
&lt;br&gt;-:- implementation.
&lt;br&gt;-
&lt;br&gt;-:- import_module check_hlds.
&lt;br&gt;-:- import_module check_hlds.goal_path.
&lt;br&gt;-:- import_module hlds.hlds_goal.
&lt;br&gt;-:- import_module libs.
&lt;br&gt;-:- import_module libs.compiler_util.
&lt;br&gt;-
&lt;br&gt;-:- import_module set.
&lt;br&gt;-:- import_module string.
&lt;br&gt;-:- import_module svmap.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments(ModuleInfo, RptaInfoTable, ConstantRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DeadRTable, BornRTable, ActualRegionArgTable) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;module_info_predids(PredIds, ModuleInfo, _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.foldl(record_actual_region_arguments_pred(ModuleInfo,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredIds, map.init, ActualRegionArgTable).
&lt;br&gt;-
&lt;br&gt;-:- pred record_actual_region_arguments_pred(module_info::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, pred_id::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments_pred(ModuleInfo, RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, PredId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgTable) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;module_info_pred_info(ModuleInfo, PredId, PredInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;ProcIds = pred_info_non_imported_procids(PredInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.foldl(record_actual_region_arguments_proc(ModuleInfo, PredId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable), ProcIds,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgTable).
&lt;br&gt;-
&lt;br&gt;-:- pred record_actual_region_arguments_proc(module_info::in, pred_id::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, proc_id::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments_proc(ModuleInfo, PredId, RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, ProcId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgTable) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;PPId = proc(PredId, ProcId),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;( if &amp;nbsp; &amp;nbsp;some_are_special_preds([PPId], ModuleInfo)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;then &amp;nbsp;true
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;module_info_proc_info(ModuleInfo, PPId, ProcInfo0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fill_goal_path_slots(ModuleInfo, ProcInfo0, ProcInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info_get_goal(ProcInfo, Body),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, PPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Body,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.init, ActualRegionArgProc),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.set(PPId, ActualRegionArgProc, !ActualRegionArgTable)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred record_actual_region_arguments_goal(module_info::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pred_proc_id::in, rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, hlds_goal::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments_goal(ModuleInfo, PPId, RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, Goal, !ActualRegionArgProc) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Goal = hlds_goal(Expr, Info),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;record_actual_region_arguments_expr(Expr, Info, ModuleInfo, PPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc).
&lt;br&gt;-
&lt;br&gt;-:- pred record_actual_region_arguments_expr(hlds_goal_expr::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;hlds_goal_info::in, module_info::in, pred_proc_id::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments_expr(GoalExpr, GoalInfo, ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = plain_call(PredId, ProcId, _, _, _, _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId = proc(PredId, ProcId),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( some_are_special_preds([CalleePPId], ModuleInfo) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CallSite = program_point_init(GoalInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_call_site(CallerPPId, CallSite,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId, RptaInfoTable, ConstantRTable, DeadRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BornRTable, !ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = conj(_, Conjuncts),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Conjuncts, !ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = disj(Disjuncts),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Disjuncts, !ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = if_then_else(_, Cond, Then, Else),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Cond,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Then,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Else,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = switch(_, _, Cases),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_case(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Cases, !ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = generic_call(_, _, _, _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sorry(this_file,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;record_actual_region_arguments_expr: generic_call NYI&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = call_foreign_proc(_, _, _, _, _, _, _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sorry(this_file,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;record_actual_region_arguments_expr: call_foreign_proc NYI&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = negation(SubGoal),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, SubGoal,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = unify(_, _, _, _, _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = scope(_, SubGoal),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX We should special-case the handling of from_ground_term_construct
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% scopes.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, SubGoal,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = shorthand(_),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;record_actual_region_arguments_expr: shorthand&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred record_actual_region_arguments_case(module_info::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pred_proc_id::in, rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, case::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments_case(ModuleInfo, PPId, RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, Case, !ActualRegionArgProc) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Case = case(_, _, Goal),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, PPId, RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, Goal, !ActualRegionArgProc).
&lt;br&gt;-
&lt;br&gt;-:- pred record_actual_region_arguments_call_site(pred_proc_id::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;program_point::in, pred_proc_id::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;-
&lt;br&gt;-record_actual_region_arguments_call_site(CallerPPId, CallSite,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId, RptaInfoTable, ConstantRTable, DeadRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BornRTable, !ActualRegionArgProc) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(ConstantRTable, CalleePPId, CalleeConstantR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(DeadRTable, CalleePPId, CalleeDeadR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(BornRTable, CalleePPId, CalleeBornR),
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(RptaInfoTable, CallerPPId, CallerRptaInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;CallerRptaInfo = rpta_info(_, CallerAlpha),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(CallerAlpha, CallSite, AlphaAtCallSite),
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Actual constant region arguments.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;set.to_sorted_list(CalleeConstantR, LCalleeConstantR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.foldl(find_actual_param(AlphaAtCallSite), LCalleeConstantR, [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LActualConstantR0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.reverse(LActualConstantR0, LActualConstantR),
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Actual dead region arguments.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;set.to_sorted_list(CalleeDeadR, LCalleeDeadR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.foldl(find_actual_param(AlphaAtCallSite), LCalleeDeadR, [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LActualDeadR0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.reverse(LActualDeadR0, LActualDeadR),
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Actual born region arguments.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;set.to_sorted_list(CalleeBornR, LCalleeBornR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.foldl(find_actual_param(AlphaAtCallSite), LCalleeBornR, [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LActualBornR0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.reverse(LActualBornR0, LActualBornR),
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;svmap.det_insert(CallSite,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;actual_region_args(LActualConstantR, LActualDeadR, LActualBornR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc).
&lt;br&gt;-
&lt;br&gt;-:- pred find_actual_param(map(rptg_node, rptg_node)::in, rptg_node::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list(rptg_node)::in, list(rptg_node)::out) is det.
&lt;br&gt;-
&lt;br&gt;-find_actual_param(Alpha_PP, Formal, Actuals0, Actuals) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(Alpha_PP, Formal, Actual),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Actuals = [Actual | Actuals0].
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-
&lt;br&gt;-:- func this_file = string.
&lt;br&gt;-
&lt;br&gt;-this_file = &amp;quot;rbmm.actual_region_arguments.m&amp;quot;.
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;Index: rbmm.add_rbmm_goal_infos.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.add_rbmm_goal_infos.m,v
&lt;br&gt;retrieving revision 1.8
&lt;br&gt;diff -u -r1.8 rbmm.add_rbmm_goal_infos.m
&lt;br&gt;--- rbmm.add_rbmm_goal_infos.m	2 Sep 2009 00:30:23 -0000	1.8
&lt;br&gt;+++ rbmm.add_rbmm_goal_infos.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -41,8 +41,8 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- import_module hlds.
&lt;br&gt;&amp;nbsp;:- import_module hlds.hlds_module.
&lt;br&gt;-:- import_module transform_hlds.rbmm.actual_region_arguments.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.points_to_info.
&lt;br&gt;+:- import_module transform_hlds.rbmm.region_arguments.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_resurrection_renaming.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_transformation.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -63,6 +63,8 @@
&lt;br&gt;&amp;nbsp;:- import_module hlds.hlds_pred.
&lt;br&gt;&amp;nbsp;:- import_module libs.
&lt;br&gt;&amp;nbsp;:- import_module libs.compiler_util.
&lt;br&gt;+:- import_module libs.globals.
&lt;br&gt;+:- import_module libs.options.
&lt;br&gt;&amp;nbsp;:- import_module mdbcomp.
&lt;br&gt;&amp;nbsp;:- import_module mdbcomp.prim_data.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.
&lt;br&gt;@@ -72,11 +74,12 @@
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.points_to_graph.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.smm_common.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- import_module string.
&lt;br&gt;+:- import_module bool.
&lt;br&gt;&amp;nbsp;:- import_module list.
&lt;br&gt;&amp;nbsp;:- import_module map.
&lt;br&gt;&amp;nbsp;:- import_module maybe.
&lt;br&gt;&amp;nbsp;:- import_module set.
&lt;br&gt;+:- import_module string.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;%
&lt;br&gt;@@ -163,7 +166,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;collect_rbmm_goal_info_unification(Unification, ModuleInfo, Graph,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenaming, IteRenaming, NameToRegionVar, !Info).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-collect_rbmm_goal_info_goal_expr(ModuleInfo, ProcInfo, _,
&lt;br&gt;+collect_rbmm_goal_info_goal_expr(ModuleInfo, ProcInfo, Graph,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgumentProc, _, _, _, !Expr, !Info) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;!.Expr = plain_call(PredId, ProcId, Args, _, _, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId = proc(PredId, ProcId),
&lt;br&gt;@@ -189,7 +192,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info_get_vartypes(ProcInfo, VarTypes),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionArgs = list.filter(is_region_var(VarTypes), Args),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(ActualRegionArgumentProc, CallSite, ActualRegionArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgs = actual_region_args(Constants, Inputs, _Outputs),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgs = region_args(Constants, Inputs, _Outputs),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.det_split_list(list.length(Constants), RegionArgs,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CarriedRegions, RemovedAndCreated),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.det_split_list(list.length(Inputs), RemovedAndCreated,
&lt;br&gt;@@ -198,12 +201,55 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% are allocated into and read from in this call.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AllocatedIntoAndReadFrom =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.from_list(RemovedRegions ++ CarriedRegions),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;module_info_get_globals(ModuleInfo, Globals),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;globals.lookup_bool_option(Globals, use_alloc_regions,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UseAllocRegions),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UseAllocRegions = yes,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Keep only the regions that are removed but also allocated into.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;keep_allocated_regions(Inputs, RemovedRegions, Graph,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RemovedAndAllocRegions),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Allocated regions are the above plus the carried ones.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The carried here are those that are also allocated into.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AllocatedIntoRegions =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.from_list(RemovedAndAllocRegions ++ CarriedRegions)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UseAllocRegions = no,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AllocatedIntoRegions = AllocatedIntoAndReadFrom
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The read-from set is not very important so we are not precise
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% in estimating it.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RbmmGoalInfo = rbmm_goal_info(set.from_list(CreatedRegions),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.from_list(RemovedRegions), set.from_list(CarriedRegions),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AllocatedIntoAndReadFrom, AllocatedIntoAndReadFrom),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AllocatedIntoRegions, AllocatedIntoAndReadFrom),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goal_info_set_maybe_rbmm(yes(RbmmGoalInfo), !Info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% The elements in the first and second lists are corresponding.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Ones in the first list are the nodes in rpt graph therefore we can
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% check their allocated property, ones in the second list are prog_vars
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% (after renaming) that represent those in the first.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;%
&lt;br&gt;+:- pred keep_allocated_regions(list(rptg_node)::in, list(prog_var)::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpt_graph::in, list(prog_var)::out) is det.
&lt;br&gt;+
&lt;br&gt;+keep_allocated_regions([], [], _, []).
&lt;br&gt;+keep_allocated_regions([], [_ | _], _, []) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;keep_allocated_regions: length mismatch&amp;quot;).
&lt;br&gt;+keep_allocated_regions([_ | _], [], _, []) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;keep_allocated_regions: length mismatch&amp;quot;).
&lt;br&gt;+keep_allocated_regions([Input | Inputs], [RemovedRegion | RemovedRegions],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Graph, RemovedAndAllocRegions) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;keep_allocated_regions(Inputs, RemovedRegions, Graph,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RemovedAndAllocRegions0), 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( rptg_is_allocated_node(Graph, Input) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RemovedAndAllocRegions = [RemovedRegion | RemovedAndAllocRegions0]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RemovedAndAllocRegions = RemovedAndAllocRegions0
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;). 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% We do not handle generic calls and calls to foreign procs in RBMM yet,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% so if a program has any of them the RBMM compilation will fail before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% reaching here. We just call sorry now so that they are not
&lt;br&gt;@@ -440,6 +486,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;then
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goal_info_set_maybe_rbmm(yes(rbmm_info_init), !Info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% We need to try to apply renaming here because the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% region name in the Graph may need to be changed.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OriginalName = rptg_lookup_region_name(Graph, Node),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( map.search(ResurRenaming, OriginalName, ResurNameList) -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name = list.det_last(ResurNameList)
&lt;br&gt;@@ -448,18 +496,29 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name = OriginalName
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(RegionNameToVar, Name, RegionVar),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RbmmInfo = rbmm_goal_info(set.init, set.init,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.make_singleton_set(RegionVar),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.init, set.make_singleton_set(RegionVar)),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% This region may only be read from in the procedure containing
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% this deconstruction therefore there might be no entry for it
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% in RegionNameToVar.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( map.search(RegionNameToVar, Name, RegionVar) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RbmmInfo = rbmm_goal_info(set.init, set.init,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.make_singleton_set(RegionVar),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.init, set.make_singleton_set(RegionVar))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RbmmInfo = rbmm_info_init
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goal_info_set_maybe_rbmm(yes(RbmmInfo), !Info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( Unification = assign(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX We do have assignments between two region variables. But
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% we do not consider either of them created or removed because
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% the region they are bound to is still there, i.e., it has been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% created and will not be removed.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Unification = assign(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Unification = simple_test(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goal_info_set_maybe_rbmm(yes(rbmm_goal_info(set.init, set.init,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.init, set.init, set.init)), !Info)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goal_info_set_maybe_rbmm(yes(rbmm_info_init), !Info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Unification = complicated_unify(_, _, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;collect_rbmm_goal_info_unification:&amp;quot;
&lt;br&gt;Index: rbmm.interproc_region_lifetime.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.interproc_region_lifetime.m,v
&lt;br&gt;retrieving revision 1.4
&lt;br&gt;diff -u -r1.4 rbmm.interproc_region_lifetime.m
&lt;br&gt;--- rbmm.interproc_region_lifetime.m	6 Sep 2007 12:45:24 -0000	1.4
&lt;br&gt;+++ rbmm.interproc_region_lifetime.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -144,7 +144,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- type rule_pred == (
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pred(pred_proc_id, region_set, region_set, proc_region_set_table,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map(rptg_node, rptg_node), region_set)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rpt_call_alpha_mapping, region_set)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;&amp;nbsp;:- inst rule_pred == ( pred(in, in, in, in, in, out) is det ).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -347,8 +347,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Rules for eliminating regions from deadR set.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- pred dead_removal_rules(pred_proc_id::in, region_set::in, region_set::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, map(rptg_node, rptg_node)::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;region_set::out) is det.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, rpt_call_alpha_mapping::in, region_set::out)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;dead_removal_rules(Q_Id, LRBefore, LRAfter, DeadRTable, AlphaAtPP, DeadR_q) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% The current deadR of q.
&lt;br&gt;@@ -364,7 +364,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;targets_with_more_than_one_source(AlphaAtPP, Targets),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set.fold(dead_removal_rule_2(AlphaAtPP), Targets, DeadR_q1, DeadR_q).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- pred dead_removal_rule_1(map(rptg_node, rptg_node)::in, rptg_node::in,
&lt;br&gt;+:- pred dead_removal_rule_1(rpt_call_alpha_mapping::in, rptg_node::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;region_set::in, region_set::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;dead_removal_rule_1(AlphaAtCallSite, Region, !DeadR_q) :-
&lt;br&gt;@@ -375,7 +375,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Remove any r' that is in deadR(q).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set.difference(!.DeadR_q, RPrimes, !:DeadR_q).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- pred dead_removal_rule_2(map(rptg_node, rptg_node)::in, rptg_node::in,
&lt;br&gt;+:- pred dead_removal_rule_2(rpt_call_alpha_mapping::in, rptg_node::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set(rptg_node)::in, set(rptg_node)::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;dead_removal_rule_2(AlphaAtCallSite, Region, !DeadR_q) :-
&lt;br&gt;@@ -386,7 +386,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% rules for eliminating regions from bornR set.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- pred born_removal_rules(pred_proc_id::in, region_set::in, region_set::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, map(rptg_node, rptg_node)::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, rpt_call_alpha_mapping::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;region_set::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;born_removal_rules(Q_Id, LRBefore, _, BornRTable, AlphaAtCallSite, BornR_q) :-
&lt;br&gt;@@ -403,7 +403,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set.fold(born_removal_rule_2(AlphaAtCallSite), Targets,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BornR_q1, BornR_q).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- pred born_removal_rule_1(map(rptg_node, rptg_node)::in, rptg_node::in,
&lt;br&gt;+:- pred born_removal_rule_1(rpt_call_alpha_mapping::in, rptg_node::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set(rptg_node)::in, set(rptg_node)::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;born_removal_rule_1(AlphaAtCallSite, Region, !BornR_q) :-
&lt;br&gt;@@ -414,7 +414,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% alpha(r') = r, alpha(r'') = r, r', r'' in bornR(q) imply remove r',
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% r'' from bornR(q).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred born_removal_rule_2(map(rptg_node, rptg_node)::in, rptg_node::in,
&lt;br&gt;+:- pred born_removal_rule_2(rpt_call_alpha_mapping::in, rptg_node::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set(rptg_node)::in, set(rptg_node)::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;born_removal_rule_2(AlphaAtCallSite, Region, !BornR_q) :-
&lt;br&gt;@@ -425,7 +425,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Find targets of alpha mapping that are mapped to by more than one
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% source.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred targets_with_more_than_one_source(map(rptg_node, rptg_node)::in,
&lt;br&gt;+:- pred targets_with_more_than_one_source(rpt_call_alpha_mapping::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;region_set::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;targets_with_more_than_one_source(AlphaAtCallSite, Targets) :-
&lt;br&gt;Index: rbmm.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.m,v
&lt;br&gt;retrieving revision 1.9
&lt;br&gt;diff -u -r1.9 rbmm.m
&lt;br&gt;--- rbmm.m	23 Apr 2009 10:00:24 -0000	1.9
&lt;br&gt;+++ rbmm.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -16,7 +16,7 @@
&lt;br&gt;&amp;nbsp;:- module transform_hlds.rbmm.
&lt;br&gt;&amp;nbsp;:- interface.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- include_module actual_region_arguments.
&lt;br&gt;+:- include_module add_rbmm_goal_infos.
&lt;br&gt;&amp;nbsp;:- include_module condition_renaming.
&lt;br&gt;&amp;nbsp;:- include_module execution_path.
&lt;br&gt;&amp;nbsp;:- include_module interproc_region_lifetime.
&lt;br&gt;@@ -25,7 +25,7 @@
&lt;br&gt;&amp;nbsp;:- include_module points_to_analysis.
&lt;br&gt;&amp;nbsp;:- include_module points_to_graph.
&lt;br&gt;&amp;nbsp;:- include_module points_to_info.
&lt;br&gt;-:- include_module add_rbmm_goal_infos.
&lt;br&gt;+:- include_module region_arguments.
&lt;br&gt;&amp;nbsp;:- include_module region_instruction.
&lt;br&gt;&amp;nbsp;:- include_module region_liveness_info.
&lt;br&gt;&amp;nbsp;:- include_module region_resurrection_renaming.
&lt;br&gt;@@ -45,7 +45,6 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- implementation.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- import_module transform_hlds.rbmm.actual_region_arguments.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.condition_renaming.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.execution_path.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.interproc_region_lifetime.
&lt;br&gt;@@ -53,6 +52,7 @@
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.live_variable_analysis.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.points_to_analysis.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.add_rbmm_goal_infos.
&lt;br&gt;+:- import_module transform_hlds.rbmm.region_arguments.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_instruction.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_resurrection_renaming.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_transformation.
&lt;br&gt;@@ -84,9 +84,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BecomeLiveTable, BecomeDeadBeforeTable, BecomeDeadAfterTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;record_actual_region_arguments(!.ModuleInfo, RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgumentTable),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;record_region_arguments(!.ModuleInfo, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, FormalRegionArgTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgTable),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% The region analysis treats region variables as if they are
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% imperative-style updatable variables. They may also have scopes
&lt;br&gt;@@ -119,12 +119,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, IteRenamingTable0, IteRenamingTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IteRenamingAnnoTable),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;region_transform(RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgumentTable, ResurRenamingTable, IteRenamingTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable, ResurRenamingAnnoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;region_transform(RptaInfoTable, FormalRegionArgTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgTable, ResurRenamingTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IteRenamingTable, RegionInstructionTable, ResurRenamingAnnoTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IteRenamingAnnoTable, map.init, NameToVarTable, !ModuleInfo),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;collect_rbmm_goal_info(RptaInfoTable, ActualRegionArgumentTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;collect_rbmm_goal_info(RptaInfoTable, ActualRegionArgTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenamingTable, IteRenamingTable, NameToVarTable, !ModuleInfo).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;Index: rbmm.points_to_analysis.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.points_to_analysis.m,v
&lt;br&gt;retrieving revision 1.12
&lt;br&gt;diff -u -r1.12 rbmm.points_to_analysis.m
&lt;br&gt;--- rbmm.points_to_analysis.m	19 Aug 2009 07:44:57 -0000	1.12
&lt;br&gt;+++ rbmm.points_to_analysis.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -772,7 +772,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- pred alpha_mapping_at_call_site(list(prog_var)::in, list(prog_var)::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rpt_graph::in, rpt_graph::in, rpt_graph::out,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map(rptg_node, rptg_node)::in, map(rptg_node, rptg_node)::out) is det.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpt_call_alpha_mapping::in, rpt_call_alpha_mapping::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;alpha_mapping_at_call_site([], [], _, !CallerGraph, !AlphaMap).
&lt;br&gt;&amp;nbsp;alpha_mapping_at_call_site([], [_ | _], _, _, _, _, _) :-
&lt;br&gt;@@ -781,30 +781,33 @@
&lt;br&gt;&amp;nbsp;alpha_mapping_at_call_site([_ | _], [], _, _, _, _, _) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;alpha_mapping_at_call_site: actuals and formals do not match.&amp;quot;).
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Xi's are formal arguments, Yi's are actual arguments at the call site
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;alpha_mapping_at_call_site([Xi | Xs], [Yi | Ys], CalleeGraph,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!CallerGraph, !AlphaMap) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Xi's are formal arguments, Yi's are actual arguments at the call site.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rptg_get_node_by_variable(CalleeGraph, Xi, N_Xi),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rptg_get_node_by_variable(!.CallerGraph, Yi, N_Yi),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;( map.search(!.AlphaMap, N_Xi, N_Y) -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% alpha(N_Xi) = N_Y, alpha(N_Xi) = N_Yi, N_Y != N_Yi.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( N_Y \= N_Yi -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( N_Y = N_Yi -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Apply rule P4.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unify_operator(N_Y, N_Yi, !CallerGraph),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Apply rule P1 after some nodes are unified.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rule_1(N_Y, !CallerGraph)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.set(N_Xi, N_Yi, !AlphaMap),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% N_Yi inherits N_Xi's is_allocated.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsAlloc = rptg_lookup_node_is_allocated(CalleeGraph, N_Xi),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rptg_set_node_is_allocated(N_Yi, IsAlloc, !CallerGraph)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% If N_Xi's is_allocated then N_Yi is also allocated.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Otherwise leave N_Yi alone.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( rptg_is_allocated_node(CalleeGraph, N_Xi) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rptg_set_node_is_allocated(N_Yi, bool.yes, !CallerGraph)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; true
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;alpha_mapping_at_call_site(Xs, Ys, CalleeGraph, !CallerGraph, !AlphaMap).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -930,9 +933,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.set(CalleeM, CallerM, AlphaAtCallSite0, AlphaAtCallSite1),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.set(CallSite, AlphaAtCallSite1, !CallerAlphaMapping),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% CallerM inherits CalleeM's is_allocated.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsAlloc = rptg_lookup_node_is_allocated(CalleeGraph, CalleeM),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rptg_set_node_is_allocated(CallerM, IsAlloc, !CallerGraph)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% If CalleeM's is_allocated then CallerM is also allocated. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Otherwise leave CallerM alone.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( rptg_is_allocated_node(CalleeGraph, CalleeM) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rptg_set_node_is_allocated(CallerM, bool.yes, !CallerGraph)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; true
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;Index: rbmm.points_to_graph.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.points_to_graph.m,v
&lt;br&gt;retrieving revision 1.4
&lt;br&gt;diff -u -r1.4 rbmm.points_to_graph.m
&lt;br&gt;--- rbmm.points_to_graph.m	21 Apr 2009 14:05:55 -0000	1.4
&lt;br&gt;+++ rbmm.points_to_graph.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -179,6 +179,8 @@
&lt;br&gt;&amp;nbsp;:- func rptg_lookup_node_vars(rpt_graph, rptg_node) = set(prog_var).
&lt;br&gt;&amp;nbsp;:- func rptg_lookup_node_is_allocated(rpt_graph, rptg_node) = bool.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+:- pred rptg_is_allocated_node(rpt_graph::in, rptg_node::in) is semidet.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Return the list of edges (edge id's).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- func rptg_lookup_list_outedges(rpt_graph, rptg_node) = list(rptg_edge).
&lt;br&gt;@@ -589,6 +591,10 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NodeContent = rptg_get_node_content(Graph, Node),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IsAllocated = rptg_node_content_get_is_allocated(NodeContent).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+rptg_is_allocated_node(Graph, Region) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;IsAlloc = rptg_lookup_node_is_allocated(Graph, Region),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;IsAlloc = bool.yes.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;rptg_lookup_list_outedges(Graph, Node) = EdgeList :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;OutEdgesOfNode = rptg_lookup_map_outedges(Graph, Node),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map.keys(OutEdgesOfNode, EdgeList).
&lt;br&gt;@@ -987,9 +993,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Processed = [Node | Processed0],
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Take out-edges of the Node and update the remembered list.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%OutEdges = rptg_get_outedges(Graph),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%map.lookup(OutEdges, Node, OutEdgesOfNode),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%map.keys(OutEdgesOfNode, EdgeList),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;EdgeList = rptg_lookup_list_outedges(Graph, Node),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;update_remembered_list(Selector, HLDS, TypeX, Graph, Processed),
&lt;br&gt;Index: rbmm.points_to_info.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.points_to_info.m,v
&lt;br&gt;retrieving revision 1.4
&lt;br&gt;diff -u -r1.4 rbmm.points_to_info.m
&lt;br&gt;--- rbmm.points_to_info.m	21 Apr 2009 14:05:55 -0000	1.4
&lt;br&gt;+++ rbmm.points_to_info.m	28 Nov 2009 01:52:05 -0000
&lt;br&gt;@@ -37,8 +37,6 @@
&lt;br&gt;&amp;nbsp;:- pred rpta_info_table_set_rpta_info(pred_proc_id::in, rpta_info::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rpta_info_table::in, rpta_info_table::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% type rpta_info and operations
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- type rpta_info
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;---&amp;gt; rpta_info(rpt_graph, rpt_alpha_mapping).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -52,7 +50,16 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- type rpt_alpha_mapping == map(program_point, map(rptg_node, rptg_node)).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% This type represents the alpha mapping of all call sites in a procedure.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% For documentation of alpha mappings, see Chapter 4 in Quan's thesis;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% basically, they map the nodes in the region points-to graph of the callee
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% to the corresponding nodes in the caller.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;%
&lt;br&gt;+:- type rpt_alpha_mapping == map(program_point, rpt_call_alpha_mapping).
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% This type represents the alpha mapping at one call site.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;%
&lt;br&gt;+:- type rpt_call_alpha_mapping == map(rptg_node, rptg_node).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;@@ -77,15 +84,13 @@
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;rpta_info_table_init = map.init.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;rpta_info_table_search_rpta_info(PredProcId, Table) = RptaInfo :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Table ^ elem(PredProcId) = RptaInfo.
&lt;br&gt;-rpta_info_table_set_rpta_info(PredProcId, RptaInfo, Table0, Table) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Table = Table0 ^ elem(PredProcId) := RptaInfo.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% The rpta_info will be for a specific procedure, so at the beginning
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% the alpha mapping is empty and the rpt graph contains all the nodes
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% corresponding to all the variables appear in the procedure.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;+rpta_info_table_set_rpta_info(PredProcId, RptaInfo, !Table) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;!Table ^ elem(PredProcId) := RptaInfo.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;rpta_info_init(ProcInfo) = RptaInfo :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info_get_vartypes(ProcInfo, VarTypes),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map.keys(VarTypes, Vars),
&lt;br&gt;@@ -139,8 +144,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AlphaMappingAtCallSiteA,AlphaMappingAtCallSiteB),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rpt_alpha_mapping_equal_2(CallSiteAs, AlphaMappingA, AlphaMappingB).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- pred rpt_alpha_mapping_at_call_site_equal(map(rptg_node, rptg_node)::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map(rptg_node, rptg_node)::in) is semidet.
&lt;br&gt;+:- pred rpt_alpha_mapping_at_call_site_equal(rpt_call_alpha_mapping::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpt_call_alpha_mapping::in) is semidet.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;rpt_alpha_mapping_at_call_site_equal(AMAtCallSiteA, AMAtCallSiteB) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map.count(AMAtCallSiteA, CA),
&lt;br&gt;@@ -151,7 +156,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AMAtCallSiteB).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- pred rpt_alpha_mapping_at_call_site_equal_2(list(rptg_node)::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map(rptg_node, rptg_node)::in, map(rptg_node, rptg_node)::in) is semidet.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpt_call_alpha_mapping::in, rpt_call_alpha_mapping::in) is semidet.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;rpt_alpha_mapping_at_call_site_equal_2([], _, _).
&lt;br&gt;&amp;nbsp;rpt_alpha_mapping_at_call_site_equal_2([N | Ns], AMAtCallSiteA,
&lt;br&gt;Index: rbmm.region_arguments.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: rbmm.region_arguments.m
&lt;br&gt;diff -N rbmm.region_arguments.m
&lt;br&gt;--- /dev/null	1 Jan 1970 00:00:00 -0000
&lt;br&gt;+++ rbmm.region_arguments.m	28 Nov 2009 01:52:06 -0000
&lt;br&gt;@@ -0,0 +1,334 @@
&lt;br&gt;+% -----------------------------------------------------------------------------%
&lt;br&gt;+% vim: ft=mercury ts=4 sw=4 et
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+% Copyright (C) 2009 The University of Melbourne.
&lt;br&gt;+% This file may only be copied under the terms of the GNU General
&lt;br&gt;+% Public License - see the file COPYING in the Mercury distribution.
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+%
&lt;br&gt;+% File: rbmm.region_arguments.m.
&lt;br&gt;+% Main author: qph.
&lt;br&gt;+%
&lt;br&gt;+% We will pass regions as extra arguments in procedure calls.
&lt;br&gt;+% After the region liveness analysis we can decide on what region variables
&lt;br&gt;+% need to be region arguments (for procedures and calls).
&lt;br&gt;+% This module derives the formal region arguments for procedures and
&lt;br&gt;+% the actual region arguments at call sites in each procedure.
&lt;br&gt;+% This information will be used to extend the argument lists of procedures
&lt;br&gt;+% and calls in the HLDS.
&lt;br&gt;+
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+
&lt;br&gt;+:- module transform_hlds.rbmm.region_arguments.
&lt;br&gt;+:- interface.
&lt;br&gt;+
&lt;br&gt;+:- import_module hlds.
&lt;br&gt;+:- import_module hlds.hlds_module.
&lt;br&gt;+:- import_module hlds.hlds_pred.
&lt;br&gt;+:- import_module transform_hlds.rbmm.points_to_graph.
&lt;br&gt;+:- import_module transform_hlds.rbmm.points_to_info.
&lt;br&gt;+:- import_module transform_hlds.rbmm.region_liveness_info.
&lt;br&gt;+:- import_module transform_hlds.smm_common.
&lt;br&gt;+
&lt;br&gt;+:- import_module list.
&lt;br&gt;+:- import_module map.
&lt;br&gt;+
&lt;br&gt;+:- type proc_formal_region_args_table
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;== &amp;nbsp;map(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pred_proc_id,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;region_args
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- type proc_pp_actual_region_args_table
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;== &amp;nbsp;map(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pred_proc_id,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pp_actual_region_args_table
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- type pp_actual_region_args_table
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;== &amp;nbsp;map(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;program_point,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;region_args
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- type region_args
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;region_args(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list(rptg_node), &amp;nbsp; &amp;nbsp;% constant (carried) region arguments.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list(rptg_node), &amp;nbsp; &amp;nbsp;% inputs (removed).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list(rptg_node) &amp;nbsp; &amp;nbsp; % outputs (created).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred record_region_arguments(module_info::in, rpta_info_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+
&lt;br&gt;+:- implementation.
&lt;br&gt;+
&lt;br&gt;+:- import_module check_hlds.
&lt;br&gt;+:- import_module check_hlds.goal_path.
&lt;br&gt;+:- import_module hlds.hlds_goal.
&lt;br&gt;+:- import_module libs.
&lt;br&gt;+:- import_module libs.compiler_util.
&lt;br&gt;+
&lt;br&gt;+:- import_module set.
&lt;br&gt;+:- import_module string.
&lt;br&gt;+:- import_module svmap.
&lt;br&gt;+
&lt;br&gt;+record_region_arguments(ModuleInfo, RptaInfoTable, ConstantRTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DeadRTable, BornRTable, FormalRegionArgTable, ActualRegionArgTable) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;module_info_predids(PredIds, ModuleInfo, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.foldl2(record_actual_region_arguments_pred(ModuleInfo,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredIds, map.init, FormalRegionArgTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.init, ActualRegionArgTable).
&lt;br&gt;+
&lt;br&gt;+:- pred record_actual_region_arguments_pred(module_info::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, pred_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+record_actual_region_arguments_pred(ModuleInfo, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, PredId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgTable) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;module_info_pred_info(ModuleInfo, PredId, PredInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ProcIds = pred_info_non_imported_procids(PredInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.foldl2(record_region_arguments_proc(ModuleInfo, PredId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable), ProcIds,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgTable).
&lt;br&gt;+
&lt;br&gt;+:- pred record_region_arguments_proc(module_info::in, pred_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, proc_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+record_region_arguments_proc(ModuleInfo, PredId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, ProcId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgTable) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;PPId = proc(PredId, ProcId),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( if &amp;nbsp; &amp;nbsp;some_are_special_preds([PPId], ModuleInfo)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;then &amp;nbsp;true
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_formal_region_arguments_proc(PPId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, !FormalRegionArgTable),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;module_info_proc_info(ModuleInfo, PPId, ProcInfo0),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fill_goal_path_slots(ModuleInfo, ProcInfo0, ProcInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info_get_goal(ProcInfo, Body),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, PPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Body,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, map.init, ActualRegionArgProc),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.set(PPId, ActualRegionArgProc, !ActualRegionArgTable)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred record_formal_region_arguments_proc(pred_proc_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_formal_region_args_table::out)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;is det.
&lt;br&gt;+
&lt;br&gt;+record_formal_region_arguments_proc(PPId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, !FormalRegionArgTable) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( map.search(!.FormalRegionArgTable, PPId, _) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(ConstantRTable, PPId, ConstantR),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(DeadRTable, PPId, DeadR),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(BornRTable, PPId, BornR),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(RptaInfoTable, PPId, RptaInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfo = rpta_info(Graph, _),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Formal constant, allocated-into region arguments.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.to_sorted_list(ConstantR, LConstantR),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.filter(rptg_is_allocated_node(Graph),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LConstantR, LFormalConstantAllocR),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Formal dead region arguments.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.to_sorted_list(DeadR, FormalDeadR),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Formal born region arguments.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.to_sorted_list(BornR, FormalBornR),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.det_insert(PPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;region_args(LFormalConstantAllocR, FormalDeadR, FormalBornR),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred record_actual_region_arguments_goal(module_info::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pred_proc_id::in, rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, hlds_goal::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+record_actual_region_arguments_goal(ModuleInfo, PPId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, Goal,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Goal = hlds_goal(Expr, Info),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;record_actual_region_arguments_expr(Expr, Info, ModuleInfo, PPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc).
&lt;br&gt;+
&lt;br&gt;+:- pred record_actual_region_arguments_expr(hlds_goal_expr::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;hlds_goal_info::in, module_info::in, pred_proc_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+record_actual_region_arguments_expr(GoalExpr, GoalInfo, ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = plain_call(PredId, ProcId, _, _, _, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId = proc(PredId, ProcId),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( some_are_special_preds([CalleePPId], ModuleInfo) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CallSite = program_point_init(GoalInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_call_site(CallerPPId, CallSite,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId, RptaInfoTable, ConstantRTable, DeadRTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BornRTable, !FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = conj(_, Conjuncts),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl2(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Conjuncts, !FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = disj(Disjuncts),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl2(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Disjuncts, !FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = if_then_else(_, Cond, Then, Else),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Cond,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Then,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, Else,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = switch(_, _, Cases),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl2(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_case(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Cases, !FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = generic_call(_, _, _, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sorry(this_file,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;record_actual_region_arguments_expr: generic_call NYI&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = call_foreign_proc(_, _, _, _, _, _, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sorry(this_file,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;record_actual_region_arguments_expr: call_foreign_proc NYI&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = negation(SubGoal),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, SubGoal,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = unify(_, _, _, _, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = scope(_, SubGoal),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX We should special-case the handling of from_ground_term_construct
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% scopes.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, CallerPPId,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RptaInfoTable, ConstantRTable, DeadRTable, BornRTable, SubGoal,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GoalExpr = shorthand(_),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;record_actual_region_arguments_expr: shorthand&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred record_actual_region_arguments_case(module_info::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pred_proc_id::in, rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in, case::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+record_actual_region_arguments_case(ModuleInfo, PPId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, Case,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Case = case(_, _, Goal),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;record_actual_region_arguments_goal(ModuleInfo, PPId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, Goal, 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!FormalRegionArgTable, !ActualRegionArgProc).
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Region variables in deadR and in bornR are passed as arguments.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Out of the region variables in constantR (constant in the sense that
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% their bindings will not change during the call) we only pass ones that
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% may be allocated into as arguments. The actual region arguments are
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% computed according to these lines.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;%
&lt;br&gt;+:- pred record_actual_region_arguments_call_site(pred_proc_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;program_point::in, pred_proc_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_formal_region_args_table::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, pp_actual_region_args_table::out) is det.
&lt;br&gt;+
&lt;br&gt;+record_actual_region_arguments_call_site(CallerPPId, CallSite,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId, RptaInfoTable, ConstantRTable, DeadRTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BornRTable, !FormalRegionArgTable, !ActualRegionArgProc) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( map.search(!.FormalRegionArgTable, CalleePPId, FormalRegionArgCallee) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% If the formal region arguments of the called procedure have been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% computed, the corresponding actual ones can be straightforwardly
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% derived using the call site's alpha mapping.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FormalRegionArgCallee =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;region_args(FormalConstants, FormalDeads, FormalBorns),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(RptaInfoTable, CallerPPId, CallerRptaInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CallerRptaInfo = rpta_info(_CallerGraph, CallerAlpha),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(CallerAlpha, CallSite, AlphaAtCallSite),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldr(find_actual_param(AlphaAtCallSite), FormalConstants,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[], ActualConstants),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldr(find_actual_param(AlphaAtCallSite), FormalDeads,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[], ActualDeads),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldr(find_actual_param(AlphaAtCallSite), FormalBorns,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[], ActualBorns),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;svmap.det_insert(CallSite,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;region_args(ActualConstants, ActualDeads, ActualBorns),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The formal region arguments of the called procedure haven't been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% recorded, so do it now.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_formal_region_arguments_proc(CalleePPId, RptaInfoTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, !FormalRegionArgTable),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% We try again at this call site after the formal region arguments
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% are recorded.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record_actual_region_arguments_call_site(CallerPPId, CallSite,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CalleePPId, RptaInfoTable, ConstantRTable, DeadRTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BornRTable, !FormalRegionArgTable, !ActualRegionArgProc)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred find_actual_param(rpt_call_alpha_mapping::in, rptg_node::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list(rptg_node)::in, list(rptg_node)::out) is det.
&lt;br&gt;+
&lt;br&gt;+find_actual_param(Alpha_PP, Formal, Actuals0, Actuals) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map.lookup(Alpha_PP, Formal, Actual),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Actuals = [Actual | Actuals0].
&lt;br&gt;+
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;+
&lt;br&gt;+:- func this_file = string.
&lt;br&gt;+
&lt;br&gt;+this_file = &amp;quot;rbmm.region_arguments.m&amp;quot;.
&lt;br&gt;+
&lt;br&gt;+%-----------------------------------------------------------------------------%
&lt;br&gt;Index: rbmm.region_transformation.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/rbmm.region_transformation.m,v
&lt;br&gt;retrieving revision 1.12
&lt;br&gt;diff -u -r1.12 rbmm.region_transformation.m
&lt;br&gt;--- rbmm.region_transformation.m	8 Sep 2009 02:43:38 -0000	1.12
&lt;br&gt;+++ rbmm.region_transformation.m	28 Nov 2009 01:52:06 -0000
&lt;br&gt;@@ -27,10 +27,9 @@
&lt;br&gt;&amp;nbsp;:- import_module hlds.hlds_pred.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_data.
&lt;br&gt;-:- import_module transform_hlds.rbmm.actual_region_arguments.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.points_to_info.
&lt;br&gt;+:- import_module transform_hlds.rbmm.region_arguments.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_instruction.
&lt;br&gt;-:- import_module transform_hlds.rbmm.region_liveness_info.
&lt;br&gt;&amp;nbsp;:- import_module transform_hlds.rbmm.region_resurrection_renaming.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- import_module map.
&lt;br&gt;@@ -45,21 +44,24 @@
&lt;br&gt;&amp;nbsp;:- type name_to_prog_var == map(string, prog_var).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% The names of the predicates for creating and removing regions.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% The predicates are in mercury_region_builtin_module.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% The predicates are in region_builtin library module.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- func create_region_pred_name = string.
&lt;br&gt;&amp;nbsp;:- func remove_region_pred_name = string.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% XXX Besides changing the HLDS, this predicate also returns a mapping
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% from a region name to a program variable which represents the
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% region. We will only create a new program variable for a region
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% name which is not yet in the map. Currently this map is only used
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% in this transformation. If we do not need the map later on we should
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% not return it.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Besides changing the HLDS with region information, this predicate also
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% returns a mapping from a region name to a program variable which
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% represents the region. We will only create a new program variable for a
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% region name which is not yet in the map. This information is needed when
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% computing rbmm_goal_info. Note that because we only pass as argument to
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% a procedure a region that will be allocated into, be removed, or be
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% created in the procedure, some regions in the rpt graph of the procedure
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% may not need to be presented by program variables. They are the regions
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% that only be read from in the procedure. Therefore there are NO entries
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% for them in the region_name-to-prog_var map.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred region_transform(rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;+:- pred region_transform(rpta_info_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_pp_actual_region_args_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_table::in, renaming_table::in, region_instr_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_annotation_table::in, renaming_annotation_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;name_to_prog_var_table::in, name_to_prog_var_table::out,
&lt;br&gt;@@ -105,15 +107,13 @@
&lt;br&gt;&amp;nbsp;create_region_pred_name = &amp;quot;create_region&amp;quot;.
&lt;br&gt;&amp;nbsp;remove_region_pred_name = &amp;quot;remove_region&amp;quot;.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-region_transform(RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;+region_transform(RptaInfoTable, FormalRegionArgTable, ActualRegionArgTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenamingTable, IteRenamingTable, RegionInstructionTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenamingAnnoTable, IteRenamingAnnoTable, !NameToVarTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ModuleInfo) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map.foldl2(annotate_pred, FormalRegionArgTable, [], PredIds, !ModuleInfo),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.foldl2(region_transform_pred(RptaInfoTable, FormalRegionArgTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgTable, ResurRenamingTable, IteRenamingTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable, ResurRenamingAnnoTable, IteRenamingAnnoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!NameToVarTable, !ModuleInfo) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.foldl2(annotate_pred(DeadRTable, BornRTable), ConstantRTable, [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredIds, !ModuleInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.foldl2(region_transform_pred(RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, ActualRegionArgTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenamingTable, IteRenamingTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable, ResurRenamingAnnoTable, IteRenamingAnnoTable),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredIds, !NameToVarTable, !ModuleInfo),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -121,7 +121,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% annotated with region information and recorded. This is necessary
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% because recompute_instmap_delta_proc and repuritycheck_proc need to
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% look up information about the (annotated) called procedures.
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl(update_instmap_delta_pred, PredIds, !ModuleInfo),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl(recheck_purity_pred, PredIds, !ModuleInfo).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -133,22 +132,20 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% 2. Argument types: arg_types, updated with region type for region
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% &amp;nbsp; &amp;nbsp;arguments.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred annotate_pred(proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pred_proc_id::in, region_set::in, list(pred_id)::in, list(pred_id)::out,
&lt;br&gt;+:- pred annotate_pred(pred_proc_id::in, region_args::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list(pred_id)::in, list(pred_id)::out,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;module_info::in, module_info::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-annotate_pred(DeadRTable, BornRTable, PPId, ConstantR, !Processed,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!ModuleInfo) :-
&lt;br&gt;+annotate_pred(PPId, FormalRegionArgs, !Processed, !ModuleInfo) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PPId = proc(PredId, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;( list.member(PredId, !.Processed) -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;some [!PredInfo] (
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;module_info_pred_info(!.ModuleInfo, PredId, !:PredInfo),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(DeadRTable, PPId, DeadR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(BornRTable, PPId, BornR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NumberOfRegArgs = set.count(DeadR) + set.count(BornR) +
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.count(ConstantR),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FormalRegionArgs = region_args(Constants, Deads, Borns),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NumberOfRegArgs = list.length(Constants) + list.length(Deads) +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.length(Borns),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Arity = pred_info_orig_arity(!.PredInfo),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pred_info_set_orig_arity(Arity + NumberOfRegArgs, !PredInfo),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -174,22 +171,22 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% This predicate transforms the procedures of a predicate.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred region_transform_pred(rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;+:- pred region_transform_pred(rpta_info_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_table::in, renaming_table::in, region_instr_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_annotation_table::in, renaming_annotation_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pred_id::in, name_to_prog_var_table::in, name_to_prog_var_table::out,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;module_info::in, module_info::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-region_transform_pred(RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;+region_transform_pred(RptaInfoTable, FormalRegionArgTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgTable, ResurRenamingTable, IteRenamingTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable, ResurRenamingAnnoTable, IteRenamingAnnoTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredId, !NameToVarTable, !ModuleInfo) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;module_info_pred_info(!.ModuleInfo, PredId, PredInfo),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ProcIds = pred_info_non_imported_procids(PredInfo),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.foldl2(region_transform_proc(RptaInfoTable,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstantRTable, DeadRTable, BornRTable, ActualRegionArgTable,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FormalRegionArgTable, ActualRegionArgTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenamingTable, IteRenamingTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable, ResurRenamingAnnoTable, IteRenamingAnnoTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredId), ProcIds, !NameToVarTable, !ModuleInfo).
&lt;br&gt;@@ -208,15 +205,14 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% As said above, we will recompute instmap delta, recheck purity for
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% this annotated procedure after all the procedures have been transformed.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred region_transform_proc(rpta_info_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_region_set_table::in, proc_region_set_table::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;proc_pp_actual_region_args_table::in,
&lt;br&gt;+:- pred region_transform_proc(rpta_info_table::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;proc_formal_region_args_table::in, proc_pp_actual_region_args_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_table::in, renaming_table::in, region_instr_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_annotation_table::in, renaming_annotation_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pred_id::in, proc_id::in, name_to_prog_var_table::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;name_to_prog_var_table::out, module_info::in, module_info::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-region_transform_proc(RptaInfoTable, ConstantRTable, DeadRTable, BornRTable,
&lt;br&gt;+region_transform_proc(RptaInfoTable, FormalRegionArgTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgTable, ResurRenamingTable, IteRenamingTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionTable, ResurRenamingAnnoTable, IteRenamingAnnoTable,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PredId, ProcId, !NameToVarTable, !ModuleInfo) :-
&lt;br&gt;@@ -229,9 +225,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info_get_argmodes(ProcInfo1, ActualArgModes0),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info_get_goal(ProcInfo1, Goal0),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(RptaInfoTable, PPId, rpta_info(Graph, _)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(ConstantRTable, PPId, ConstantR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(DeadRTable, PPId, DeadR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map.lookup(BornRTable, PPId, BornR),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map.lookup(FormalRegionArgTable, PPId, FormalRegionArgProc),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(ActualRegionArgTable, PPId, ActualRegionArgProc),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;( map.search(ResurRenamingTable, PPId, ResurRenamingProc0) -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResurRenamingProc = ResurRenamingProc0,
&lt;br&gt;@@ -249,7 +243,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map.lookup(RegionInstructionTable, PPId, RegionInstructionProc),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NameToVar0 = map.init,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;annotate_proc(!.ModuleInfo, PredInfo0, Graph, ConstantR, DeadR, BornR,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;annotate_proc(!.ModuleInfo, PredInfo0, Graph, FormalRegionArgProc,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgProc, ResurRenamingProc, IteRenamingProc,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionProc, ResurRenamingAnnoProc, IteRenamingAnnoProc,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet0, _, VarTypes0, _, HeadVars0, _, ActualArgModes0, _,
&lt;br&gt;@@ -269,16 +263,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% &amp;nbsp; &amp;nbsp;+ new calls to region instructions
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp;:- pred annotate_proc(module_info::in, pred_info::in, rpt_graph::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;region_set::in, region_set::in, region_set::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;pp_actual_region_args_table::in, renaming_proc::in, renaming_proc::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;region_instr_proc::in, renaming_annotation_proc::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;region_args::in, pp_actual_region_args_table::in, renaming_proc::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;renaming_proc::in, region_instr_proc::in, renaming_annotation_proc::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;renaming_annotation_proc::in, prog_varset::in, prog_varset::out,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;vartypes::in, vartypes::out, list(prog_var)::in, list(prog_var)::out,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list(mer_mode)::in, list(mer_mode)::out, hlds_goal::in, hlds_goal::out,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;name_to_prog_var::in, name_to_prog_var::out, proc_info::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;proc_info::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-annotate_proc(ModuleInfo, PredInfo, Graph, ConstantR, DeadR, BornR,
&lt;br&gt;+annotate_proc(ModuleInfo, PredInfo, Graph, FormalRegionArgProc,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualRegionArgProc, ResurRenamingProc, IteRenamingProc,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegionInstructionProc, ResurRenamingAnnoProc, IteRenamingAnnoProc,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!VarSet, !VarTypes, !HeadVars, !ActualArgModes, !Goal,
&lt;br&gt;@@ -302,18 +295,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Note that formal region arguments are not subjected to renaming.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;%
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Along with the extra arguments we also add extra modes for them.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;set.to_sorted_list(ConstantR, LConstantR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;set.to_sorted_list(DeadR, LDeadR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;set.to_sorted_list(BornR, LBornR),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;FormalInputNodes = LConstantR ++ LDeadR,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;FormalNodes = FormalInputNodes ++ LBornR,
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;FormalRegionArgProc = region_args(Constants, Deads, Borns),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;FormalInputNodes = Constants ++ Deads,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;FormalNodes = FormalInputNodes ++ Borns,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.map_foldl3(node_to_var(Graph), FormalNodes, FormalRegionArgs,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!NameToVar, !VarSet, !VarTypes),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;InMode = in_mode,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;OutMode = out_mode,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.duplicate(list.length(FormalInputNodes), InMode, InModes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list.duplicate(list.length(LBornR), OutMode, OutModes),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.duplicate(list.length(Borns), OutMode, OutModes),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Notice that the output of a function needs to be the last argument.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PredOrFunc = pred_info_is_pred_or_func(PredInfo),
&lt;br&gt;@@ -438,9 +430,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;( map.search(ActualRegionArgProc, ProgPoint, ActualNodes0) -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualNodes = ActualNodes0
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualNodes = actual_region_args([], [], [])
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActualNodes = region_args([], [], [])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;ActualNodes = actual_region_args(Constants, Ins, Outs),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ActualNodes = region_args(Constants, Ins, Outs),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;AllNodes = Constants ++ Ins ++ Outs,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list.map_foldl3(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node_to_var_with_both_renamings(Graph, ResurRenaming, IteRenaming),
&lt;br&gt;cvs diff: Diffing notes
&lt;br&gt;&lt;br&gt;Disclaimer: &lt;a href=&quot;http://www.kuleuven.be/cwis/email_disclaimer.htm&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kuleuven.be/cwis/email_disclaimer.htm&lt;/a&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26544205&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26544205&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26544205&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-diff-of-adding-a-new-option-for-RBMM-tp26544205p26544205.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26539836</id>
	<title>Re: for review: new calling convention for exported procedures to java</title>
	<published>2009-11-27T01:28:14Z</published>
	<updated>2009-11-27T01:28:14Z</updated>
	<author>
		<name>Julien Fischer-2</name>
	</author>
	<content type="html">&lt;br&gt;Hi,
&lt;br&gt;&lt;br&gt;On Thu, 26 Nov 2009, Peter Wang wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Add a new calling convention for Mercury procedures exported to Java with
&lt;br&gt;&amp;gt; `:- pragma foreign_export'. &amp;nbsp;When the procedure has multiple output arguments,
&lt;br&gt;&amp;gt; require the caller to pass instances of a `Ref&amp;lt;T&amp;gt;' class which contain a field
&lt;br&gt;&amp;gt; to hold the output value. &amp;nbsp;This is more verbose than return an `Object[]'
&lt;br&gt;&amp;gt; array, and requires extra memory allocations, but is more type-safe. &amp;nbsp;Another
&lt;br&gt;&amp;gt; advantage is that the Ref arguments will appear at the same positions as the
&lt;br&gt;&amp;gt; output arguments in the Mercury procedure.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The new convention must be enabled with `--java-export-ref-out'. &amp;nbsp;The plan is
&lt;br&gt;&amp;gt; to enable it by default in the future.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; compiler/options.m:
&lt;br&gt;&amp;gt; doc/reference_manual.texi:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Add the option.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; compiler/ml_proc_gen.m:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;When the option is set, disable `--det-copy-out' and generate the
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;function parameters assuming pass-by-reference for outputs.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Only use the new convention when necessary.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; compiler/mlds_to_java.m:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Make the code to generate the exported forwarding methods account for
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;`mlds_ptr_type' parameters. &amp;nbsp;These are converted to `Ref&amp;lt;T&amp;gt;' arguments.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; java/runtime/Ref.java:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Add the reference class.
&lt;/div&gt;&lt;br&gt;I've had a quick look over this. &amp;nbsp;The new scheme is a definite
&lt;br&gt;improvment over the old way of doing things so I would be quite happy
&lt;br&gt;for it to become the default now. &amp;nbsp;I've had a quick glance over the code
&lt;br&gt;and it seem okay; I'll take a closer look next week - feel free to
&lt;br&gt;commit it in the meantime
&lt;br&gt;&lt;br&gt;Julien.
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26539836&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26539836&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26539836&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-new-calling-convention-for-exported-procedures-to-java-tp26523676p26539836.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26537671</id>
	<title>Re: for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-26T19:50:50Z</published>
	<updated>2009-11-26T19:50:50Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Mon, Nov 23, 2009 at 02:09:01PM +1100, Paul Bone wrote:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; For review by someone familiar with the low-level C backend, probably Zoltan.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;nbsp;- Thanks, Paul.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Re-factor the MR_join_and_continue macro.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;This alternative change is much simplier in that it doesn't require
&lt;br&gt;modifications to the compiler.
&lt;br&gt;&lt;br&gt;For post commit review.
&lt;br&gt;&lt;br&gt;Re-factor the MR_join_and_continue macro.
&lt;br&gt;&lt;br&gt;This change replaces the MR_join_and_continue macro with a C procedure. &amp;nbsp;A
&lt;br&gt;smaller macro named MR_join_and_continue wraps the new C procedure and provides
&lt;br&gt;a trampoline to prevent C stack leaks. &amp;nbsp;MR_join_and_continue will now have the
&lt;br&gt;additional cost of a C procedure call rather than always being inlined. &amp;nbsp;This
&lt;br&gt;code is only used in the implementation of parallel conjunctions in the low
&lt;br&gt;level C grades, it does not affect other grades.
&lt;br&gt;&lt;br&gt;An earlier revision of this code was causing deadlocks, to debug them support
&lt;br&gt;was added to the MR_SIGNAL MR_BROADCAST and MR_WAIT macros to enable better
&lt;br&gt;logging of the use of condition variables when MR_DEBUG_THREADS is defined at
&lt;br&gt;compile time.
&lt;br&gt;&lt;br&gt;This change passes bootcheck and the test suite in the asm_fast.gc.par grade.
&lt;br&gt;&lt;br&gt;runtime/mercury_context.h:
&lt;br&gt;runtime/mercury_context.c:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Created MR_do_join_and_continue procedure from old MR_join_and_continue
&lt;br&gt;&amp;nbsp; &amp;nbsp; macro.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Added additional comments to this procedure, describing how it works.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Created a new macro MR_join_and_continue that wraps the new procedure.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Conform to changes in the MR_WAIT, MR_SIGNAL and MR_BROADCAST macros. 
&lt;br&gt;&lt;br&gt;runtime/mercury_thread.h:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Added a from parameter to the MR_WAIT, MR_SIGNAL and MR_BROADCAST macros.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Added a from parameter to the C procedures' declarations that implement the
&lt;br&gt;&amp;nbsp; &amp;nbsp; debugging versions of the condition operations above.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Adjusted the formatting of these declarations to match the C style used in
&lt;br&gt;&amp;nbsp; &amp;nbsp; the project.
&lt;br&gt;&lt;br&gt;runtime/mercury_thread.c:
&lt;br&gt;&amp;nbsp; &amp;nbsp; The C procedures implementing the debugging versions of the condition
&lt;br&gt;&amp;nbsp; &amp;nbsp; operations now print out their from parameter.
&lt;br&gt;&amp;nbsp; &amp;nbsp; MR_cond_broadcast now uses &amp;quot;broadcast&amp;quot; in it's log message rather than
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;quot;signal&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; MR_cond_wait's log message now more clearly specifies which argument is the
&lt;br&gt;&amp;nbsp; &amp;nbsp; lock and which is the condition variable.
&lt;br&gt;&lt;br&gt;Index: runtime/mercury_context.c
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/runtime/mercury_context.c,v
&lt;br&gt;retrieving revision 1.70
&lt;br&gt;diff -u -p -b -r1.70 mercury_context.c
&lt;br&gt;--- runtime/mercury_context.c	6 Nov 2009 05:40:24 -0000	1.70
&lt;br&gt;+++ runtime/mercury_context.c	27 Nov 2009 00:36:45 -0000
&lt;br&gt;@@ -787,9 +787,9 @@ MR_schedule_context(MR_Context *ctxt)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;** we wake up all the waiting threads.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (ctxt-&amp;gt;MR_ctxt_resume_owner_thread == (MercuryThread) NULL) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;MR_runqueue_cond);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;MR_runqueue_cond, &amp;quot;schedule_context&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_BROADCAST(&amp;MR_runqueue_cond);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_BROADCAST(&amp;MR_runqueue_cond, &amp;quot;schedule_context&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_runqueue_lock, &amp;quot;schedule_context&amp;quot;);
&lt;br&gt;@@ -803,7 +803,7 @@ MR_schedule_spark_globally(const MR_Spar
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_wsdeque_push_bottom(&amp;MR_spark_queue, proto_spark);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_num_outstanding_contexts_and_global_sparks++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_inc_int(&amp;MR_num_outstanding_contexts_and_all_sparks);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;MR_runqueue_cond);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MR_SIGNAL(&amp;MR_runqueue_cond, &amp;quot;schedule_spark_globally&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_runqueue_lock, &amp;quot;schedule_spark_globally&amp;quot;);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;#endif /* !MR_LL_PARALLEL_CONJ */
&lt;br&gt;@@ -825,6 +825,7 @@ MR_define_entry(MR_do_runnext);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spark;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;unsigned &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;depth;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MercuryThread &amp;nbsp; thd;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wait_result;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifdef MR_PROFILE_PARALLEL_EXECUTION_SUPPORT
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Timer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;runnext_timer;
&lt;br&gt;@@ -903,8 +904,10 @@ MR_define_entry(MR_do_runnext);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;MR_profile_parallel_executed_nothing);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (MR_WAIT(&amp;MR_runqueue_cond, &amp;MR_runqueue_lock) != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wait_result = 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_WAIT(&amp;MR_runqueue_cond, &amp;MR_runqueue_lock, &amp;quot;do_runnext&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (wait_result != 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;ReadyContext:
&lt;br&gt;@@ -986,6 +989,126 @@ MR_END_MODULE
&lt;br&gt;&amp;nbsp;#endif /* !MR_HIGHLEVEL_CODE */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifdef MR_LL_PARALLEL_CONJ
&lt;br&gt;+MR_Code*
&lt;br&gt;+MR_do_join_and_continue(MR_SyncTerm *jnc_st, MR_Code *join_label) 
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if (!jnc_st-&amp;gt;MR_st_is_shared) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction has only executed sequentially. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** It has finished executing, continue execution from the join
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** label.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return join_label;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** It has not finished executing. &amp;nbsp;Try to finish it by executing
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** our sparks.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This code was formerly MR_join_and_continue_1() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return jnc_spark.MR_spark_resume;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** Someone's stolen our sparks, we should try to execute
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** something that's been scheduled globally. &amp;nbsp;XXX: We don't yet
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** have work stealing so how can this happen!?
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;My sparks have been stolen!! %lp&amp;quot;, pthread_self());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return MR_ENTRY(MR_do_runnext);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction may be executing in parallel. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_LOCK(&amp;MR_sync_term_lock, &amp;quot;continue&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction has finished. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (MR_ENGINE(MR_eng_this_context) == jnc_st-&amp;gt;MR_st_orig_context) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context originated this parallel conjunction and all
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** the branches have finished so jump to the join label.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue i&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return join_label;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context didn't originate this parallel conjunction and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** we're the last branch to finish. &amp;nbsp;The originating context
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** should be suspended waiting for us to finish, so wake it up.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_st-&amp;gt;MR_st_orig_context-&amp;gt;MR_ctxt_resume = join_label;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_schedule_context(jnc_st-&amp;gt;MR_st_orig_context);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue ii&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return MR_ENTRY(MR_do_runnext);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The parallel conjunction is being executed in parallel but it is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** not yet finished. &amp;nbsp;This code was Formerly
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** MR_join_and_continue_2() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped &amp;&amp; (jnc_spark.MR_spark_parent_sp == MR_parent_sp)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark at the top of the stack is from to the same parallel
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** conjunction that we've just been executing. We can immediately
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** execute the next branch of the same parallel conjunction in
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** the current context.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 i&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return jnc_spark.MR_spark_resume;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark stack is empty or the next spark is from a different
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction to the one we've been executing. &amp;nbsp;Either
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** way, there's nothing more we can do with this context right
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** now. &amp;nbsp;Put back the spark we won't be using.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_wsdeque_putback_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** If this context originated the parallel conjunction we've been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** executing, the rest of the parallel conjunction must have been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** put on the global spark queue to be executed in other
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** contexts. &amp;nbsp;This context will need to be resumed once the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction is completed, so suspend the context.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** What if the other conjuncts where put on the global queue
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** but haven't yet been taken by other threads? &amp;nbsp;Then this step
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** is redundant. &amp;nbsp;It's not worth fixing, this problem will go
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** away once we enable work-stealing. - pbone. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_ctxt == jnc_st-&amp;gt;MR_st_orig_context) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_save_context(jnc_ctxt);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_ENGINE(MR_eng_this_context) = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Finally look for other work. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 ii&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return MR_ENTRY(MR_do_runnext);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+#ifdef MR_LL_PARALLEL_CONJ
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * Debugging functions for runtime granularity control.
&lt;br&gt;Index: runtime/mercury_context.h
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/runtime/mercury_context.h,v
&lt;br&gt;retrieving revision 1.55
&lt;br&gt;diff -u -p -b -r1.55 mercury_context.h
&lt;br&gt;--- runtime/mercury_context.h	17 Nov 2009 06:30:26 -0000	1.55
&lt;br&gt;+++ runtime/mercury_context.h	27 Nov 2009 00:49:46 -0000
&lt;br&gt;@@ -811,111 +811,15 @@ extern &amp;nbsp;void &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_schedule_context(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_inc_int(&amp;MR_num_outstanding_contexts_and_all_sparks); &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;#define MR_join_and_continue(sync_term, join_label) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp;do { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_SyncTerm *jnc_st = (MR_SyncTerm *) &amp;sync_term; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!jnc_st-&amp;gt;MR_st_is_shared) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction has only executed sequentially. */ &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(join_label); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_join_and_continue_1(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction may be executing in parallel. */ &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_LOCK(&amp;MR_sync_term_lock, &amp;quot;continue&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (MR_ENGINE(MR_eng_this_context) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;== jnc_st-&amp;gt;MR_st_orig_context) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context originated this parallel conjunction and &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** all the branches have finished so jump to the join &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** label. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue i&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(join_label); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context didn't originate this parallel &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** conjunction and we're the last branch to finish. &amp;nbsp;The &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** originating context should be suspended waiting for us \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** to finish, so wake it up. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_st-&amp;gt;MR_st_orig_context-&amp;gt;MR_ctxt_resume = join_label; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_schedule_context(jnc_st-&amp;gt;MR_st_orig_context); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue ii&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_join_and_continue_2(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;+extern MR_Code* 
&lt;br&gt;+MR_do_join_and_continue(MR_SyncTerm *sync_term, MR_Code *join_label);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;#define MR_join_and_continue_1() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp;do { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque, &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks); &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jnc_spark.MR_spark_resume); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp;#define MR_join_and_continue_2() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp;#define MR_join_and_continue(sync_term, join_label) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;do { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque, &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped &amp;&amp; (jnc_spark.MR_spark_parent_sp == MR_parent_sp)) { &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark at the top of the stack is due to the same parallel &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** conjunction that we've just been executing. We can immediately \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** execute the next branch of the same parallel conjunction in &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** the current context. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 i&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks); &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jnc_spark.MR_spark_resume); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark stack is empty or the next spark is from a different \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction to the one we've been executing. &amp;nbsp;Either &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** way, there's nothing more we can do with this context right &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** now. &amp;nbsp;Put back the spark we won't be using. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_wsdeque_putback_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque, &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** If this context originated the parallel conjunction we've been \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** executing, the rest of the parallel conjunction must have been \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** put on the global spark queue to be executed in other &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** contexts. &amp;nbsp;This context will need to be resumed once the &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction is completed, so suspend the context. &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_ctxt == jnc_st-&amp;gt;MR_st_orig_context) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_save_context(jnc_ctxt); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_ENGINE(MR_eng_this_context) = NULL; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Finally look for other work. */ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 ii&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Code &amp;nbsp; &amp;nbsp; *jump_target; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jump_target = &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_do_join_and_continue((MR_SyncTerm*) &amp;(sync_term), join_label); \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jump_target); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;/* This needs to come after the definition of MR_SparkDeque_Struct. */
&lt;br&gt;Index: runtime/mercury_thread.c
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/runtime/mercury_thread.c,v
&lt;br&gt;retrieving revision 1.35
&lt;br&gt;diff -u -p -b -r1.35 mercury_thread.c
&lt;br&gt;--- runtime/mercury_thread.c	23 Aug 2009 22:52:35 -0000	1.35
&lt;br&gt;+++ runtime/mercury_thread.c	26 Nov 2009 23:25:34 -0000
&lt;br&gt;@@ -221,34 +221,36 @@ MR_mutex_unlock(MercuryLock *lock, const
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;int
&lt;br&gt;-MR_cond_signal(MercuryCond *cond)
&lt;br&gt;+MR_cond_signal(MercuryCond *cond, const char *from)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int err;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;%ld signaling %p\n&amp;quot;, (long) pthread_self(), cond);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;%ld signaling %p (%s)\n&amp;quot;, 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(long) pthread_self(), cond, from);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;err = pthread_cond_signal(cond);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;assert(err == 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return err;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;int
&lt;br&gt;-MR_cond_broadcast(MercuryCond *cond)
&lt;br&gt;+MR_cond_broadcast(MercuryCond *cond, const char *from)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int err;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;%ld signaling %p\n&amp;quot;, (long) pthread_self(), cond);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;%ld broadcasting %p (%s)\n&amp;quot;, 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(long) pthread_self(), cond, from);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;err = pthread_cond_broadcast(cond);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;assert(err == 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return err;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;int
&lt;br&gt;-MR_cond_wait(MercuryCond *cond, MercuryLock *lock)
&lt;br&gt;+MR_cond_wait(MercuryCond *cond, MercuryLock *lock, const char *from)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int err;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;%ld waiting on %p (%p)\n&amp;quot;, (long) pthread_self(),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cond, lock);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;fprintf(stderr, &amp;quot;%ld waiting on cond: %p lock: %p (%s)\n&amp;quot;, 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(long) pthread_self(), cond, lock, from);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;err = pthread_cond_wait(cond, lock);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;assert(err == 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return err;
&lt;br&gt;Index: runtime/mercury_thread.h
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/runtime/mercury_thread.h,v
&lt;br&gt;retrieving revision 1.27
&lt;br&gt;diff -u -p -b -r1.27 mercury_thread.h
&lt;br&gt;--- runtime/mercury_thread.h	4 Jun 2009 08:07:10 -0000	1.27
&lt;br&gt;+++ runtime/mercury_thread.h	27 Nov 2009 01:41:46 -0000
&lt;br&gt;@@ -31,11 +31,16 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;typedef pthread_mutex_t &amp;nbsp; MercuryLock;
&lt;br&gt;&amp;nbsp; &amp;nbsp;typedef pthread_cond_t &amp;nbsp; &amp;nbsp;MercuryCond;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;extern int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_mutex_lock(MercuryLock *lock, const char *from);
&lt;br&gt;- &amp;nbsp;extern int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_mutex_unlock(MercuryLock *lock, const char *from);
&lt;br&gt;- &amp;nbsp;extern int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_signal(MercuryCond *cond);
&lt;br&gt;- &amp;nbsp;extern int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_broadcast(MercuryCond *cond);
&lt;br&gt;- &amp;nbsp;extern int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_wait(MercuryCond *cond, MercuryLock *lock);
&lt;br&gt;+extern int
&lt;br&gt;+MR_mutex_lock(MercuryLock *lock, const char *from);
&lt;br&gt;+extern int
&lt;br&gt;+MR_mutex_unlock(MercuryLock *lock, const char *from);
&lt;br&gt;+extern int
&lt;br&gt;+MR_cond_signal(MercuryCond *cond, const char *from);
&lt;br&gt;+extern int
&lt;br&gt;+MR_cond_broadcast(MercuryCond *cond, const char *from);
&lt;br&gt;+extern int
&lt;br&gt;+MR_cond_wait(MercuryCond *cond, MercuryLock *lock, const char *from);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;extern MR_bool &amp;nbsp; &amp;nbsp;MR_debug_threads;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -48,9 +53,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#define MR_LOCK(lck, from) &amp;nbsp; &amp;nbsp; &amp;nbsp;pthread_mutex_lock((lck))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#define MR_UNLOCK(lck, from) &amp;nbsp; &amp;nbsp;pthread_mutex_unlock((lck))
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;#define MR_SIGNAL(cnd) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pthread_cond_signal((cnd))
&lt;br&gt;- &amp;nbsp; &amp;nbsp;#define MR_BROADCAST(cnd) &amp;nbsp; &amp;nbsp; &amp;nbsp; pthread_cond_broadcast((cnd))
&lt;br&gt;- &amp;nbsp; &amp;nbsp;#define MR_WAIT(cnd, mtx) &amp;nbsp; &amp;nbsp; &amp;nbsp; pthread_cond_wait((cnd), (mtx))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_SIGNAL(cnd, from) &amp;nbsp; &amp;nbsp;pthread_cond_signal((cnd))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_BROADCAST(cnd, from) pthread_cond_broadcast((cnd))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_WAIT(cnd, mtx, from) pthread_cond_wait((cnd), (mtx))
&lt;br&gt;&amp;nbsp; &amp;nbsp;#else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#define MR_LOCK(lck, from) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MR_debug_threads ? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;@@ -65,21 +70,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pthread_mutex_unlock((lck)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;#define MR_SIGNAL(cnd) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_SIGNAL(cnd, from) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MR_debug_threads ? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_signal((cnd)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_signal((cnd), (from)) &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pthread_cond_signal((cnd)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;#define MR_BROADCAST(cnd) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_BROADCAST(cnd, from) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MR_debug_threads ? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_broadcast((cnd)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_broadcast((cnd), (from)) &amp;nbsp; &amp;nbsp;\
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pthread_cond_broadcast((cnd)) &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;#define MR_WAIT(cnd, mtx) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_WAIT(cnd, mtx, from) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MR_debug_threads ? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_wait((cnd), (mtx)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_cond_wait((cnd), (mtx), (from)) &amp;nbsp;\
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pthread_cond_wait((cnd), (mtx)) &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;@@ -155,9 +160,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;#define MR_LOCK(nothing, from) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do { } while (0)
&lt;br&gt;&amp;nbsp; &amp;nbsp;#define MR_UNLOCK(nothing, from) &amp;nbsp; &amp;nbsp; &amp;nbsp;do { } while (0)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;#define MR_SIGNAL(nothing) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do { } while (0)
&lt;br&gt;- &amp;nbsp;#define MR_BROADCAST(nothing) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; do { } while (0)
&lt;br&gt;- &amp;nbsp;#define MR_WAIT(no, thing) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(0)
&lt;br&gt;+ &amp;nbsp;#define MR_SIGNAL(nothing, from) &amp;nbsp; &amp;nbsp; &amp;nbsp;do { } while (0)
&lt;br&gt;+ &amp;nbsp;#define MR_BROADCAST(nothing, from) &amp;nbsp; do { } while (0)
&lt;br&gt;+ &amp;nbsp;#define MR_WAIT(no, thing, from) &amp;nbsp; &amp;nbsp; &amp;nbsp;(0)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;#define MR_OBTAIN_GLOBAL_LOCK(where) &amp;nbsp;do { } while (0)
&lt;br&gt;&amp;nbsp; &amp;nbsp;#define MR_RELEASE_GLOBAL_LOCK(where) do { } while (0)
&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26537671/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26537671.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26537597</id>
	<title>Re: mercury web site down</title>
	<published>2009-11-26T19:35:05Z</published>
	<updated>2009-11-26T19:35:05Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Thu, Nov 26, 2009 at 09:09:38PM +1100, Paul Bone wrote:
&lt;br&gt;&amp;gt; On Thu, Nov 26, 2009 at 08:52:52PM +1100, Peter Ross wrote:
&lt;br&gt;&amp;gt; &amp;gt; Search google for mercury logic
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; and none of the sites work.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thanks Peter R. &amp;nbsp;Peter W has already reported this. &amp;nbsp;I'll investigate this
&lt;br&gt;&amp;gt; tomorrow as it requires liasing with the department. &amp;nbsp;(It's their fault).
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Follow discussion of this should occur on the mercury-local mailing list.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26537597/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Dev-f14120.html&quot; embed=&quot;fixTarget[14120]&quot; target=&quot;_top&quot; &gt;Mercury - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/mercury-web-site-down-tp26526924p26537597.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26527119</id>
	<title>Re: mercury web site down</title>
	<published>2009-11-26T02:09:38Z</published>
	<updated>2009-11-26T02:09:38Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Thu, Nov 26, 2009 at 08:52:52PM +1100, Peter Ross wrote:
&lt;br&gt;&amp;gt; Search google for mercury logic
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; and none of the sites work.
&lt;br&gt;&lt;br&gt;Thanks Peter R. &amp;nbsp;Peter W has already reported this. &amp;nbsp;I'll investigate this
&lt;br&gt;tomorrow as it requires liasing with the department. &amp;nbsp;(It's their fault).
&lt;br&gt;&lt;br&gt;Meanwhile try:
&lt;br&gt;&lt;a href=&quot;http://www.mercury.csse.unimelb.edu.au/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.mercury.csse.unimelb.edu.au/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26527119/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Dev-f14120.html&quot; embed=&quot;fixTarget[14120]&quot; target=&quot;_top&quot; &gt;Mercury - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/mercury-web-site-down-tp26526924p26527119.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26526924</id>
	<title>mercury web site down</title>
	<published>2009-11-26T01:52:52Z</published>
	<updated>2009-11-26T01:52:52Z</updated>
	<author>
		<name>Peter Ross-2</name>
	</author>
	<content type="html">Search google for mercury logic
&lt;br&gt;&lt;br&gt;and none of the sites work.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Peter Ross - Mission Critical Australia
&lt;br&gt;AU: +61 424 651 834
&lt;br&gt;BE: +32 485 482 559
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-developers mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26526924&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-developers@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26526924&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-developers@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26526924&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-developers-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Dev-f14120.html&quot; embed=&quot;fixTarget[14120]&quot; target=&quot;_top&quot; &gt;Mercury - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/mercury-web-site-down-tp26526924p26526924.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26524371</id>
	<title>Re: for review: gcc 4 with llds grades</title>
	<published>2009-11-25T20:56:44Z</published>
	<updated>2009-11-25T20:56:44Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">Branches: main
&lt;br&gt;&lt;br&gt;compiler/purity.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Downgrade an XXX.
&lt;br&gt;&lt;br&gt;diff --git a/compiler/purity.m b/compiler/purity.m
&lt;br&gt;index 76baad6..56890fd 100644
&lt;br&gt;--- a/compiler/purity.m
&lt;br&gt;+++ b/compiler/purity.m
&lt;br&gt;@@ -289,9 +289,9 @@ puritycheck_pred(PredId, !PredInfo, ModuleInfo, !Specs) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;WorstPurity = Purity,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;perform_pred_purity_checks(!.PredInfo, Purity, DeclPurity,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PromisedPurity, PurityCheckResult0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% XXX Work around a segfault while purity checking invalid/purity/purity.m.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% It seems to be due to gcc 4.1.2 on x86-64 miscompiling the computed
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% goto following the workaround at gcc -O1 and above.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% This was to avoid a crash in the following computed goto, when compiled
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% with gcc 4.1 on x86-64. The problem seems to be gone now, but there's not
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% much to gain from removing the workaround.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PurityCheckResult = workaround_gcc_bug(PurityCheckResult0),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PurityCheckResult = inconsistent_promise,
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26524371&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26524371&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26524371&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-gcc-4-with-llds-grades-tp26473465p26524371.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26523676</id>
	<title>for review: new calling convention for exported procedures to java</title>
	<published>2009-11-25T18:45:59Z</published>
	<updated>2009-11-25T18:45:59Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">Branches: main
&lt;br&gt;&lt;br&gt;Add a new calling convention for Mercury procedures exported to Java with
&lt;br&gt;`:- pragma foreign_export'. &amp;nbsp;When the procedure has multiple output arguments,
&lt;br&gt;require the caller to pass instances of a `Ref&amp;lt;T&amp;gt;' class which contain a field
&lt;br&gt;to hold the output value. &amp;nbsp;This is more verbose than return an `Object[]'
&lt;br&gt;array, and requires extra memory allocations, but is more type-safe. &amp;nbsp;Another
&lt;br&gt;advantage is that the Ref arguments will appear at the same positions as the
&lt;br&gt;output arguments in the Mercury procedure.
&lt;br&gt;&lt;br&gt;The new convention must be enabled with `--java-export-ref-out'. &amp;nbsp;The plan is
&lt;br&gt;to enable it by default in the future.
&lt;br&gt;&lt;br&gt;compiler/options.m:
&lt;br&gt;doc/reference_manual.texi:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add the option.
&lt;br&gt;&lt;br&gt;compiler/ml_proc_gen.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; When the option is set, disable `--det-copy-out' and generate the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; function parameters assuming pass-by-reference for outputs.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Only use the new convention when necessary.
&lt;br&gt;&lt;br&gt;compiler/mlds_to_java.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Make the code to generate the exported forwarding methods account for
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; `mlds_ptr_type' parameters. &amp;nbsp;These are converted to `Ref&amp;lt;T&amp;gt;' arguments.
&lt;br&gt;&lt;br&gt;java/runtime/Ref.java:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add the reference class.
&lt;br&gt;&lt;br&gt;diff --git a/compiler/ml_proc_gen.m b/compiler/ml_proc_gen.m
&lt;br&gt;index f5922a5..2b566fb 100644
&lt;br&gt;--- a/compiler/ml_proc_gen.m
&lt;br&gt;+++ b/compiler/ml_proc_gen.m
&lt;br&gt;@@ -54,6 +54,8 @@
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_type.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- import_module bool.
&lt;br&gt;+:- import_module getopt_io.
&lt;br&gt;+:- import_module int.
&lt;br&gt;&amp;nbsp;:- import_module list.
&lt;br&gt;&amp;nbsp;:- import_module map.
&lt;br&gt;&amp;nbsp;:- import_module maybe.
&lt;br&gt;@@ -208,11 +210,43 @@ ml_gen_pragma_export_proc(ModuleInfo, PragmaExportedProc, Defn) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PragmaExportedProc = pragma_exported_proc(Lang, PredId, ProcId,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExportName, ProgContext),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ml_gen_proc_label(ModuleInfo, PredId, ProcId, Name, ModuleName),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;FuncParams = ml_gen_proc_params(ModuleInfo, PredId, ProcId),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ml_gen_export_proc_params(ModuleInfo, PredId, ProcId, FuncParams),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MLDS_Context = mlds_make_context(ProgContext),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Defn = ml_pragma_export(Lang, ExportName,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;qual(ModuleName, module_qual, Name), FuncParams, MLDS_Context).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+:- pred ml_gen_export_proc_params(module_info::in, pred_id::in, proc_id::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;mlds_func_params::out) is det.
&lt;br&gt;+
&lt;br&gt;+ml_gen_export_proc_params(ModuleInfo, PredId, ProcId, FuncParams) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;module_info_get_globals(ModuleInfo, Globals),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;globals.get_target(Globals, Target),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Target = target_java,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;globals.lookup_bool_option(Globals, java_export_ref_out, yes),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;globals.set_option(det_copy_out, bool(no), Globals, GlobalsByRef),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;module_info_set_globals(GlobalsByRef, ModuleInfo, ModuleInfoByRef),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FuncParamsByRef = ml_gen_proc_params(ModuleInfoByRef, PredId, ProcId),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FuncParamsByRef = mlds_func_params(Args, ReturnTypes),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReturnTypes = [],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% If there is only one output argument, then we should use the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% return value.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.filter(has_ptr_type, Args, OutArgs),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.length(OutArgs) &amp;gt; 1
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReturnTypes = [_ | _]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FuncParams = FuncParamsByRef
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FuncParams = ml_gen_proc_params(ModuleInfo, PredId, ProcId)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred has_ptr_type(mlds_argument::in) is semidet.
&lt;br&gt;+
&lt;br&gt;+has_ptr_type(mlds_argument(_, mlds_ptr_type(_), _)).
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;%
&lt;br&gt;&amp;nbsp;% Stuff to generate MLDS code for HLDS predicates &amp; functions.
&lt;br&gt;diff --git a/compiler/mlds_to_java.m b/compiler/mlds_to_java.m
&lt;br&gt;index 8229e62..84437da 100644
&lt;br&gt;--- a/compiler/mlds_to_java.m
&lt;br&gt;+++ b/compiler/mlds_to_java.m
&lt;br&gt;@@ -491,10 +491,14 @@ mlds_get_java_foreign_code(AllForeignCode) = ForeignCode :-
&lt;br&gt;&amp;nbsp;:- pred output_exports(java_out_info::in, indent::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list(mlds_pragma_export)::in, io::di, io::uo) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-output_exports(_, _, [], !IO).
&lt;br&gt;-output_exports(Info, Indent, [Export | Exports], !IO) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Export = ml_pragma_export(Lang, ExportName, MLDS_Name, MLDS_Signature,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MLDS_Context),
&lt;br&gt;+output_exports(Info, Indent, Exports, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.foldl(output_export(Info, Indent), Exports, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred output_export(java_out_info::in, indent::in, mlds_pragma_export::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+output_export(Info, Indent, Export, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Export = ml_pragma_export(Lang, ExportName, _, MLDS_Signature, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;expect(unify(Lang, lang_java), this_file,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;foreign_export for language other than Java.&amp;quot;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;@@ -512,6 +516,30 @@ output_exports(Info, Indent, [Export | Exports], !IO) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;java.lang.Object []&amp;quot;, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot; &amp;quot; ++ ExportName, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.member(Param, Parameters),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;has_ptr_type(Param)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( ReturnTypes = []
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; ReturnTypes = [_]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_export_ref_out(Info, Indent, Export, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReturnTypes = [_, _ | _],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;output_export: multiple return values&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_export_no_ref_out(Info, Indent, Export, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred output_export_no_ref_out(java_out_info::in, indent::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;mlds_pragma_export::in, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+output_export_no_ref_out(Info, Indent, Export, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Export = ml_pragma_export(_Lang, _ExportName, MLDS_Name, MLDS_Signature,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MLDS_Context),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MLDS_Signature = mlds_func_params(Parameters, ReturnTypes),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;output_params(Info, Indent + 1, MLDS_Context, Parameters, !IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;io.nl(!IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;@@ -523,17 +551,122 @@ output_exports(Info, Indent, [Export | Exports], !IO) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReturnTypes = [_ | _],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;return &amp;quot;, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;write_export_call(MLDS_Name, Parameters, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;}\n&amp;quot;, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred output_export_ref_out(java_out_info::in, indent::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;mlds_pragma_export::in, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+output_export_ref_out(Info, Indent, Export, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Export = ml_pragma_export(_Lang, _ExportName, MLDS_Name, MLDS_Signature,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MLDS_Context),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MLDS_Signature = mlds_func_params(Parameters, ReturnTypes),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.filter(has_ptr_type, Parameters, RefParams, NonRefParams),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;output_export_params_ref_out(Info, Indent, MLDS_Context, Parameters, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.nl(!IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;{\n&amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;indent_line(Indent + 1, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;java.lang.Object[] results = &amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;write_export_call(MLDS_Name, NonRefParams, !IO),
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( ReturnTypes = [] -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FirstRefArg = 0
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;; ReturnTypes = [mlds_native_bool_type] -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Semidet procedure.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FirstRefArg = 1
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;output_export_ref_out: unexpected ReturnTypes&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list.foldl2(assign_ref_output(Info, Indent + 1), RefParams,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FirstRefArg, _, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FirstRefArg = 0
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FirstRefArg = 1,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;indent_line(Indent + 1, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Stmt = &amp;quot;return ((java.lang.Boolean) results[0]).booleanValue();\n&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(Stmt, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;}\n&amp;quot;, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred output_export_params_ref_out(java_out_info::in, indent::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;mlds_context::in, list(mlds_argument)::in, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+output_export_params_ref_out(Info, Indent, Context, Parameters, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;(&amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Parameters = []
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Parameters = [_ | _],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.nl(!IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_list(Parameters, &amp;quot;,\n&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_export_param_ref_out(Info, Indent + 1, Context), !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;)&amp;quot;, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred output_export_param_ref_out(java_out_info::in, indent::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;mlds_context::in, mlds_argument::in, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+output_export_param_ref_out(Info, Indent, _Context, Argument, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Argument = mlds_argument(Name, Type, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( Type = mlds_ptr_type(InnerType) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;jmercury.runtime.Ref&amp;lt;&amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_boxed_type(Info, InnerType, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;&amp;gt; &amp;quot;, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_type(Info, normal_style, Type, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot; &amp;quot;, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;output_name(Name, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred write_export_call(mlds_qualified_entity_name::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;list(mlds_argument)::in, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+write_export_call(MLDS_Name, Parameters, !IO) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;output_fully_qualified_name(MLDS_Name, !IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_char('(', !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;WriteCallArg = (pred(Arg::in, !.IO::di, !:IO::uo) is det :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Arg = mlds_argument(Name, _, _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_name(Name, !IO)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;io.write_list(Parameters, &amp;quot;, &amp;quot;, WriteCallArg, !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;);\n&amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_list(Parameters, &amp;quot;, &amp;quot;, write_argument_name, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;);\n&amp;quot;, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred write_argument_name(mlds_argument::in, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+write_argument_name(Arg, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Arg = mlds_argument(Name, _, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;output_name(Name, !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred assign_ref_output(java_out_info::in, indent::in, mlds_argument::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int::in, int::out, io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+assign_ref_output(Info, Indent, Arg, N, N + 1, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Arg = mlds_argument(Name, Type, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;indent_line(Indent, !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;}\n&amp;quot;, !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;output_exports(Info, Indent, Exports, !IO).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;output_name(Name, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;.val = (&amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( Type = mlds_ptr_type(InnerType) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_boxed_type(Info, InnerType, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_boxed_type(Info, Type, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io.format(&amp;quot;) results[%d];\n&amp;quot;, [i(N)], !IO).
&lt;br&gt;+
&lt;br&gt;+:- pred output_boxed_type(java_out_info::in, mlds_type::in,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;io::di, io::uo) is det.
&lt;br&gt;+
&lt;br&gt;+output_boxed_type(Info, Type, !IO) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;( java_builtin_type(Type, _, JavaBoxedName, _) -&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(JavaBoxedName, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_type(Info, normal_style, Type, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;).
&lt;br&gt;+
&lt;br&gt;+:- pred has_ptr_type(mlds_argument::in) is semidet.
&lt;br&gt;+
&lt;br&gt;+has_ptr_type(mlds_argument(_, mlds_ptr_type(_), _)).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;%
&lt;br&gt;diff --git a/compiler/options.m b/compiler/options.m
&lt;br&gt;index 6a323a0..7a94271 100644
&lt;br&gt;--- a/compiler/options.m
&lt;br&gt;+++ b/compiler/options.m
&lt;br&gt;@@ -411,6 +411,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; put_commit_in_own_func
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; put_nondet_env_on_heap
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Java back-end compilation model options
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; java_export_ref_out
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% IL back-end compilation model options
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; verifiable_code
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; il_refany_fields
&lt;br&gt;@@ -1297,6 +1300,9 @@ option_defaults_2(compilation_model_option, [
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_commit_in_own_func &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_nondet_env_on_heap &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% Java back-end compilation model options
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;java_export_ref_out &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(no),
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% IL back-end compilation model options
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;verifiable_code &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &amp;nbsp; bool(no),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;il_funcptr_types &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &amp;nbsp; bool(no),
&lt;br&gt;@@ -2151,6 +2157,8 @@ long_option(&amp;quot;det-copy-out&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; det_copy_out).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;nondet-copy-out&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp;nondet_copy_out).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;put-commit-in-own-func&amp;quot;, &amp;nbsp; put_commit_in_own_func).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;put-nondet-env-on-heap&amp;quot;, &amp;nbsp; put_nondet_env_on_heap).
&lt;br&gt;+% Java back-end compilation model options
&lt;br&gt;+long_option(&amp;quot;java-export-ref-out&amp;quot;, &amp;nbsp;java_export_ref_out).
&lt;br&gt;&amp;nbsp;% IL back-end compilation model options
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;verifiable-code&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp;verifiable_code).
&lt;br&gt;&amp;nbsp;long_option(&amp;quot;verifiable&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; verifiable_code).
&lt;br&gt;@@ -4257,7 +4265,7 @@ options_help_compilation_model --&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;\tUse an alternative higher-level data representation.&amp;quot;,
&lt;br&gt;&amp;nbsp;% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;--high-level\t\t\t(grades: hl, hl_nest, il, java)&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;--high-level\t\t\t(grades: hl, il, java)&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;\tAn abbreviation for `--high-level-code --high-level-data'.&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;\tAn abbreviation for `--high-level-code --high-level-data'.&amp;quot;,
&lt;br&gt;&amp;nbsp;% The --gcc-nested-functions option is not yet documented,
&lt;br&gt;&amp;nbsp;% because it doesn't pass our test suite, and it is
&lt;br&gt;&amp;nbsp;% probably not very useful.
&lt;br&gt;@@ -4296,6 +4304,9 @@ options_help_compilation_model --&amp;gt;
&lt;br&gt;&amp;nbsp;% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;\tnondeterministic Mercury procedures on the heap,&amp;quot;,
&lt;br&gt;&amp;nbsp;% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;\trather than on the stack.&amp;quot;,
&lt;br&gt;&amp;nbsp;%
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;--java-export-ref-out&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;\tUse pass-by-reference for exported procedures with multiple&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;\toutput arguments.&amp;quot;
&lt;br&gt;&amp;nbsp;% &amp;nbsp; ]),
&lt;br&gt;&amp;nbsp;% &amp;nbsp; io.write_string(&amp;quot;\n &amp;nbsp; &amp;nbsp; &amp;nbsp;IL back-end compilation model options:\n&amp;quot;),
&lt;br&gt;&amp;nbsp;% &amp;nbsp; write_tabbed_lines([
&lt;br&gt;diff --git a/doc/reference_manual.texi b/doc/reference_manual.texi
&lt;br&gt;index 9e3ddac..fbb7424 100644
&lt;br&gt;--- a/doc/reference_manual.texi
&lt;br&gt;+++ b/doc/reference_manual.texi
&lt;br&gt;@@ -6969,9 +6969,6 @@ the length of the array is the number of elements in the tuple.
&lt;br&gt;&amp;nbsp;Mercury variables whose type is a type variable will be passed as
&lt;br&gt;&amp;nbsp;@code{java.lang.Object}.
&lt;br&gt;&amp;nbsp;Mercury array types are mapped to Java array types.
&lt;br&gt;-When compiling with @samp{--no-high-level-data}, all other Mercury variables
&lt;br&gt;-are passed as @code{java.lang.Object[]}.
&lt;br&gt;-When compiling with @samp{--high-level-data},
&lt;br&gt;&amp;nbsp;Mercury variables whose type is a Mercury discriminated union type
&lt;br&gt;&amp;nbsp;will be passed as a Java type whose type name is determined from
&lt;br&gt;&amp;nbsp;the Mercury type name (ignoring any type parameters) followed by
&lt;br&gt;@@ -7000,13 +6997,20 @@ whose result has an input mode, then the Mercury function result is
&lt;br&gt;&amp;nbsp;appended to the list of input parameters, so that the Mercury function
&lt;br&gt;&amp;nbsp;result becomes the last parameter to the corresponding Java function.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+The handling of multiple output arguments depends on the option
&lt;br&gt;+@samp{--java-export-ref-out}. &amp;nbsp;It is disabled by default, but in the
&lt;br&gt;+future will become enabled by default.
&lt;br&gt;+
&lt;br&gt;+@noindent
&lt;br&gt;+Without @samp{--java-export-ref-out}:
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;The result of the Java function will be a sequence comprised of
&lt;br&gt;&amp;nbsp;the outputs of the Mercury procedure. &amp;nbsp;If the Mercury procedure's
&lt;br&gt;&amp;nbsp;determinism indicates that it can fail, then its first output will
&lt;br&gt;&amp;nbsp;be a @samp{boolean} success indicator, with a @samp{true} value
&lt;br&gt;&amp;nbsp;denoting success and a @samp{false} value denoting failure. The
&lt;br&gt;&amp;nbsp;remaining outputs will be the subsequence of the Mercury procedure's
&lt;br&gt;-arguments and function result (if any) that have output modes. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+arguments and function result (if any) that have output modes.
&lt;br&gt;&amp;nbsp; 
&lt;br&gt;&amp;nbsp;If the sequence has length zero then the return type of the
&lt;br&gt;&amp;nbsp;Java function is @samp{void}.
&lt;br&gt;@@ -7014,7 +7018,30 @@ If the sequence has length one then the return type of the
&lt;br&gt;&amp;nbsp;Java function is the type of the item in question.
&lt;br&gt;&amp;nbsp;Otherwise, the Java function will return an array of type
&lt;br&gt;&amp;nbsp;@samp{java.lang.Object[]}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+@noindent
&lt;br&gt;+With @samp{--java-export-ref-out}:
&lt;br&gt;+
&lt;br&gt;+If the Mercury procedure is deterministic and has no output arguments,
&lt;br&gt;+then the return type of the Java function is @samp{void}; if it has
&lt;br&gt;+one output argument, then the return value of the function is that
&lt;br&gt;+output argument.
&lt;br&gt;+
&lt;br&gt;+If the Mercury procedure is deterministic and has two or more output
&lt;br&gt;+arguments, then the return type of the Java function is @samp{void}.
&lt;br&gt;+At the position of each output argument, the Java function takes a
&lt;br&gt;+value of the type @samp{jmercury.runtime.Ref&amp;lt;T&amp;gt;} where @samp{T} is the
&lt;br&gt;+Java type corresponding to the type of the output argument.
&lt;br&gt;+@samp{Ref} is a class with a single field @samp{val}, which is
&lt;br&gt;+assigned the output value when the function returns.
&lt;br&gt;+
&lt;br&gt;+If the Mercury procedure is semi-deterministic then the Java function
&lt;br&gt;+returns a @samp{boolean}. &amp;nbsp;A @samp{true} return value denotes success
&lt;br&gt;+and @samp{false} denotes failure. &amp;nbsp;Output arguments are handled in the
&lt;br&gt;+same way as multiple outputs deterministic procedures, using the
&lt;br&gt;+@samp{Ref} class. &amp;nbsp;On failure the values of the @samp{val} fields are
&lt;br&gt;+undefined.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;Arguments of type @samp{io.state} or @samp{store.store(_)} are not
&lt;br&gt;&amp;nbsp;passed or returned at all.
&lt;br&gt;&amp;nbsp;(The reason for this is that these types represent mutable state,
&lt;br&gt;diff --git a/java/runtime/Ref.java b/java/runtime/Ref.java
&lt;br&gt;new file mode 100644
&lt;br&gt;index 0000000..00b07be
&lt;br&gt;--- /dev/null
&lt;br&gt;+++ b/java/runtime/Ref.java
&lt;br&gt;@@ -0,0 +1,14 @@
&lt;br&gt;+//
&lt;br&gt;+// Copyright (C) 2009 The University of Melbourne.
&lt;br&gt;+// This file may only be copied under the terms of the GNU Library General
&lt;br&gt;+// Public License - see the file COPYING.LIB in the Mercury distribution.
&lt;br&gt;+//
&lt;br&gt;+// This class is used in some cases to hold output values of Mercury
&lt;br&gt;+// procedures exported to Java.
&lt;br&gt;+//
&lt;br&gt;+
&lt;br&gt;+package jmercury.runtime;
&lt;br&gt;+
&lt;br&gt;+public class Ref&amp;lt;T&amp;gt; {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public T val;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26523676&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26523676&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26523676&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-new-calling-convention-for-exported-procedures-to-java-tp26523676p26523676.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26505515</id>
	<title>Re: for review: gcc 4 with llds grades</title>
	<published>2009-11-24T15:51:02Z</published>
	<updated>2009-11-24T15:51:02Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">On 2009-11-24, Julien Fischer &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26505515&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;juliensf@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt;+AC_SUBST(CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Why is CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS an output variable? &amp;nbsp;Its value
&lt;br&gt;&amp;gt; is not used beyond the configure script.
&lt;br&gt;&lt;br&gt;Left over from an earlier version of the patch; deleted.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; &amp;gt;@@ -2993,16 +3010,6 @@ case &amp;quot;$mercury_cv_user_base_grade&amp;quot; in
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BEST_LLDS_BASE_GRADE=none
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fi
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fi
&lt;br&gt;&amp;gt; &amp;gt;-
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Force the use of the none base grade if the C compiler
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# is GCC 4.{1,2,3,4}. &amp;nbsp;The asm_fast and reg grades either
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# don't work or are unstable with those versions.
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# (See bugs #39, #66 and #78 in the Mercury bug database.)
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case &amp;quot;$mercury_cv_gcc_version&amp;quot; in
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4_1_*|4_2_*|4_3_*|4_4_*)
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BEST_LLDS_BASE_GRADE=none
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;;
&lt;br&gt;&amp;gt; &amp;gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;esac
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I suggest leaving a commented out version of the above code, so that if
&lt;br&gt;&amp;gt; the workaround needs to be applied to a future version of GCC it is
&lt;br&gt;&amp;gt; obvious how and where to do it.
&lt;/div&gt;&lt;br&gt;Done.
&lt;br&gt;&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp;/*
&lt;br&gt;&amp;gt; &amp;gt;+ &amp;nbsp;** This hack is to prevent gcc 4.x optimizing away stores to succip before
&lt;br&gt;&amp;gt; &amp;gt;+ &amp;nbsp;** jumping to a label in asm_fast.gc.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; s/asm_fast.gc/asm_fast*/
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; It presumably has nothing to do with the presence or absence of garbage
&lt;br&gt;&amp;gt; collection.
&lt;br&gt;&lt;br&gt;Done.
&lt;br&gt;&lt;br&gt;Peter
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26505515&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26505515&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26505515&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-gcc-4-with-llds-grades-tp26473465p26505515.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26492696</id>
	<title>Re: for review: gcc 4 with llds grades</title>
	<published>2009-11-24T01:12:34Z</published>
	<updated>2009-11-24T01:12:34Z</updated>
	<author>
		<name>Julien Fischer-2</name>
	</author>
	<content type="html">&lt;br&gt;On Mon, 23 Nov 2009, Peter Wang wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; Make it possible to use gcc global registers and non-local gotos with gcc 4.x.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Tested with asm_fast.gc on Linux/x86 with gcc 4.1.2, 4.2.4, 4.3.3, 4.4.2;
&lt;br&gt;&amp;gt; and on Linux/x86-64 with gcc 4.2.4. 
&lt;br&gt;&amp;gt; I also did limited testing of reg.gc,
&lt;br&gt;&amp;gt; which also worked.
&lt;br&gt;&lt;br&gt;We should try it on Darwin/x86 too.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Some low-level C grades do not build with the current version of the compiler
&lt;br&gt;&amp;gt; so were not tested: fast.gc, jump.gc, asm_jump.gc.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; configure.in:
&lt;br&gt;&amp;gt; 	Check if the C compiler accepts `-fno-move-loop-invariants'.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 	Add `-fno-move-loop-invariants' to gcc flags for non-local gotos.
&lt;br&gt;&amp;gt; 	This is enough for `asm_jump.gc' to work (tested with an earlier
&lt;br&gt;&amp;gt; 	version of the compiler).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 	Remove code to force `none' grades with gcc 4.x.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; runtime/mercury_goto.h:
&lt;br&gt;&amp;gt; 	Add a hack to prevent gcc 4.x removing stores to the succip register
&lt;br&gt;&amp;gt; 	before a jump. &amp;nbsp;Along with `-fno-move-loop-invariants', this lets
&lt;br&gt;&amp;gt; 	`asm_fast.gc' work.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 	This hack is currently only used for the x86 and x86-64 definitions of
&lt;br&gt;&amp;gt; 	MR_ASM_JUMP/MR_JUMP, but is possibly required on other architectures,
&lt;br&gt;&amp;gt; 	too.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; runtime/RESERVED_MACRO_NAMES:
&lt;br&gt;&amp;gt; 	Add a macro which can be defined by gcc.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; diff --git a/configure.in b/configure.in
&lt;br&gt;&amp;gt; index 3e77a7b..10d8289 100644
&lt;br&gt;&amp;gt; --- a/configure.in
&lt;br&gt;&amp;gt; +++ b/configure.in
&lt;br&gt;&amp;gt; @@ -838,6 +838,19 @@ else
&lt;br&gt;&amp;gt; fi
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; AC_SUBST(CFLAGS_FOR_NO_STRICT_ALIASING)
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +AC_MSG_CHECKING(whether we can use -fno-move-loop-invariants)
&lt;br&gt;&amp;gt; +if $CC -O2 -Wall -fno-move-loop-invariants -c conftest.c \
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;/dev/null &amp;gt;&amp;AC_FD_CC 2&amp;gt;&amp;1
&lt;br&gt;&amp;gt; +then
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;AC_MSG_RESULT(yes)
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS=&amp;quot;-fno-move-loop-invariants&amp;quot;
&lt;br&gt;&amp;gt; +else
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;AC_MSG_RESULT(no)
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS=
&lt;br&gt;&amp;gt; +fi
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +AC_SUBST(CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS)
&lt;/div&gt;&lt;br&gt;Why is CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS an output variable? &amp;nbsp;Its value
&lt;br&gt;is not used beyond the configure script.
&lt;br&gt;&lt;br&gt;...
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; #-----------------------------------------------------------------------------#
&lt;br&gt;&amp;gt; @@ -2329,6 +2342,9 @@ AC_SUBST(MR_DARWIN_SETJMP_WORKAROUND)
&lt;br&gt;&amp;gt; # (Actually I don't know if `-fno-functions-cse' is really needed.
&lt;br&gt;&amp;gt; # Maybe you can get away without it. &amp;nbsp;But better to err on the safe side...)
&lt;br&gt;&amp;gt; #
&lt;br&gt;&amp;gt; +# For x86, x86-64 and possibly other architectures, when using non-local
&lt;br&gt;&amp;gt; +# gotos with gcc 4.x we need `-fno-move-loop-invariants'.
&lt;br&gt;&amp;gt; +#
&lt;br&gt;&amp;gt; # For alpha, mips, and ARM, and probably on other architectures, when using
&lt;br&gt;&amp;gt; # non-local gotos we need -fomit-frame-pointer, otherwise when compiling
&lt;br&gt;&amp;gt; # with --no-c-optimize we run into a problem similar to the one above:
&lt;br&gt;&amp;gt; @@ -2359,6 +2375,7 @@ case &amp;quot;$ac_cv_prog_gcc&amp;quot; in yes)
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CFLAGS_FOR_GOTOS=&amp;quot;-fno-defer-pop -fno-function-cse -fno-gcse&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; esac
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;CFLAGS_FOR_GOTOS=&amp;quot;$CFLAGS_FOR_GOTOS $CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; case &amp;quot;$host&amp;quot; in
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mips-sgi-irix5.*)
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Non-local gotos don't work with shared libraries on Irix 5,
&lt;br&gt;&amp;gt; @@ -2993,16 +3010,6 @@ case &amp;quot;$mercury_cv_user_base_grade&amp;quot; in
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BEST_LLDS_BASE_GRADE=none
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fi
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fi
&lt;br&gt;&amp;gt; -
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Force the use of the none base grade if the C compiler
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# is GCC 4.{1,2,3,4}. &amp;nbsp;The asm_fast and reg grades either
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# don't work or are unstable with those versions.
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# (See bugs #39, #66 and #78 in the Mercury bug database.)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case &amp;quot;$mercury_cv_gcc_version&amp;quot; in
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4_1_*|4_2_*|4_3_*|4_4_*)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BEST_LLDS_BASE_GRADE=none
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;esac
&lt;/div&gt;&lt;br&gt;I suggest leaving a commented out version of the above code, so that if
&lt;br&gt;the workaround needs to be applied to a future version of GCC it is
&lt;br&gt;obvious how and where to do it.
&lt;br&gt;&lt;br&gt;...
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; diff --git a/runtime/mercury_goto.h b/runtime/mercury_goto.h
&lt;br&gt;&amp;gt; index 1e499d5..7a87864 100644
&lt;br&gt;&amp;gt; --- a/runtime/mercury_goto.h
&lt;br&gt;&amp;gt; +++ b/runtime/mercury_goto.h
&lt;br&gt;&amp;gt; @@ -353,6 +353,20 @@
&lt;br&gt;&amp;gt; #elif defined(__i386__) || defined(__mc68000__) || defined(__x86_64__)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; /*
&lt;br&gt;&amp;gt; + &amp;nbsp;** This hack is to prevent gcc 4.x optimizing away stores to succip before
&lt;br&gt;&amp;gt; + &amp;nbsp;** jumping to a label in asm_fast.gc.
&lt;/div&gt;&lt;br&gt;s/asm_fast.gc/asm_fast*/
&lt;br&gt;&lt;br&gt;It presumably has nothing to do with the presence or absence of garbage
&lt;br&gt;collection.
&lt;br&gt;&lt;br&gt;The diff looks good otherwise.
&lt;br&gt;&lt;br&gt;Julien.
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492696&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492696&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492696&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-gcc-4-with-llds-grades-tp26473465p26492696.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26492522</id>
	<title>Re: for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-24T00:57:59Z</published>
	<updated>2009-11-24T00:57:59Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">On 24-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492522&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; I'm beginning to wonder if it would be best to write MR_join_and_continue as a
&lt;br&gt;&amp;gt; C function and use a macro that wraps it to avoid the stack leak as follows:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; extern MR_Code *MR_do_join_and_continue(MR_SyncTerm *sync_term); 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; #define MR_join_and_continue(sync_term, join_label) \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; do { \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_Code *jump_target; \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jump_target = MR_do_join_and_continue(sync_term); \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (jump_target) { \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_GOTO(jump_target); \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else { \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_GOTO(join_label); \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } \
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;/div&gt;&lt;br&gt;That is exactly the technique we use for calling the debugger; it works well.
&lt;br&gt;I think that is the approach you should use.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492522&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492522&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26492522&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26492522.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26490573</id>
	<title>Re: for review: gcc 4 with llds grades</title>
	<published>2009-11-23T21:08:36Z</published>
	<updated>2009-11-23T21:08:36Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">On 2009-11-24, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26490573&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 23, 2009 at 05:51:40PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt; &amp;gt; Branches: main
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Make it possible to use gcc global registers and non-local gotos with gcc 4.x.
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Tested with asm_fast.gc on Linux/x86 with gcc 4.1.2, 4.2.4, 4.3.3, 4.4.2;
&lt;br&gt;&amp;gt; &amp;gt; and on Linux/x86-64 with gcc 4.2.4. &amp;nbsp;I also did limited testing of reg.gc,
&lt;br&gt;&amp;gt; &amp;gt; which also worked.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Could you please do some more testing on Linux/x86-64. &amp;nbsp;The GCC 4 related
&lt;br&gt;&amp;gt; problems seem to be exasabated on this achitecture.
&lt;/div&gt;&lt;br&gt;Bootchecked with gcc 4.1.3 and 4.3.3 on x86-64 (neptune) as well.
&lt;br&gt;&lt;br&gt;Peter
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26490573&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26490573&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26490573&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-gcc-4-with-llds-grades-tp26473465p26490573.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26488941</id>
	<title>Re: for review: gcc 4 with llds grades</title>
	<published>2009-11-23T17:04:57Z</published>
	<updated>2009-11-23T17:04:57Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Mon, Nov 23, 2009 at 05:51:40PM +1100, Peter Wang wrote:
&lt;br&gt;&amp;gt; Branches: main
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Make it possible to use gcc global registers and non-local gotos with gcc 4.x.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Tested with asm_fast.gc on Linux/x86 with gcc 4.1.2, 4.2.4, 4.3.3, 4.4.2;
&lt;br&gt;&amp;gt; and on Linux/x86-64 with gcc 4.2.4. &amp;nbsp;I also did limited testing of reg.gc,
&lt;br&gt;&amp;gt; which also worked.
&lt;br&gt;&lt;br&gt;Could you please do some more testing on Linux/x86-64. &amp;nbsp;The GCC 4 related
&lt;br&gt;problems seem to be exasabated on this achitecture. &amp;nbsp;If you need any testing
&lt;br&gt;environments or access to more versions of GCC and Linux let us know. &amp;nbsp;We can
&lt;br&gt;setup virtual machines to help with this.
&lt;br&gt;&lt;br&gt;I'll review the patch later.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26488941/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-gcc-4-with-llds-grades-tp26473465p26488941.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26488289</id>
	<title>Re: for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-23T15:51:26Z</published>
	<updated>2009-11-23T15:51:26Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Mon, Nov 23, 2009 at 11:39:31PM +1100, Zoltan Somogyi wrote:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 23-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26488289&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; compiler/par_conj_gen.m:
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; Modified the generation of the join and continue code. &amp;nbsp;This now includes
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; instructions for saving a pointer to the synchronization term into MR_r1,
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; before calling MR_join_and_continue.
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; Added an XXX: How to I tell the low-level backend that I will clobber MR_r1
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; and MR_succip? &amp;nbsp;Could someone familiar with the low-level backend help me?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; That kind of problem is what I meant when I said that implementing this as a
&lt;br&gt;&amp;gt; call would be harder than fixing the macro.
&lt;/div&gt;&lt;/div&gt;Yes, I thought so.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; You shouldn't have to clear other needed values of r1; you should have
&lt;br&gt;&amp;gt; *reserved* r1 earlier, before anything else gets put in it. Since you didn't,
&lt;br&gt;&amp;gt; you can move the value in r1 to a stack slot, using the predicates in
&lt;br&gt;&amp;gt; var_locn.m (which are well commented, and which are usually accessed through
&lt;br&gt;&amp;gt; their wrapper predicates in code_info.m), but since what you want is
&lt;br&gt;&amp;gt; effectively a call to a builtin predicate, you should instead either (a)
&lt;br&gt;&amp;gt; implement the call as a HLDS-to-HLDS transform in an earlier compiler pass,
&lt;br&gt;&amp;gt; or (b) use the infrastructure that already exists in call_gen.m to generate
&lt;br&gt;&amp;gt; the code for the call at code generation time. (a) seems to me to be
&lt;br&gt;&amp;gt; preferable.
&lt;/div&gt;&lt;/div&gt;I like the HLDS to HLDS idea as it keeps the backend simple (and is backend
&lt;br&gt;independent). &amp;nbsp;Although, the HLDS works on a representation of a logic program,
&lt;br&gt;therefore a whole parallel conjunction would have to be transformed into
&lt;br&gt;something else. &amp;nbsp;I'm not sure what that 'something else' should be since I don't
&lt;br&gt;think we have any HLDS structures that can represent the execution flow of a
&lt;br&gt;parallel conjunction.
&lt;br&gt;&lt;br&gt;Doing this at a HLDS to LLDS stage therefore seems better. But I'm not sure
&lt;br&gt;that an LLDS call instruction is considered to have the right operational
&lt;br&gt;semantics. &amp;nbsp;If join_and_continue is a call then the join label can be assumed
&lt;br&gt;to be a continuation label. &amp;nbsp;But not very call to MR_join_and_continue will
&lt;br&gt;return (jump to the join label) only the last to be executed in the conjunction
&lt;br&gt;(not necessary the rightmost conjunct). &amp;nbsp;The LLDS call instruction might still
&lt;br&gt;be suitable, but it's not an ideal match.
&lt;br&gt;&lt;br&gt;The other benefit of doing this at code generation time will be that it will
&lt;br&gt;be easier to implement parallel conjunctions for the high level C backend by
&lt;br&gt;using blocks and GCD.
&lt;br&gt;&lt;br&gt;I'm beginning to wonder if it would be best to write MR_join_and_continue as a
&lt;br&gt;C function and use a macro that wraps it to avoid the stack leak as follows:
&lt;br&gt;&lt;br&gt;extern MR_Code *MR_do_join_and_continue(MR_SyncTerm *sync_term); 
&lt;br&gt;&lt;br&gt;#define MR_join_and_continue(sync_term, join_label) \
&lt;br&gt;&amp;nbsp; &amp;nbsp; do { \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_Code *jump_target; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jump_target = MR_do_join_and_continue(sync_term); \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (jump_target) { \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_GOTO(jump_target); \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else { \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_GOTO(join_label); \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } \
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;Well, this already looks remarkably simple in comparison! &amp;nbsp;It also avoids a
&lt;br&gt;computed GOTO when it should jump to the join label (at the cost of the
&lt;br&gt;if-then-else).
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26488289/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26488289.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26477372</id>
	<title>Re: for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-23T04:39:31Z</published>
	<updated>2009-11-23T04:39:31Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">On 23-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26477372&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; compiler/par_conj_gen.m:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Modified the generation of the join and continue code. &amp;nbsp;This now includes
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; instructions for saving a pointer to the synchronization term into MR_r1,
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; before calling MR_join_and_continue.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Added an XXX: How to I tell the low-level backend that I will clobber MR_r1
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; and MR_succip? &amp;nbsp;Could someone familiar with the low-level backend help me?
&lt;br&gt;&lt;br&gt;That kind of problem is what I meant when I said that implementing this as a
&lt;br&gt;call would be harder than fixing the macro.
&lt;br&gt;&lt;br&gt;You shouldn't have to clear other needed values of r1; you should have
&lt;br&gt;*reserved* r1 earlier, before anything else gets put in it. Since you didn't,
&lt;br&gt;you can move the value in r1 to a stack slot, using the predicates in
&lt;br&gt;var_locn.m (which are well commented, and which are usually accessed through
&lt;br&gt;their wrapper predicates in code_info.m), but since what you want is
&lt;br&gt;effectively a call to a builtin predicate, you should instead either (a)
&lt;br&gt;implement the call as a HLDS-to-HLDS transform in an earlier compiler pass,
&lt;br&gt;or (b) use the infrastructure that already exists in call_gen.m to generate
&lt;br&gt;the code for the call at code generation time. (a) seems to me to be
&lt;br&gt;preferable.
&lt;br&gt;&lt;br&gt;I haven't looked at the diff yet, since I have a really slow connection
&lt;br&gt;and a small screen, but based on the misunderstanding above, I don't think
&lt;br&gt;the diff is ready for review yet anyway.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26477372&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26477372&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26477372&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26477372.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26473465</id>
	<title>for review: gcc 4 with llds grades</title>
	<published>2009-11-22T22:51:40Z</published>
	<updated>2009-11-22T22:51:40Z</updated>
	<author>
		<name>Peter Wang-6</name>
	</author>
	<content type="html">Branches: main
&lt;br&gt;&lt;br&gt;Make it possible to use gcc global registers and non-local gotos with gcc 4.x.
&lt;br&gt;&lt;br&gt;Tested with asm_fast.gc on Linux/x86 with gcc 4.1.2, 4.2.4, 4.3.3, 4.4.2;
&lt;br&gt;and on Linux/x86-64 with gcc 4.2.4. &amp;nbsp;I also did limited testing of reg.gc,
&lt;br&gt;which also worked.
&lt;br&gt;&lt;br&gt;Some low-level C grades do not build with the current version of the compiler
&lt;br&gt;so were not tested: fast.gc, jump.gc, asm_jump.gc.
&lt;br&gt;&lt;br&gt;configure.in:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Check if the C compiler accepts `-fno-move-loop-invariants'.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add `-fno-move-loop-invariants' to gcc flags for non-local gotos.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; This is enough for `asm_jump.gc' to work (tested with an earlier
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; version of the compiler).
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Remove code to force `none' grades with gcc 4.x.
&lt;br&gt;&lt;br&gt;runtime/mercury_goto.h:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add a hack to prevent gcc 4.x removing stores to the succip register
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; before a jump. &amp;nbsp;Along with `-fno-move-loop-invariants', this lets
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; `asm_fast.gc' work.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; This hack is currently only used for the x86 and x86-64 definitions of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MR_ASM_JUMP/MR_JUMP, but is possibly required on other architectures,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; too.
&lt;br&gt;&lt;br&gt;runtime/RESERVED_MACRO_NAMES:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add a macro which can be defined by gcc.
&lt;br&gt;&lt;br&gt;diff --git a/configure.in b/configure.in
&lt;br&gt;index 3e77a7b..10d8289 100644
&lt;br&gt;--- a/configure.in
&lt;br&gt;+++ b/configure.in
&lt;br&gt;@@ -838,6 +838,19 @@ else
&lt;br&gt;&amp;nbsp;fi
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;AC_SUBST(CFLAGS_FOR_NO_STRICT_ALIASING)
&lt;br&gt;+
&lt;br&gt;+AC_MSG_CHECKING(whether we can use -fno-move-loop-invariants)
&lt;br&gt;+if $CC -O2 -Wall -fno-move-loop-invariants -c conftest.c \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;/dev/null &amp;gt;&amp;AC_FD_CC 2&amp;gt;&amp;1
&lt;br&gt;+then
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;AC_MSG_RESULT(yes)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS=&amp;quot;-fno-move-loop-invariants&amp;quot;
&lt;br&gt;+else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;AC_MSG_RESULT(no)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS=
&lt;br&gt;+fi
&lt;br&gt;+
&lt;br&gt;+AC_SUBST(CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS)
&lt;br&gt;&amp;nbsp;rm -f conftest*
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#-----------------------------------------------------------------------------#
&lt;br&gt;@@ -2329,6 +2342,9 @@ AC_SUBST(MR_DARWIN_SETJMP_WORKAROUND)
&lt;br&gt;&amp;nbsp;# (Actually I don't know if `-fno-functions-cse' is really needed.
&lt;br&gt;&amp;nbsp;# Maybe you can get away without it. &amp;nbsp;But better to err on the safe side...)
&lt;br&gt;&amp;nbsp;#
&lt;br&gt;+# For x86, x86-64 and possibly other architectures, when using non-local
&lt;br&gt;+# gotos with gcc 4.x we need `-fno-move-loop-invariants'.
&lt;br&gt;+#
&lt;br&gt;&amp;nbsp;# For alpha, mips, and ARM, and probably on other architectures, when using
&lt;br&gt;&amp;nbsp;# non-local gotos we need -fomit-frame-pointer, otherwise when compiling
&lt;br&gt;&amp;nbsp;# with --no-c-optimize we run into a problem similar to the one above:
&lt;br&gt;@@ -2359,6 +2375,7 @@ case &amp;quot;$ac_cv_prog_gcc&amp;quot; in yes)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CFLAGS_FOR_GOTOS=&amp;quot;-fno-defer-pop -fno-function-cse -fno-gcse&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;esac
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;CFLAGS_FOR_GOTOS=&amp;quot;$CFLAGS_FOR_GOTOS $CFLAGS_FOR_NO_MOVE_LOOP_INVARIANTS&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;case &amp;quot;$host&amp;quot; in
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mips-sgi-irix5.*)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Non-local gotos don't work with shared libraries on Irix 5,
&lt;br&gt;@@ -2993,16 +3010,6 @@ case &amp;quot;$mercury_cv_user_base_grade&amp;quot; in
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BEST_LLDS_BASE_GRADE=none
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fi
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fi
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Force the use of the none base grade if the C compiler
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# is GCC 4.{1,2,3,4}. &amp;nbsp;The asm_fast and reg grades either
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# don't work or are unstable with those versions.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# (See bugs #39, #66 and #78 in the Mercury bug database.)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case &amp;quot;$mercury_cv_gcc_version&amp;quot; in
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4_1_*|4_2_*|4_3_*|4_4_*)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BEST_LLDS_BASE_GRADE=none
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;esac
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ;;
&lt;br&gt;&amp;nbsp;esac
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff --git a/runtime/RESERVED_MACRO_NAMES b/runtime/RESERVED_MACRO_NAMES
&lt;br&gt;index 9a65cc6..b1097b1 100644
&lt;br&gt;--- a/runtime/RESERVED_MACRO_NAMES
&lt;br&gt;+++ b/runtime/RESERVED_MACRO_NAMES
&lt;br&gt;@@ -67,6 +67,7 @@ sigcontext_struct
&lt;br&gt;&amp;nbsp;_GNU_SOURCE
&lt;br&gt;&amp;nbsp;__EXTENSIONS__
&lt;br&gt;&amp;nbsp;__OPTIMIZE__
&lt;br&gt;+__GCC_HAVE_DWARF2_CFI_ASM
&lt;br&gt;&amp;nbsp;#-----------------------------------------------------------------------------#
&lt;br&gt;&amp;nbsp;# These are defined in when threads are enabled.
&lt;br&gt;&amp;nbsp;_REENTRANT
&lt;br&gt;diff --git a/runtime/mercury_goto.h b/runtime/mercury_goto.h
&lt;br&gt;index 1e499d5..7a87864 100644
&lt;br&gt;--- a/runtime/mercury_goto.h
&lt;br&gt;+++ b/runtime/mercury_goto.h
&lt;br&gt;@@ -353,6 +353,20 @@
&lt;br&gt;&amp;nbsp;#elif defined(__i386__) || defined(__mc68000__) || defined(__x86_64__)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp;** This hack is to prevent gcc 4.x optimizing away stores to succip before
&lt;br&gt;+ &amp;nbsp;** jumping to a label in asm_fast.gc.
&lt;br&gt;+ &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp;#if defined(MR_USE_GCC_GLOBAL_REGISTERS)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_FORCE_SUCCIP_STORE			\
&lt;br&gt;+	__asm__ __volatile__(&amp;quot;&amp;quot;				\
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;: &amp;quot;=r&amp;quot;(MR_succip_word)			\
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;: &amp;quot;0&amp;quot;(MR_succip_word)			\
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp;#else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;#define MR_FORCE_SUCCIP_STORE &amp;nbsp; (void)
&lt;br&gt;+ &amp;nbsp;#endif
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;/*
&lt;br&gt;&amp;nbsp; &amp;nbsp;** The following hack works around a stack leak on the i386.
&lt;br&gt;&amp;nbsp; &amp;nbsp;** (and apparently the 68000 and x86_64 too).
&lt;br&gt;&amp;nbsp; &amp;nbsp;**
&lt;br&gt;@@ -380,11 +394,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#define MR_ASM_JUMP(label)				\
&lt;br&gt;&amp;nbsp;	{ register int stack_pointer __asm__(&amp;quot;esp&amp;quot;);	\
&lt;br&gt;&amp;nbsp;	__asm__(&amp;quot;&amp;quot; : : &amp;quot;g&amp;quot;(stack_pointer)); }		\
&lt;br&gt;+	MR_FORCE_SUCCIP_STORE;				\
&lt;br&gt;&amp;nbsp;	goto *(label)
&lt;br&gt;&amp;nbsp; &amp;nbsp;#elif defined(__x86_64__)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#define MR_ASM_JUMP(label)				\
&lt;br&gt;&amp;nbsp;	{ register int stack_pointer __asm__(&amp;quot;rsp&amp;quot;);	\
&lt;br&gt;&amp;nbsp;	__asm__(&amp;quot;&amp;quot; : : &amp;quot;g&amp;quot;(stack_pointer)); }		\
&lt;br&gt;+	MR_FORCE_SUCCIP_STORE;				\
&lt;br&gt;&amp;nbsp;	goto *(label)
&lt;br&gt;&amp;nbsp; &amp;nbsp;#elif defined(__mc68000__)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#define MR_ASM_JUMP(label)				\
&lt;br&gt;&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26473465&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26473465&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26473465&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-gcc-4-with-llds-grades-tp26473465p26473465.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26472184</id>
	<title>for review: Re-factor the MR_join_and_continue macro.</title>
	<published>2009-11-22T19:09:01Z</published>
	<updated>2009-11-22T19:09:01Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">&lt;br&gt;For review by someone familiar with the low-level C backend, probably Zoltan.
&lt;br&gt;&lt;br&gt;&amp;nbsp;- Thanks, Paul.
&lt;br&gt;&lt;br&gt;Re-factor the MR_join_and_continue macro.
&lt;br&gt;&lt;br&gt;This change replaces the MR_join_and_continue macro with a Mercury C procedure.
&lt;br&gt;This macro is used in the implementation of parallel conjunctions in the low
&lt;br&gt;level C grades. &amp;nbsp;This means that this code will always be a procedure call
&lt;br&gt;rather than always being in-lined.
&lt;br&gt;&lt;br&gt;This change also required changes to the compiler, namely in the hlds-&amp;gt;llds
&lt;br&gt;and llds-&amp;gt;C transformations for parallel conjunctions.
&lt;br&gt;&lt;br&gt;runtime/mercury_context.h:
&lt;br&gt;runtime/mercury_context.c:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Created MR_do_join_and_continue procedure from old MR_join_and_continue
&lt;br&gt;&amp;nbsp; &amp;nbsp; macro.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Created a new macro MR_join_and_continue that wraps the new procedure.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Added additional comments to this procedure, describing how it works.
&lt;br&gt;&lt;br&gt;compiler/llds.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Modified the LLDS data structure:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Removed the synchronization term parameter from the join_and_continue
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instruction.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Added a new memory reference, one can now address data on the parent
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context's stack.
&lt;br&gt;&lt;br&gt;compiler/par_conj_gen.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Modified the generation of the join and continue code. &amp;nbsp;This now includes
&lt;br&gt;&amp;nbsp; &amp;nbsp; instructions for saving a pointer to the synchronization term into MR_r1,
&lt;br&gt;&amp;nbsp; &amp;nbsp; before calling MR_join_and_continue.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Added an XXX: How to I tell the low-level backend that I will clobber MR_r1
&lt;br&gt;&amp;nbsp; &amp;nbsp; and MR_succip? &amp;nbsp;Could someone familiar with the low-level backend help me?
&lt;br&gt;&lt;br&gt;compiler/llds_out_data.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Generate code for taking the address of something on the parent context's
&lt;br&gt;&amp;nbsp; &amp;nbsp; stack.
&lt;br&gt;&lt;br&gt;compiler/llds_out_instr.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Alter the code generation for the join_and_continue instruction.
&lt;br&gt;&lt;br&gt;compiler/opt_util.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Conform to changes in llds.m.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Introduced an XXX: I don't know if join_and_continue use livevals. &amp;nbsp;Can
&lt;br&gt;&amp;nbsp; &amp;nbsp; someone familiar with this part of the compiler advise me?
&lt;br&gt;&lt;br&gt;compiler/code_util.m:
&lt;br&gt;compiler/dupelim.m:
&lt;br&gt;compiler/dupproc.m:
&lt;br&gt;compiler/exprn_aux.m:
&lt;br&gt;compiler/global_data.m:
&lt;br&gt;compiler/jumpopt.m:
&lt;br&gt;compiler/livemap.m:
&lt;br&gt;compiler/llds_out_file.m:
&lt;br&gt;compiler/llds_to_x86_64.m:
&lt;br&gt;compiler/middle_rec.m:
&lt;br&gt;compiler/opt_debug.m:
&lt;br&gt;compiler/opt_util.m:
&lt;br&gt;compiler/reassign.m:
&lt;br&gt;compiler/use_local_vars.m:
&lt;br&gt;compiler/var_locn.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; Conform to changes in llds.m
&lt;br&gt;&amp;nbsp; &amp;nbsp; In some cases code has been re-factored to factor out code common to a
&lt;br&gt;&amp;nbsp; &amp;nbsp; number of switch arms.
&lt;br&gt;&lt;br&gt;Index: compiler/code_util.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/code_util.m,v
&lt;br&gt;retrieving revision 1.186
&lt;br&gt;diff -u -p -b -r1.186 code_util.m
&lt;br&gt;--- compiler/code_util.m	30 Oct 2009 03:33:12 -0000	1.186
&lt;br&gt;+++ compiler/code_util.m	20 Nov 2009 10:30:53 -0000
&lt;br&gt;@@ -383,6 +383,7 @@ lvals_in_lval(global_var_ref(_)) = [].
&lt;br&gt;&amp;nbsp;:- func lvals_in_mem_ref(mem_ref) = list(lval).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;lvals_in_mem_ref(stackvar_ref(Rval)) = lvals_in_rval(Rval).
&lt;br&gt;+lvals_in_mem_ref(parent_stackvar_ref(Rval)) = lvals_in_rval(Rval).
&lt;br&gt;&amp;nbsp;lvals_in_mem_ref(framevar_ref(Rval)) = lvals_in_rval(Rval).
&lt;br&gt;&amp;nbsp;lvals_in_mem_ref(heap_ref(Rval1, _, Rval2)) =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;lvals_in_rval(Rval1) ++ lvals_in_rval(Rval2).
&lt;br&gt;Index: compiler/dupelim.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/dupelim.m,v
&lt;br&gt;retrieving revision 1.94
&lt;br&gt;diff -u -p -b -r1.94 dupelim.m
&lt;br&gt;--- compiler/dupelim.m	21 Oct 2009 06:36:18 -0000	1.94
&lt;br&gt;+++ compiler/dupelim.m	22 Nov 2009 00:19:54 -0000
&lt;br&gt;@@ -425,10 +425,6 @@ standardize_instr(Instr0, Instr) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;standardize_lval(Lval0, Lval),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = init_sync_term(Lval, N)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr0 = join_and_continue(Lval0, Label),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;standardize_lval(Lval0, Lval),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Lval, Label)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( Instr0 = comment(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = livevals(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = block(_, _, _)
&lt;br&gt;@@ -447,6 +443,7 @@ standardize_instr(Instr0, Instr) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = decr_sp_and_return(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = fork_new_child(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = foreign_proc_code(_, _, _, _, _, _, _, _, _, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = Instr0
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;@@ -836,7 +833,7 @@ most_specific_instr(InstrA, InstrB, Mayb
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; InstrA = foreign_proc_code(_, _, _, _, _, _, _, _, _, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; InstrA = fork_new_child(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; InstrA = init_sync_term(_, _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; InstrA = join_and_continue(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; InstrA = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( InstrA = InstrB -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInstr = yes(InstrA)
&lt;br&gt;Index: compiler/dupproc.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/dupproc.m,v
&lt;br&gt;retrieving revision 1.25
&lt;br&gt;diff -u -p -b -r1.25 dupproc.m
&lt;br&gt;--- compiler/dupproc.m	21 Oct 2009 06:36:18 -0000	1.25
&lt;br&gt;+++ compiler/dupproc.m	22 Nov 2009 00:20:38 -0000
&lt;br&gt;@@ -226,9 +226,9 @@ standardize_instr(Instr, StdInstr, DupPr
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;standardize_label(Child, StdChild, DupProcMap),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StdInstr = fork_new_child(Lval, StdChild)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Lval, Label),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;standardize_label(Label, StdLabel, DupProcMap),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StdInstr = join_and_continue(Lval, StdLabel)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StdInstr = join_and_continue(StdLabel)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The labels occurring in foreign_proc_code instructions
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% cannot be substituted.
&lt;br&gt;Index: compiler/exprn_aux.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/exprn_aux.m,v
&lt;br&gt;retrieving revision 1.90
&lt;br&gt;diff -u -p -b -r1.90 exprn_aux.m
&lt;br&gt;--- compiler/exprn_aux.m	30 Oct 2009 03:33:13 -0000	1.90
&lt;br&gt;+++ compiler/exprn_aux.m	22 Nov 2009 00:21:31 -0000
&lt;br&gt;@@ -234,6 +234,8 @@ vars_in_lval(lvar(Var), [Var]).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;vars_in_mem_ref(stackvar_ref(Rval), Vars) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;vars_in_rval(Rval, Vars).
&lt;br&gt;+vars_in_mem_ref(parent_stackvar_ref(Rval), Vars) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;vars_in_rval(Rval, Vars).
&lt;br&gt;&amp;nbsp;vars_in_mem_ref(framevar_ref(Rval), Vars) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;vars_in_rval(Rval, Vars).
&lt;br&gt;&amp;nbsp;vars_in_mem_ref(heap_ref(BaseRval, _Tag, FieldRval), BaseVars ++ FieldVars) :-
&lt;br&gt;@@ -263,6 +265,7 @@ transform_lval_in_uinstr(Transform, Uins
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = decr_sp(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = decr_sp_and_return(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = fork_new_child(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = Uinstr0
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;@@ -404,10 +407,6 @@ transform_lval_in_uinstr(Transform, Uins
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = init_sync_term(Lval0, BranchCount),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Transform(Lval0, Lval, !Acc),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = init_sync_term(Lval, BranchCount)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(Lval0, Label),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Transform(Lval0, Lval, !Acc),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(Lval, Label)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- pred transform_lval_in_component(transform_lval(T)::in(transform_lval),
&lt;br&gt;@@ -514,6 +513,10 @@ transform_lval_in_mem_ref(Transform, Mem
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;transform_lval_in_rval(Transform, Rval0, Rval, !Acc),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = stackvar_ref(Rval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = parent_stackvar_ref(Rval0),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;transform_lval_in_rval(Transform, Rval0, Rval, !Acc),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = parent_stackvar_ref(Rval)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = framevar_ref(Rval0),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;transform_lval_in_rval(Transform, Rval0, Rval, !Acc),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = framevar_ref(Rval)
&lt;br&gt;@@ -643,6 +646,9 @@ substitute_rval_in_mem_ref(OldRval, NewR
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = stackvar_ref(N),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = stackvar_ref(N)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = parent_stackvar_ref(N),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = parent_stackvar_ref(N)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = framevar_ref(N),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = framevar_ref(N)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;@@ -870,6 +876,7 @@ lval_list_addrs([Lval | Lvals], CodeAddr
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;list(code_addr)::out, list(data_id)::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;mem_ref_addrs(stackvar_ref(_SlotNum), [], []).
&lt;br&gt;+mem_ref_addrs(parent_stackvar_ref(_SlotNum), [], []).
&lt;br&gt;&amp;nbsp;mem_ref_addrs(framevar_ref(_SlotNum), [], []).
&lt;br&gt;&amp;nbsp;mem_ref_addrs(heap_ref(Rval, _Tag, _FieldNum), CodeAddrs, DataIds) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rval_addrs(Rval, CodeAddrs, DataIds).
&lt;br&gt;Index: compiler/global_data.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/global_data.m,v
&lt;br&gt;retrieving revision 1.43
&lt;br&gt;diff -u -p -b -r1.43 global_data.m
&lt;br&gt;--- compiler/global_data.m	30 Oct 2009 03:33:13 -0000	1.43
&lt;br&gt;+++ compiler/global_data.m	22 Nov 2009 00:22:11 -0000
&lt;br&gt;@@ -1020,10 +1020,6 @@ remap_instr(Remap, Instr0, Instr) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;remap_lval(Remap, Lval0, Lval),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = init_sync_term(Lval, NumJoins)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr0 = join_and_continue(Lval0, Label),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;remap_lval(Remap, Lval0, Lval),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Lval, Label)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( Instr0 = comment(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = livevals(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = llcall(_, _, _, _, _, _)
&lt;br&gt;@@ -1037,6 +1033,7 @@ remap_instr(Remap, Instr0, Instr) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = decr_sp(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = decr_sp_and_return(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = fork_new_child(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Instr0 = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = Instr0
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;@@ -1196,6 +1193,7 @@ remap_rval_const(Remap, Const0, Const) :
&lt;br&gt;&amp;nbsp;remap_mem_ref(Remap, MemRef0, MemRef) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MemRef0 = stackvar_ref(_)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef0 = parent_stackvar_ref(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef0 = framevar_ref(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = MemRef0
&lt;br&gt;Index: compiler/jumpopt.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/jumpopt.m,v
&lt;br&gt;retrieving revision 1.112
&lt;br&gt;diff -u -p -b -r1.112 jumpopt.m
&lt;br&gt;--- compiler/jumpopt.m	21 Oct 2009 06:36:19 -0000	1.112
&lt;br&gt;+++ compiler/jumpopt.m	22 Nov 2009 00:23:22 -0000
&lt;br&gt;@@ -798,12 +798,12 @@ jump_opt_instr_list([Instr0 | Instrs0], 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NewRemain = specified([Instr], Instrs0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(SyncTerm, Label0),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(Label0),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;short_label(Instrmap, Label0, Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( Label = Label0 -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NewRemain = usual_case
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(SyncTerm, Label),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Comment = Comment0 ++ &amp;quot; (redirect)&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = llds_instr(Uinstr, Comment),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NewRemain = specified([Instr], Instrs0)
&lt;br&gt;Index: compiler/livemap.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/livemap.m,v
&lt;br&gt;retrieving revision 1.93
&lt;br&gt;diff -u -p -b -r1.93 livemap.m
&lt;br&gt;--- compiler/livemap.m	21 Oct 2009 06:36:19 -0000	1.93
&lt;br&gt;+++ compiler/livemap.m	22 Nov 2009 00:27:54 -0000
&lt;br&gt;@@ -350,7 +350,7 @@ livemap_do_build_instr(Instr0, !Instrs, 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = fork_new_child(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = arbitrary_c_code(AffectsLiveness, LiveLvalInfo, Code),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;build_live_lval_info(AffectsLiveness, LiveLvalInfo, Code,
&lt;br&gt;@@ -523,6 +523,8 @@ make_live_in_rval(mem_addr(MemRef), !Liv
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;make_live_in_mem_ref(stackvar_ref(Rval), !Live) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;make_live_in_rval(Rval, !Live).
&lt;br&gt;+make_live_in_mem_ref(parent_stackvar_ref(Rval), !Live) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;make_live_in_rval(Rval, !Live).
&lt;br&gt;&amp;nbsp;make_live_in_mem_ref(framevar_ref(Rval), !Live) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;make_live_in_rval(Rval, !Live).
&lt;br&gt;&amp;nbsp;make_live_in_mem_ref(heap_ref(Rval1, _, Rval2), !Live) :-
&lt;br&gt;Index: compiler/llds.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/llds.m,v
&lt;br&gt;retrieving revision 1.365
&lt;br&gt;diff -u -p -b -r1.365 llds.m
&lt;br&gt;--- compiler/llds.m	30 Oct 2009 03:33:14 -0000	1.365
&lt;br&gt;+++ compiler/llds.m	22 Nov 2009 10:33:18 -0000
&lt;br&gt;@@ -621,13 +621,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% the synchronisation term. Control continues at the next
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% instruction.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; join_and_continue(lval, label).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; join_and_continue(label).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Signal that this thread of execution has finished in the current
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% parallel conjunct. For details of how we at the end of a parallel
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% conjunct see runtime/mercury_context.{c,h}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The synchronisation term is specified by the given lval.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The label gives the address of the code following the parallel
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% conjunction. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% conjunct see runtime/mercury_context.{c,h}. &amp;nbsp;The value in MR_r1
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% points to The synchronisation term. &amp;nbsp;The label gives the address
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% of the code following the parallel conjunction. &amp;nbsp;The
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% MR_join_and_continue macro loads the address of the label into
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% MR_succip before jumping to the implementation of
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% MR_do_join_and_continue. 
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- type stack_incr_kind
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;stack_incr_leaf &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; % The incr_sp creates the stack frame
&lt;br&gt;@@ -1129,8 +1131,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% stack.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- type mem_ref
&lt;br&gt;- &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;stackvar_ref(rval) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Stack slot number.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; framevar_ref(rval) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Stack slot number.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;stackvar_ref(rval) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Det stack slot number.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; parent_stackvar_ref(rval) &amp;nbsp; % Parent's det stack slot number.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; framevar_ref(rval) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Nondet stack slot number.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; heap_ref(rval, int, rval). &amp;nbsp;% The cell pointer, the tag to
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% subtract, and the field number.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;Index: compiler/llds_out_data.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/llds_out_data.m,v
&lt;br&gt;retrieving revision 1.1
&lt;br&gt;diff -u -p -b -r1.1 llds_out_data.m
&lt;br&gt;--- compiler/llds_out_data.m	4 Nov 2009 03:44:48 -0000	1.1
&lt;br&gt;+++ compiler/llds_out_data.m	20 Nov 2009 10:52:12 -0000
&lt;br&gt;@@ -756,6 +756,7 @@ output_record_mem_ref_decls_format(Info,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!N, !DeclSet, !IO) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MemRef = stackvar_ref(Rval)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef = parent_stackvar_ref(Rval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef = framevar_ref(Rval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_record_rval_decls_format(Info, Rval,
&lt;br&gt;@@ -957,18 +958,16 @@ output_rval(Info, Rval, !IO) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Rval = mem_addr(MemRef),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = stackvar_ref(SubRval),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;&amp;MR_sv(&amp;quot;, !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Don't clutter the output with unnecessary casts.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( SubRval = const(llconst_int(SlotNum)) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_int(SlotNum, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;&amp;MR_sv(&amp;quot;, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_rval_as_type(Info, SubRval, lt_integer, !IO)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;)&amp;quot;, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = parent_stackvar_ref(SubRval),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;&amp;MR_parent_sv(&amp;quot;, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = framevar_ref(SubRval),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;&amp;MR_fv(&amp;quot;, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;&amp;MR_fv(&amp;quot;, !IO)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Don't clutter the output with unnecessary casts.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( SubRval = const(llconst_int(SlotNum)) -&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_int(SlotNum, !IO)
&lt;br&gt;Index: compiler/llds_out_file.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/llds_out_file.m,v
&lt;br&gt;retrieving revision 1.1
&lt;br&gt;diff -u -p -b -r1.1 llds_out_file.m
&lt;br&gt;--- compiler/llds_out_file.m	4 Nov 2009 03:44:48 -0000	1.1
&lt;br&gt;+++ compiler/llds_out_file.m	22 Nov 2009 00:28:30 -0000
&lt;br&gt;@@ -1134,7 +1134,7 @@ find_cont_labels([Instr | Instrs], !Cont
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = mkframe(_, yes(code_label(ContLabel)))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(_, ContLabel)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(ContLabel)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = assign(redoip_slot(_), const(Const)),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Const = llconst_code_addr(code_label(ContLabel))
&lt;br&gt;Index: compiler/llds_out_instr.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/llds_out_instr.m,v
&lt;br&gt;retrieving revision 1.1
&lt;br&gt;diff -u -p -b -r1.1 llds_out_instr.m
&lt;br&gt;--- compiler/llds_out_instr.m	4 Nov 2009 03:44:48 -0000	1.1
&lt;br&gt;+++ compiler/llds_out_instr.m	22 Nov 2009 00:38:03 -0000
&lt;br&gt;@@ -233,8 +233,7 @@ output_record_instr_decls(Info, Instr, !
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_record_lval_decls(Info, Lval, !DeclSet, !IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_record_code_addr_decls(Info, code_label(Child), !DeclSet, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Lval, Label),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_record_lval_decls(Info, Lval, !DeclSet, !IO),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_record_code_addr_decls(Info, code_label(Label), !DeclSet, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -905,10 +904,8 @@ output_instruction(Info, Instr, ProfInfo
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_label_as_code_addr(Child, !IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;);\n&amp;quot;, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Lval, Label),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;\tMR_join_and_continue(&amp;quot;, !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_lval(Info, Lval, !IO),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;, &amp;quot;, !IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output_label_as_code_addr(Label, !IO),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;io.write_string(&amp;quot;);\n&amp;quot;, !IO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;Index: compiler/llds_to_x86_64.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/llds_to_x86_64.m,v
&lt;br&gt;retrieving revision 1.13
&lt;br&gt;diff -u -p -b -r1.13 llds_to_x86_64.m
&lt;br&gt;--- compiler/llds_to_x86_64.m	4 Nov 2009 03:44:48 -0000	1.13
&lt;br&gt;+++ compiler/llds_to_x86_64.m	22 Nov 2009 00:29:49 -0000
&lt;br&gt;@@ -438,7 +438,7 @@ instr_to_x86_64(!RegMap, init_sync_term(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = [x86_64_comment(&amp;quot;&amp;lt;&amp;lt;init_sync_term&amp;gt;&amp;gt;&amp;quot;)].
&lt;br&gt;&amp;nbsp;instr_to_x86_64(!RegMap, fork_new_child(_, _), Instr) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = [x86_64_comment(&amp;quot;&amp;lt;&amp;lt;fork_new_child&amp;gt;&amp;gt;&amp;quot;)].
&lt;br&gt;-instr_to_x86_64(!RegMap, join_and_continue(_, _), Instr) :-
&lt;br&gt;+instr_to_x86_64(!RegMap, join_and_continue(_), Instr) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = [x86_64_comment(&amp;quot;&amp;lt;&amp;lt;join_and_continue&amp;gt;&amp;gt;&amp;quot;)].
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Transform lval into either an x86_64 operand or x86_64 instructions.
&lt;br&gt;@@ -700,6 +700,8 @@ transform_rval(!RegMap, binop(Op, Rval1,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;&amp;nbsp;transform_rval(!RegMap, mem_addr(stackvar_ref(Rval)), Op, no) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;transform_rval(!RegMap, Rval, Op, _).
&lt;br&gt;+transform_rval(!RegMap, mem_addr(parent_stackvar_ref(Rval)), Op, no) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;transform_rval(!RegMap, Rval, Op, _).
&lt;br&gt;&amp;nbsp;transform_rval(!RegMap, mem_addr(framevar_ref(Rval)), Op, no) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;transform_rval(!RegMap, Rval, Op, _).
&lt;br&gt;&amp;nbsp;transform_rval(!RegMap, mem_addr(heap_ref(Rval1, Tag, Rval2)), no, Instrs) :-
&lt;br&gt;Index: compiler/middle_rec.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/middle_rec.m,v
&lt;br&gt;retrieving revision 1.139
&lt;br&gt;diff -u -p -b -r1.139 middle_rec.m
&lt;br&gt;--- compiler/middle_rec.m	21 Oct 2009 06:36:20 -0000	1.139
&lt;br&gt;+++ compiler/middle_rec.m	22 Nov 2009 00:33:02 -0000
&lt;br&gt;@@ -529,6 +529,7 @@ find_used_registers_instr(Uinstr, !Used)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = incr_sp(_, _, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = decr_sp(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = decr_sp_and_return(_)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = livevals(LvalSet),
&lt;br&gt;@@ -595,7 +596,6 @@ find_used_registers_instr(Uinstr, !Used)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = mark_ticket_stack(Lval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = init_sync_term(Lval, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = fork_new_child(Lval, _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = join_and_continue(Lval, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;find_used_registers_lval(Lval, !Used)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;@@ -676,6 +676,8 @@ find_used_registers_rval(Rval, !Used) :-
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;find_used_registers_mem_ref(stackvar_ref(Rval), !Used) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;find_used_registers_rval(Rval, !Used).
&lt;br&gt;+find_used_registers_mem_ref(parent_stackvar_ref(Rval), !Used) :-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;find_used_registers_rval(Rval, !Used).
&lt;br&gt;&amp;nbsp;find_used_registers_mem_ref(framevar_ref(Rval), !Used) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;find_used_registers_rval(Rval, !Used).
&lt;br&gt;&amp;nbsp;find_used_registers_mem_ref(heap_ref(Rval1, _, Rval2), !Used) :-
&lt;br&gt;Index: compiler/opt_debug.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/opt_debug.m,v
&lt;br&gt;retrieving revision 1.214
&lt;br&gt;diff -u -p -b -r1.214 opt_debug.m
&lt;br&gt;--- compiler/opt_debug.m	4 Nov 2009 03:44:49 -0000	1.214
&lt;br&gt;+++ compiler/opt_debug.m	22 Nov 2009 00:24:23 -0000
&lt;br&gt;@@ -354,6 +354,8 @@ dump_rvals(MaybeProcLabel, [Rval | Rvals
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;dump_mem_ref(MaybeProcLabel, stackvar_ref(N)) =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;stackvar_ref(&amp;quot; ++ dump_rval(MaybeProcLabel, N) ++ &amp;quot;)&amp;quot;.
&lt;br&gt;+dump_mem_ref(MaybeProcLabel, parent_stackvar_ref(N)) =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;quot;parent_stackvar_ref(&amp;quot; ++ dump_rval(MaybeProcLabel, N) ++ &amp;quot;)&amp;quot;.
&lt;br&gt;&amp;nbsp;dump_mem_ref(MaybeProcLabel, framevar_ref(N)) =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;framevar_ref(&amp;quot; ++ dump_rval(MaybeProcLabel, N) ++ &amp;quot;)&amp;quot;.
&lt;br&gt;&amp;nbsp;dump_mem_ref(MaybeProcLabel, heap_ref(R, T, N)) =
&lt;br&gt;@@ -1027,9 +1029,8 @@ dump_instr(MaybeProcLabel, AutoComments,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Str = &amp;quot;fork_new_child(&amp;quot; ++ dump_lval(MaybeProcLabel, Lval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;++ dump_label(MaybeProcLabel, Child) ++ &amp;quot;, &amp;quot; ++ &amp;quot;)&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Lval, Label),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Str = &amp;quot;join_and_continue(&amp;quot; ++ dump_lval(MaybeProcLabel, Lval) ++ &amp;quot;, &amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;++ dump_label(MaybeProcLabel, Label) ++ &amp;quot;)&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = join_and_continue(Label),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Str = &amp;quot;join_and_continue(&amp;quot; ++ dump_label(MaybeProcLabel, Label) ++ &amp;quot;)&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instr = foreign_proc_code(Decls, Comps, MCM, MFNL, MFL, MFOL, MNF, MDL,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SSR, MD),
&lt;br&gt;Index: compiler/opt_util.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/opt_util.m,v
&lt;br&gt;retrieving revision 1.171
&lt;br&gt;diff -u -p -b -r1.171 opt_util.m
&lt;br&gt;--- compiler/opt_util.m	21 Oct 2009 06:36:21 -0000	1.171
&lt;br&gt;+++ compiler/opt_util.m	22 Nov 2009 10:35:36 -0000
&lt;br&gt;@@ -736,6 +736,7 @@ lval_refers_stackvars(global_var_ref(_))
&lt;br&gt;&amp;nbsp;:- func mem_ref_refers_stackvars(mem_ref) = bool.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;mem_ref_refers_stackvars(stackvar_ref(_)) = yes.
&lt;br&gt;+mem_ref_refers_stackvars(parent_stackvar_ref(_)) = yes.
&lt;br&gt;&amp;nbsp;mem_ref_refers_stackvars(framevar_ref(_)) = yes.
&lt;br&gt;&amp;nbsp;mem_ref_refers_stackvars(heap_ref(Rval1, _, Rval2)) =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;bool.or(rval_refers_stackvars(Rval1), rval_refers_stackvars(Rval2)).
&lt;br&gt;@@ -887,7 +888,7 @@ instr_refers_to_stack(llds_instr(Uinstr,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = decr_sp_and_return(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = init_sync_term(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = fork_new_child(_, _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = join_and_continue(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Refers = yes
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;@@ -1111,7 +1112,7 @@ can_instr_branch_away(decr_sp(_)) = no.
&lt;br&gt;&amp;nbsp;can_instr_branch_away(decr_sp_and_return(_)) = yes.
&lt;br&gt;&amp;nbsp;can_instr_branch_away(init_sync_term(_, _)) = no.
&lt;br&gt;&amp;nbsp;can_instr_branch_away(fork_new_child(_, _)) = no.
&lt;br&gt;-can_instr_branch_away(join_and_continue(_, _)) = yes.
&lt;br&gt;+can_instr_branch_away(join_and_continue(_)) = yes.
&lt;br&gt;&amp;nbsp;can_instr_branch_away(foreign_proc_code(_, Comps, _, _, _, _, _, _, _, _)) =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;can_components_branch_away(Comps).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -1190,7 +1191,7 @@ can_instr_fall_through(decr_sp(_)) = yes
&lt;br&gt;&amp;nbsp;can_instr_fall_through(decr_sp_and_return(_)) = no.
&lt;br&gt;&amp;nbsp;can_instr_fall_through(init_sync_term(_, _)) = yes.
&lt;br&gt;&amp;nbsp;can_instr_fall_through(fork_new_child(_, _)) = yes.
&lt;br&gt;-can_instr_fall_through(join_and_continue(_, _)) = no.
&lt;br&gt;+can_instr_fall_through(join_and_continue(_)) = no.
&lt;br&gt;&amp;nbsp;can_instr_fall_through(foreign_proc_code(_, _, _, _, _, _, _, _, _, _)) = yes.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Check whether an instruction sequence can possibly fall through
&lt;br&gt;@@ -1241,7 +1242,9 @@ can_use_livevals(decr_sp(_), no).
&lt;br&gt;&amp;nbsp;can_use_livevals(decr_sp_and_return(_), yes).
&lt;br&gt;&amp;nbsp;can_use_livevals(init_sync_term(_, _), no).
&lt;br&gt;&amp;nbsp;can_use_livevals(fork_new_child(_, _), no).
&lt;br&gt;-can_use_livevals(join_and_continue(_, _), no).
&lt;br&gt;+% XXX: Is the synchronization term (now in R1) a liveval?, I don't want the
&lt;br&gt;+% move to be optimized away. -pbone
&lt;br&gt;+can_use_livevals(join_and_continue(_), no).
&lt;br&gt;&amp;nbsp;can_use_livevals(foreign_proc_code(_, _, _, _, _, _, _, _, _, _), no).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;instr_labels(Instr, Labels, CodeAddrs) :-
&lt;br&gt;@@ -1314,7 +1317,7 @@ instr_labels_2(Uinstr, Labels, CodeAddrs
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Labels = [Child],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CodeAddrs = []
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(_, Label),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Labels = [Label],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CodeAddrs = []
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;@@ -1404,7 +1407,7 @@ possible_targets(Uinstr, Labels, CodeAdd
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX see the comment in instr_labels_2.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;possible_targets: decr_sp_and_return&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(_, Label),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(Label),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Labels = [Label],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CodeAddrs = []
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;@@ -1544,7 +1547,7 @@ instr_rvals_and_lvals(decr_sp(_), [], []
&lt;br&gt;&amp;nbsp;instr_rvals_and_lvals(decr_sp_and_return(_), [], []).
&lt;br&gt;&amp;nbsp;instr_rvals_and_lvals(init_sync_term(Lval, _), [], [Lval]).
&lt;br&gt;&amp;nbsp;instr_rvals_and_lvals(fork_new_child(Lval, _), [], [Lval]).
&lt;br&gt;-instr_rvals_and_lvals(join_and_continue(Lval, _), [], [Lval]).
&lt;br&gt;+instr_rvals_and_lvals(join_and_continue(_), [], []).
&lt;br&gt;&amp;nbsp;instr_rvals_and_lvals(foreign_proc_code(_, Cs, _, _, _, _, _, _, _, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Rvals, Lvals) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;foreign_proc_components_get_rvals_and_lvals(Cs, Rvals, Lvals).
&lt;br&gt;@@ -1724,8 +1727,7 @@ count_temps_instr(init_sync_term(Lval, _
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;count_temps_lval(Lval, !R, !F).
&lt;br&gt;&amp;nbsp;count_temps_instr(fork_new_child(Lval, _), !R, !F) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;count_temps_lval(Lval, !R, !F).
&lt;br&gt;-count_temps_instr(join_and_continue(Lval, _), !R, !F) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;count_temps_lval(Lval, !R, !F).
&lt;br&gt;+count_temps_instr(join_and_continue(_), !R, !F).
&lt;br&gt;&amp;nbsp;count_temps_instr(foreign_proc_code(_, Comps, _, _, _, _, _, _, _, _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!R, !F) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;count_temps_components(Comps, !R, !F).
&lt;br&gt;@@ -1855,6 +1857,7 @@ count_temps_rval(Rval, !R, !F) :-
&lt;br&gt;&amp;nbsp;count_temps_mem_ref(MemRef, !R, !F) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MemRef = stackvar_ref(Rval)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef = parent_stackvar_ref(Rval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef = framevar_ref(Rval)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;count_temps_rval(Rval, !R, !F)
&lt;br&gt;@@ -1933,7 +1936,7 @@ touches_nondet_ctrl_instr(Uinstr) = Touc
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = restore_maxfr(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = init_sync_term(_, _) &amp;nbsp; &amp;nbsp; % This is a safe approximation.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = fork_new_child(_, _) &amp;nbsp; &amp;nbsp; % This is a safe approximation.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = join_and_continue(_, _) &amp;nbsp;% This is a safe approximation.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr = join_and_continue(_) &amp;nbsp; &amp;nbsp; % This is a safe approximation.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Touch = yes
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;@@ -2064,6 +2067,7 @@ touches_nondet_ctrl_rval(mem_addr(MemRef
&lt;br&gt;&amp;nbsp;:- func touches_nondet_ctrl_mem_ref(mem_ref) = bool.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;touches_nondet_ctrl_mem_ref(stackvar_ref(_)) = no.
&lt;br&gt;+touches_nondet_ctrl_mem_ref(parent_stackvar_ref(_)) = no.
&lt;br&gt;&amp;nbsp;touches_nondet_ctrl_mem_ref(framevar_ref(_)) = no.
&lt;br&gt;&amp;nbsp;touches_nondet_ctrl_mem_ref(heap_ref(Rval, _, _)) =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;touches_nondet_ctrl_rval(Rval).
&lt;br&gt;@@ -2497,10 +2501,9 @@ replace_labels_instr(Uinstr0, Uinstr, Re
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replace_labels_label(Child0, Child, ReplMap),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = fork_new_child(Lval, Child)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(Lval0, Label0),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(Label0),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replace_labels_label(Label0, Label, ReplMap),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replace_labels_lval(Lval0, Lval, ReplMap),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(Lval, Label)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr = join_and_continue(Label)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = foreign_proc_code(Decls, Comps0, MayCallMercury,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeFix, MaybeLayout, MaybeOnlyLayout, MaybeSub0, MaybeDef,
&lt;br&gt;@@ -2693,6 +2696,7 @@ replace_labels_rval(Rval0, Rval, ReplMap
&lt;br&gt;&amp;nbsp;replace_labels_mem_ref(MemRef0, MemRef, ReplMap) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MemRef0 = stackvar_ref(_)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef0 = parent_stackvar_ref(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef0 = framevar_ref(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = MemRef0
&lt;br&gt;Index: compiler/par_conj_gen.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/par_conj_gen.m,v
&lt;br&gt;retrieving revision 1.40
&lt;br&gt;diff -u -p -b -r1.40 par_conj_gen.m
&lt;br&gt;--- compiler/par_conj_gen.m	3 Sep 2009 23:07:28 -0000	1.40
&lt;br&gt;+++ compiler/par_conj_gen.m	23 Nov 2009 03:05:41 -0000
&lt;br&gt;@@ -186,11 +186,11 @@ generate_par_conj(Goals, GoalInfo, CodeM
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The highest numbered slot has the lowest address.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.last(SyncTermSlots, SyncTermBaseSlotPrime),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SyncTermBaseSlotPrime = stackvar(SlotNum),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SyncTermBaseSlotPrime = stackvar(SlotNumPrime),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StackId = det_stack
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SyncTermBaseSlot = SyncTermBaseSlotPrime,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ParentSyncTermBaseSlot = parent_stackvar(SlotNum)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SlotNum = SlotNumPrime
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unexpected(this_file, &amp;quot;generate_par_conj&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;@@ -204,8 +204,8 @@ generate_par_conj(Goals, GoalInfo, CodeM
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set_par_conj_depth(Depth+1, !CI),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;get_next_label(EndLabel, !CI),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;clear_all_registers(no, !CI),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;generate_det_par_conj_2(Goals, ParentSyncTermBaseSlot, EndLabel, Initial,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;no, GoalCode, !CI),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;generate_det_par_conj_2(Goals, SlotNum, EndLabel, Initial, no, GoalCode,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!CI),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set_par_conj_depth(Depth, !CI),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;EndLabelCode = singleton(
&lt;br&gt;@@ -252,12 +252,12 @@ generate_par_conj(Goals, GoalInfo, CodeM
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;place_all_outputs(Outputs, !CI).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;:- pred generate_det_par_conj_2(list(hlds_goal)::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;lval::in, label::in, instmap::in, branch_end::in, llds_code::out,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int::in, label::in, instmap::in, branch_end::in, llds_code::out,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;code_info::in, code_info::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-generate_det_par_conj_2([], _ParentSyncTermBaseSlot, _EndLabel,
&lt;br&gt;+generate_det_par_conj_2([], _ParentSyncTermBaseSlotNum, _EndLabel,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_Initial, _, empty, !CI).
&lt;br&gt;-generate_det_par_conj_2([Goal | Goals], ParentSyncTermBaseSlot, EndLabel,
&lt;br&gt;+generate_det_par_conj_2([Goal | Goals], ParentSyncTermBaseSlotNum, EndLabel,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Initial, MaybeEnd0, Code, !CI) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;remember_position(!.CI, StartPos),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;code_gen.generate_goal(model_det, Goal, ThisGoalCode0, !CI),
&lt;br&gt;@@ -271,6 +271,18 @@ generate_det_par_conj_2([Goal | Goals], 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;generate_branch_end(StoreMap, MaybeEnd0, MaybeEnd, SaveCode0, !CI),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;replace_stack_vars_by_parent_sv(SaveCode0, SaveCode),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ParentSyncTermBaseSlot = parent_stackvar(ParentSyncTermBaseSlotNum),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;SyncTermPointer = mem_addr(parent_stackvar_ref(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const(llconst_int(ParentSyncTermBaseSlotNum)))),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% The move instruction clobbers MR_r1,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% The join_and_continue instruction clobbers MR_succip.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% XXX: How do I tell the low-level backend that I want to use these
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;% registers and arrange for anything important to be saved? -pbone
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;JoinInstructions = [
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;llds_instr(assign(reg(reg_r, 1), SyncTermPointer),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Put the address of the sync term in r1&amp;quot;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;llds_instr(join_and_continue(EndLabel),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Join after parallel execution&amp;quot;)],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Goals = [_ | _],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_next_label(NextConjunct, !CI),
&lt;br&gt;@@ -279,22 +291,17 @@ generate_det_par_conj_2([Goal | Goals], 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;llds_instr(fork_new_child(ParentSyncTermBaseSlot, NextConjunct),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;fork off a child&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JoinCode = from_list([
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;llds_instr(join_and_continue(ParentSyncTermBaseSlot, EndLabel),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;finish&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;llds_instr(label(NextConjunct),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;start of the next conjunct&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;])
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JoinCode = from_list( JoinInstructions ++ 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[llds_instr(label(NextConjunct),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;start of the next conjunct&amp;quot;)]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Goals = [],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ForkCode = empty,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JoinCode = singleton(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;llds_instr(join_and_continue(ParentSyncTermBaseSlot, EndLabel),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;finish&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JoinCode = from_list(JoinInstructions)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ThisCode = ForkCode ++ ThisGoalCode ++ SaveCode ++ JoinCode,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;generate_det_par_conj_2(Goals, ParentSyncTermBaseSlot, EndLabel, Initial,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;generate_det_par_conj_2(Goals, ParentSyncTermBaseSlotNum, EndLabel, Initial,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEnd, RestCode, !CI),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Code = ThisCode ++ RestCode.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;Index: compiler/reassign.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/reassign.m,v
&lt;br&gt;retrieving revision 1.30
&lt;br&gt;diff -u -p -b -r1.30 reassign.m
&lt;br&gt;--- compiler/reassign.m	21 Oct 2009 06:36:21 -0000	1.30
&lt;br&gt;+++ compiler/reassign.m	22 Nov 2009 00:24:53 -0000
&lt;br&gt;@@ -320,7 +320,7 @@ remove_reassign_loop([Instr0 | Instrs0],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:KnownContentsMap = map.init,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:DepLvalMap = map.init
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(_, _),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uinstr0 = join_and_continue(_),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:RevInstrs = [Instr0 | !.RevInstrs],
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Other threads may modify any lval.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:KnownContentsMap = map.init,
&lt;br&gt;Index: compiler/use_local_vars.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/use_local_vars.m,v
&lt;br&gt;retrieving revision 1.40
&lt;br&gt;diff -u -p -b -r1.40 use_local_vars.m
&lt;br&gt;--- compiler/use_local_vars.m	21 Oct 2009 06:36:22 -0000	1.40
&lt;br&gt;+++ compiler/use_local_vars.m	22 Nov 2009 00:25:11 -0000
&lt;br&gt;@@ -690,7 +690,7 @@ substitute_lval_in_instr_until_defn_2(Ol
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = decr_sp_and_return(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = init_sync_term(_, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = fork_new_child(_, _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = join_and_continue(_, _)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = join_and_continue(_)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Uinstr0 = arbitrary_c_code(_, _, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;Index: compiler/var_locn.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/compiler/var_locn.m,v
&lt;br&gt;retrieving revision 1.68
&lt;br&gt;diff -u -p -b -r1.68 var_locn.m
&lt;br&gt;--- compiler/var_locn.m	2 Sep 2009 00:30:24 -0000	1.68
&lt;br&gt;+++ compiler/var_locn.m	20 Nov 2009 21:52:41 -0000
&lt;br&gt;@@ -2270,11 +2270,9 @@ var_locn_materialize_vars_in_rval_avoid(
&lt;br&gt;&amp;nbsp;var_locn_materialize_vars_in_mem_ref_avoid(ModuleInfo, MemRef0, MemRef, Avoid,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Code, !VLI) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = stackvar_ref(_),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = MemRef0,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Code = empty
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef0 = framevar_ref(_),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( MemRef0 = stackvar_ref(_)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef0 = parent_stackvar_ref(_)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; MemRef0 = framevar_ref(_) ),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MemRef = MemRef0,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Code = empty
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;Index: runtime/mercury_context.c
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/runtime/mercury_context.c,v
&lt;br&gt;retrieving revision 1.70
&lt;br&gt;diff -u -p -b -r1.70 mercury_context.c
&lt;br&gt;--- runtime/mercury_context.c	6 Nov 2009 05:40:24 -0000	1.70
&lt;br&gt;+++ runtime/mercury_context.c	23 Nov 2009 02:56:02 -0000
&lt;br&gt;@@ -811,9 +811,10 @@ MR_schedule_spark_globally(const MR_Spar
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifndef MR_HIGHLEVEL_CODE
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;MR_define_extern_entry(MR_do_runnext);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-MR_BEGIN_MODULE(scheduler_module)
&lt;br&gt;+MR_BEGIN_MODULE(scheduler_module_do_runnext)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;MR_init_entry_an(MR_do_runnext);
&lt;br&gt;&amp;nbsp;MR_BEGIN_CODE
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -983,6 +984,133 @@ MR_define_entry(MR_do_runnext);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MR_END_MODULE
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#if defined(MR_THREAD_SAFE) &amp;&amp; defined(MR_LL_PARALLEL_CONJ) 
&lt;br&gt;+MR_define_extern_entry(MR_do_join_and_continue);
&lt;br&gt;+
&lt;br&gt;+MR_BEGIN_MODULE(scheduler_module_do_join_and_continue)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MR_init_entry_an(MR_do_join_and_continue);
&lt;br&gt;+MR_BEGIN_CODE
&lt;br&gt;+
&lt;br&gt;+MR_define_entry(MR_do_join_and_continue);
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MR_SyncTerm *jnc_st = (MR_SyncTerm *) MR_r1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if (!jnc_st-&amp;gt;MR_st_is_shared) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction has only executed sequentially. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** It has finished executing, continue execution from the join
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** label.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_proceed();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** It has not finished executing. &amp;nbsp;Try to finish it by executing
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** our sparks.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This code was formerly MR_join_and_continue_1() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jnc_spark.MR_spark_resume);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** Someone's stolen our sparks, we should try to execute
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** something that's been scheduled globally.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction may be executing in parallel. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_LOCK(&amp;MR_sync_term_lock, &amp;quot;continue&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction has finished. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (MR_ENGINE(MR_eng_this_context) == jnc_st-&amp;gt;MR_st_orig_context) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context originated this parallel conjunction and all
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** the branches have finished so jump to the join label.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue i&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_proceed();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context didn't originate this parallel conjunction and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** we're the last branch to finish. &amp;nbsp;The originating context
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** should be suspended waiting for us to finish, so wake it up.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_st-&amp;gt;MR_st_orig_context-&amp;gt;MR_ctxt_resume = (MR_Code*)MR_succip;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_schedule_context(jnc_st-&amp;gt;MR_st_orig_context);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue ii&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The parallel conjunction is being executed in parallel but it is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** not yet finished. &amp;nbsp;This code was Formerly
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** MR_join_and_continue_2() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped &amp;&amp; (jnc_spark.MR_spark_parent_sp == MR_parent_sp)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark at the top of the stack is from to the same parallel
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** conjunction that we've just been executing. We can immediately
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** execute the next branch of the same parallel conjunction in
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** the current context.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 i&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jnc_spark.MR_spark_resume);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark stack is empty or the next spark is from a different
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction to the one we've been executing. &amp;nbsp;Either
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** way, there's nothing more we can do with this context right
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** now. &amp;nbsp;Put back the spark we won't be using.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_wsdeque_putback_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** If this context originated the parallel conjunction we've been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** executing, the rest of the parallel conjunction must have been
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** put on the global spark queue to be executed in other
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** contexts. &amp;nbsp;This context will need to be resumed once the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction is completed, so suspend the context.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** What if the other conjuncts where put on the global queue
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** but haven't yet been taken by other threads? &amp;nbsp;Then this step
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** is redundant. &amp;nbsp;It's not worth fixing, this problem will go
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** away once we enable work-stealing. - pbone. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_ctxt == jnc_st-&amp;gt;MR_st_orig_context) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_save_context(jnc_ctxt);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_ENGINE(MR_eng_this_context) = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Finally look for other work. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 ii&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;+MR_END_MODULE
&lt;br&gt;+
&lt;br&gt;+#endif /* defined(MR_THREAD_SAFE) &amp;&amp; defined(MR_LL_PARALLEL_CONJ) */ 
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#endif /* !MR_HIGHLEVEL_CODE */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifdef MR_LL_PARALLEL_CONJ
&lt;br&gt;@@ -1051,7 +1179,10 @@ void mercury_sys_init_scheduler_wrapper_
&lt;br&gt;&amp;nbsp;void mercury_sys_init_scheduler_wrapper_init(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;#ifndef MR_HIGHLEVEL_CODE
&lt;br&gt;- &amp;nbsp; &amp;nbsp;scheduler_module();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;scheduler_module_do_runnext();
&lt;br&gt;+#if defined(MR_THREAD_SAFE) &amp;&amp; defined(MR_LL_PARALLEL_CONJ) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;scheduler_module_do_join_and_continue();
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;Index: runtime/mercury_context.h
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury1/repository/mercury/runtime/mercury_context.h,v
&lt;br&gt;retrieving revision 1.55
&lt;br&gt;diff -u -p -b -r1.55 mercury_context.h
&lt;br&gt;--- runtime/mercury_context.h	17 Nov 2009 06:30:26 -0000	1.55
&lt;br&gt;+++ runtime/mercury_context.h	22 Nov 2009 06:33:40 -0000
&lt;br&gt;@@ -811,111 +811,19 @@ extern &amp;nbsp;void &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_schedule_context(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_inc_int(&amp;MR_num_outstanding_contexts_and_all_sparks); &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;#define MR_join_and_continue(sync_term, join_label) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp;do { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_SyncTerm *jnc_st = (MR_SyncTerm *) &amp;sync_term; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!jnc_st-&amp;gt;MR_st_is_shared) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction has only executed sequentially. */ &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(join_label); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_join_and_continue_1(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* This parallel conjunction may be executing in parallel. */ &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_LOCK(&amp;MR_sync_term_lock, &amp;quot;continue&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (--jnc_st-&amp;gt;MR_st_count == 0) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (MR_ENGINE(MR_eng_this_context) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;== jnc_st-&amp;gt;MR_st_orig_context) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context originated this parallel conjunction and &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** all the branches have finished so jump to the join &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** label. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue i&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(join_label); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** This context didn't originate this parallel &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** conjunction and we're the last branch to finish. &amp;nbsp;The &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** originating context should be suspended waiting for us \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** to finish, so wake it up. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_st-&amp;gt;MR_st_orig_context-&amp;gt;MR_ctxt_resume = join_label; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_schedule_context(jnc_st-&amp;gt;MR_st_orig_context); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue ii&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_join_and_continue_2(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp;#define MR_join_and_continue_1() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp;do { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque, &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks); &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jnc_spark.MR_spark_resume); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp;#define MR_join_and_continue_2() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp;/*
&lt;br&gt;+ &amp;nbsp;** At the end of a parallel conjunct this is called, depending on which
&lt;br&gt;+ &amp;nbsp;** context calls this the context may block, jump to the join label or look
&lt;br&gt;+ &amp;nbsp;** for other parallel work.
&lt;br&gt;+ &amp;nbsp;** The arguments are:
&lt;br&gt;+ &amp;nbsp;** MR_r1 - sync term pointer.
&lt;br&gt;+ &amp;nbsp;** MR_succip - join label.
&lt;br&gt;+ &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp;MR_declare_entry(MR_do_join_and_continue);
&lt;br&gt;+ &amp;nbsp;#define MR_join_and_continue(label) \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;do { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Context &amp;nbsp;*jnc_ctxt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_bool &amp;nbsp; &amp;nbsp; jnc_popped; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_Spark &amp;nbsp; &amp;nbsp;jnc_spark; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_ctxt = MR_ENGINE(MR_eng_this_context); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jnc_popped = MR_wsdeque_pop_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque, &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped &amp;&amp; (jnc_spark.MR_spark_parent_sp == MR_parent_sp)) { &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark at the top of the stack is due to the same parallel &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** conjunction that we've just been executing. We can immediately \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** execute the next branch of the same parallel conjunction in &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** the current context. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 i&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_atomic_dec_int(&amp;MR_num_outstanding_contexts_and_all_sparks); &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(jnc_spark.MR_spark_resume); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** The spark stack is empty or the next spark is from a different \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction to the one we've been executing. &amp;nbsp;Either &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** way, there's nothing more we can do with this context right &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** now. &amp;nbsp;Put back the spark we won't be using. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_popped) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_wsdeque_putback_bottom(&amp;jnc_ctxt-&amp;gt;MR_ctxt_spark_deque, &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;jnc_spark); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** If this context originated the parallel conjunction we've been \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** executing, the rest of the parallel conjunction must have been \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** put on the global spark queue to be executed in other &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** contexts. &amp;nbsp;This context will need to be resumed once the &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** parallel conjunction is completed, so suspend the context. &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (jnc_ctxt == jnc_st-&amp;gt;MR_st_orig_context) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_save_context(jnc_ctxt); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_ENGINE(MR_eng_this_context) = NULL; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Finally look for other work. */ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_UNLOCK(&amp;MR_sync_term_lock, &amp;quot;continue_2 ii&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_runnext(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_succip_word = label; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MR_GOTO(MR_ENTRY(MR_do_join_and_continue)); \
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} while (0)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;/* This needs to come after the definition of MR_SparkDeque_Struct. */
&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26472184/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/for-review%3A-Re-factor-the-MR_join_and_continue-macro.-tp26472184p26472184.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26472121</id>
	<title>Re: Large MR_join_and_continue() macros in runtime.</title>
	<published>2009-11-22T18:59:25Z</published>
	<updated>2009-11-22T18:59:25Z</updated>
	<author>
		<name>Paul Bone</name>
	</author>
	<content type="html">On Sat, Nov 21, 2009 at 07:49:10AM +1100, Zoltan Somogyi wrote:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 18-Nov-2009, Paul Bone &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26472121&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pbone@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; I've found myself modifying and maintaining the large MR_join_and_continue()
&lt;br&gt;&amp;gt; &amp;gt; macros in the runtime. &amp;nbsp;The C preprocessor language is very clumsy, and I'd
&lt;br&gt;&amp;gt; &amp;gt; rather write these as native C procedures.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; As you and Peter both said, C procedures won't work, since they will lead to
&lt;br&gt;&amp;gt; stack leaks.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Feel free to try to make the code a Mercury procedure hand-written in C,
&lt;br&gt;&amp;gt; but that has its own problems, since you need to arrange parameter passing
&lt;br&gt;&amp;gt; without clobbering the values of any abstract machine registers you need.
&lt;br&gt;&amp;gt; However, if I were you, I would keep it a macro, but give it a major cleanup,
&lt;br&gt;&amp;gt; e.g. fix indentation, get rid of &amp;quot;== MR_TRUE&amp;quot;, and use submacros defined with
&lt;br&gt;&amp;gt; &amp;quot;#if ... #else ... #endif&amp;quot; to avoid using macros with code arguments like
&lt;br&gt;&amp;gt; MR_IF_PROFILE_PARALLEL_EXECUTION_SUPPORT.
&lt;/div&gt;&lt;/div&gt;I don't see a case of &amp;quot;== MR_TRUE&amp;quot; in MR_join_and_continue.
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;signature.asc&lt;/strong&gt; (500 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/26472121/0/signature.asc&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Mercury---Dev-f14120.html&quot; embed=&quot;fixTarget[14120]&quot; target=&quot;_top&quot; &gt;Mercury - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Large-MR_join_and_continue%28%29-macros-in-runtime.-tp26404678p26472121.html" />
</entry>

</feed>
