<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I see no problem walking the IR trees again to fill in the type information.  Can't you make it part of the lowering pass to GIMPLE?<div><br></div><div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div><font class="Apple-style-span" color="#0000FF"><font class="Apple-style-span" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; ">Antony Hosking</span></span></font></font><font class="Apple-style-span" face="Gill Sans"><span class="Apple-style-span" style="font-family: 'Gill Sans'; "><span class="Apple-style-span" style="font-family: 'Gill Sans'; "><span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span></span></span><span class="Apple-style-span" style="font-family: 'Gill Sans'; "><span class="Apple-style-span" style="font-family: 'Gill Sans'; ">Associate Professor</span></span><span class="Apple-style-span" style="font-family: 'Gill Sans'; "><span class="Apple-style-span" style="font-family: 'Gill Sans'; "> | Computer Science | Purdue University</span></span></font></div><div><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; ">305 N. University Street | West Lafayette | IN 47907 | USA</span></font></div><div><font class="Apple-style-span" color="#0000FF" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; ">Office</span></span></font><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-style-span" style="font-family: GillSans-Light; "> +1 765 494 6001 |<span class="Apple-converted-space"> </span></span></span></font><font class="Apple-style-span" color="#0000FF" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; ">Mobile</span></span></font><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-converted-space"> </span>+1 765 427 5484</span></span></font></div><div><font class="Apple-style-span" face="GillSans-Light"><br class="khtml-block-placeholder"></font></div></span></span></span></span></span></span></span><br class="Apple-interchange-newline"></span></div></span></span><br class="Apple-interchange-newline">
</div>
<br><div><div>On 4 Oct 2010, at 13:23, Jay K wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div><br>ps: gcc has a very large number of passes over its trees, at least when optimizing.<br>Like tens or 100+.<br>The Modula-3 frontend also makes a few passes over everything, just a few.<br>I don't know where the cost is, but I don't expect to add much. We'll see.<br>I can try to limit it to not even walk the non-type data.<br>I should see if the frontend reliably front-loads the type data. It seems to.<br>We could also put in an end-types opcode to  make it easier to notice.<br>I think we could also address it in the frontend, by introducing<br>a type forward declaration call.<br><br><br><blockquote type="cite"><blockquote type="cite">How big are the intermediate files for all our own sources?<br></blockquote></blockquote><br><br>A few months ago I took a quick survey.<br>This is when I grew the buffer fromwhateve it was to 64K.<br>I couldn't justify larger because so many would fit in 64K.<br><br>I lied somewhat about working set.<br>If you use a small buffer and iterate in place, your working<br>set can only grow by the size of the buffer.<br>If you read the entire thing into memory and walk it linearly,<br>well, the operating system doesn't necessarily know you won't<br>walk backwards so it'll let your working set grow, only to throw<br>out the memory later as needed. This is my rough understanding<br>based on OS principles. As well, using more address space<br>has a little extra cost, vs. looping over a small buffer multiple times.<br><br>We might might might be able to make some optimizations though,<br>such as having strings be direct pointers into the buffer instead<br>of copying them out. There is the matter of the terminal nuls though.<br>And checking that they fit in the buffer.<br><br><blockquote type="cite"><blockquote type="cite">Can you write out some statistics?<br></blockquote></blockquote><br><br>Yeah..<br>I routinely use cm3 -keep, then just -l target/*c<br><br><br> - Jay<br><br>----------------------------------------<br><blockquote type="cite">From: <a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br></blockquote><blockquote type="cite">To: <a href="mailto:wagner@elegosoft.com">wagner@elegosoft.com</a>; <a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br></blockquote><blockquote type="cite">Date: Mon, 4 Oct 2010 17:03:08 +0000<br></blockquote><blockquote type="cite">Subject: Re: [M3devel] backend interface vs. types vs. forward references?<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">The passes I'm talking about I think will be fast.<br></blockquote><blockquote type="cite">True the backend is very slow but I don't think this will matter.<br></blockquote><blockquote type="cite">The earlier will passes will ignore most of the data.<br></blockquote><blockquote type="cite">The cost will only be in the extra but ignored serialization.<br></blockquote><blockquote type="cite">And even then, it might be better -- if the ordering is a certain way<br></blockquote><blockquote type="cite">and guaranteed, once it hits certain opcodes, it will know the types<br></blockquote><blockquote type="cite">are all done and start over, without walking each opcode one at a time.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I tried building m3cc on virtual machines with only 256MB and it failed.<br></blockquote><blockquote type="cite">I had to up to 384 MB. If I cal recall correctly.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Granted, we don't always build m3cc.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Remember that optimized builds would often use "unit at once"<br></blockquote><blockquote type="cite"> compilation, so the entire gcc tree would be in memory.<br></blockquote><blockquote type="cite">Now, currently, we never do that for Modula-3, because of a bug<br></blockquote><blockquote type="cite">where it throws out functions that are needed to be kept.<br></blockquote><blockquote type="cite">But for C/C++ it is not unusual (again, including compiling m3cc).<br></blockquote><blockquote type="cite">The tree representation is presumably not much different/smaller than<br></blockquote><blockquote type="cite">the m3cg representation. For actual C/C++ there might be a bigger difference,<br></blockquote><blockquote type="cite">what with comments/whitespace removed.<br></blockquote><blockquote type="cite">But from the gcc point of view, Modula-3 source is already in an encoded binary form.<br></blockquote><blockquote type="cite">Granted, the strings are duplicatd.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Still, the access pattern remains linear.<br></blockquote><blockquote type="cite">So it doesn't increase working set. Just virtual address space requiremens.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">This is something I learned reeently working with large data -- linear access<br></blockquote><blockquote type="cite">patterns are what is good and keeps working set down, vs. random access.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Plus, the file gets closed which does free a little of resources, though<br></blockquote><blockquote type="cite">probably less than are being additional consumed.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> - Jay<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">----------------------------------------<br></blockquote><blockquote type="cite"><blockquote type="cite">Date: Mon, 4 Oct 2010 16:45:46 +0200<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">From: <a href="mailto:wagner@elegosoft.com">wagner@elegosoft.com</a><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">To: <a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Subject: Re: [M3devel] backend interface vs. types vs. forward references?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Quoting Jay K :<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">I think I'll just solve this in the backend by making a few passes.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Maybe something with specific passes where early passes only pay<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">attention to certain opcodes, that declare types.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I'm not really happy with multiple passes within the backend just to<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">make gcc happy. The performance of the gcc backend is already poor<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">compared to an integrated backend and to what M3 should be able to<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">achieve. How much will it cost wrt. performance?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">The new/current "replay" stuff will maybe go away.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Hm, I must have missed that.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">The new/current keeping of the entire file in memory will stay<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">unless someone has strong evidence/argument that is shouldn't.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Keeping the whole (intermediate code) file in memory should be fine,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">unless we get problems for large generated files on small machines<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">somewhere.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">How big are the intermediate files for all our own sources?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Can you write out some statistics?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Olaf<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">--<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Olaf Wagner -- elego Software Solutions GmbH<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">phone: +49 30 23 45 86 96 mobile: +49 177 2345 869 fax: +49 30 23 45 86 95<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><a href="http://www.elegosoft.com">http://www.elegosoft.com</a> | Geschäftsführer: Olaf Wagner | Sitz: Berlin<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><br></blockquote> <span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span> <span class="Apple-tab-span" style="white-space:pre">   </span>   <span class="Apple-tab-span" style="white-space:pre">       </span><span class="Apple-tab-span" style="white-space:pre">    </span>  <br></div></blockquote></div><br></div></body></html>