<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><div>At the very least, can we use the same number for all targets, 4K?</div><div><br></div><div><br></div><div>I don't like this inconsistency:</div><div><br></div><div><br></div><div> IF RTParams.IsPresent("checked") THEN</div><div>    EVAL F4096x8p2.F1(NIL); (* large -- gets null checked *)</div><div> END;</div><div> IF RTParams.IsPresent("unchecked") THEN</div><div>    EVAL F0.F1(NIL); (* small -- does not get null check *)</div><div> END;</div><div><br></div><div><br></div><div>jair:p263 jay$ ./I386_DARWIN/pgm @M3checked</div><div><br></div><div><br></div><div>***</div><div>*** runtime error:</div><div>***    Attempt to reference an illegal memory location.</div><div>***    file "../F4096x8p2.m3", line 8</div><div>***</div><div><br></div><div>Abort trap: 6</div><div>jair:p263 jay$ ./I386_DARWIN/pgm @M3unchecked</div><div><br></div><div><br></div><div>***</div><div>*** runtime error:</div><div>***    Segmentation violation - possible attempt to dereference NIL</div><div>***    pc = 0xb8dc5 = F1 + 0x6 in ../F0.m3</div><div>***</div><div><br></div><div><br></div><div>I wonder if we have even implemented this for Windows, the unchecked form.</div><div>The inefficient checked form is easy.</div><div>Notice how "large" gives the file/line of the null deref, "small" does not.</div><div><br></div><div><br></div><div>What do Java, gcj, C#, mono, .NET Native, go, rust do?</div><div><br></div><div><br></div><div>(Extra credit to anyone who can show me</div><div>both their compiler outputting the checks</div><div>and their generated code in a debugger..</div><div>For Modula-3/cm3cg, grep for fault in the *ms files for *.c files)</div><div><br></div><div><br></div><div> - Jay</div><br><br><br><div><hr id="stopSpelling">Subject: Re: [M3devel] Target.First_readable_addr<br>From: hosking@purdue.edu<br>Date: Wed, 26 Aug 2015 14:44:30 +1000<br>CC: m3devel@elegosoft.com<br>To: jay.krell@cornell.edu<br><br><div>This optimization has some performance benefit.</div><div>Surely we can simply fix the problems rather than removing the capability.</div><br><div><blockquote><div>On Aug 26, 2015, at 10:28 AM, Jay K <<a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>> wrote:</div><br class="ecxApple-interchange-newline"><div><div dir="ltr" style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;">Of course, my agenda is to remove target-specificity.<div><br></div><div><br></div><div><br></div><div>Target.First_readable_addr is a target-specific optimization</div><div><span style="font-size:12pt;">to omit null checks. Or maybe range checks..</span></div><div><br></div><div><br></div><div>The assumption is that dereferencing "actual" null is checked</div><div>by the hardware, so code doesn't have to be generated to check for null.</div><div><br></div><div><br></div><div>I'm not even sure I like this -- as the behavior of dereferencing null <span style="font-size:12pt;">is not portable. </span></div><div><br></div><div><br></div><div>The assumption is further that accesses to the first page, at least,</div><div>are subject to the same hardware checks, and can also be optimized away.</div><div><br></div><div><br></div><div>At first, glance, I thought this was based on offset + size of a static access.</div><div><br></div><div><br></div><div>For example:</div><div><br></div><div>a: ARRAY [0...large] OF CHAR</div><div><br></div><div><br></div><div>a[0..4095]   no check</div><div>a[4096 and up] would check</div><div><br></div><div><br></div><div>Target.First_deadable_addr is 4k on many targets; 8k on others.</div><div>Setting it too low would yield extra checks.</div><div>Setting it too high would yield missing checks and a loss of safety.</div><div><br></div><div><br></div><div>Here is what I actually found though.</div><div><br></div><div><br></div><div> - The check is based on the size of the type being accessed.</div><div><br></div><div> - It is off by a factor of 8 -- there is confusing between m3middle and m3front</div><div>  as to if it is bit number of a byte number.</div><div><br></div><div><br></div><div>small: ARRAY[0..100] OF CHAR</div><div>large:ARRAY[0..100000] OF CHAR</div><div><br></div><div>no access to small gets checked and every access to larger gets checked.</div><div><br></div><div>Should we do anything about this?</div><div><span style="font-size:12pt;"><br></span></div><div><span style="font-size:12pt;">In m3-sys/m3tests/src/p2/p263:</span></div><div><span style="font-size:12pt;">cm3 -realclean</span></div><div><span style="font-size:12pt;">cm3 -keep</span></div><div><span style="font-size:12pt;">grep fault <target>/*ms</span></div><div><span style="font-size:12pt;"><br></span></div><div><span style="font-size:12pt;"><br></span></div><div><span style="font-size:12pt;">All the accesses are to offset 0.</span></div><div><font size="3">So, by some expectation, no </font>null<font size="3"> checks are needed.</font></div><div><font size="3">Null checks are output when the size of the</font></div><div><font size="3">containing type is, for x86, larger than 4096*8.</font></div><div><font size="3"><br></font></div><div><br></div><div>The checks have been largely but not completely wrong/missing.</div><div>Safety behooves us to check though.</div><div><br></div><div> - fix the factor of 8?</div><div> - make it 0?? too slow?</div><div> - make it 4k on all target? until such time as a target manifests with a smaller page size?</div><div> - base the checks on access offset + size, not containing size?</div><div>   Containing size is conservative. It checks more than i think is meant.</div><div><br></div><div><br></div><div>I couldn't actually figure out the code here, I added various:</div><div><br></div><div><div>    IF RTParams.IsPresent("qual") THEN</div><div>      RTIO.PutText("NilChkExpr.Compile p.offset:" & Fmt.Int(p.offset) & "\n");</div><div>      RTIO.Flush();</div><div>    END;</div></div><div><br></div><div>and such to m3front to figure it out.</div><div><br></div><div><br></div><div>Thanks,</div><div><span style="font-size:12pt;">- Jay</span></div><div><br></div></div><span style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;display:inline !important;">_______________________________________________</span><br style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;"><span style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;display:inline !important;">M3devel mailing list</span><br style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;"><a href="mailto:M3devel@elegosoft.com" style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;">M3devel@elegosoft.com</a><br style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;"><a href="https://mail.elegosoft.com/cgi-bin/mailman/listinfo/m3devel" style="font-family:Calibri;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;" target="_blank">https://mail.elegosoft.com/cgi-bin/mailman/listinfo/m3devel</a></div></blockquote></div><br></div>                                          </div></body>
</html>