<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
diff attached<BR><BR><BR> <BR>> Date: Sat, 13 Mar 2010 14:45:59 +0000<BR>> To: m3commit@elegosoft.com<BR>> From: jkrell@elego.de<BR>> Subject: [M3commit] CVS Update: cm3<BR>> <BR>> CVSROOT: /usr/cvs<BR>> Changes by: jkrell@birch. 10/03/13 14:45:59<BR>> <BR>> Modified files:<BR>> cm3/m3-sys/m3front/src/exprs/: CompareExpr.m3 EqualExpr.m3 <BR>> <BR>> Log message:<BR>> Fairly simple analysis to optimize comparison of subranges<BR>> that either don't overlap at all, or only "on the edge"<BR>> ("on the edge" means the max of one is equal to the min of the other<BR>> or vice versa)<BR>> <BR>> I don't presume that this really helps much real world code, but<BR>> it is pretty simple so shouldn't hurt.<BR>> Probably it is rare to mix unequal subranges, let alone non-overlapping<BR>> or barely overlapping, as well probably rare to compare subranges to<BR>> constants outside the subrange (or again, "on the edge")<BR>> <BR>> This handles, integers, longints, enums, constants, but addresses don't work<BR>> e.g. address < NIL should perhaps always be false.<BR>> <BR>> It seems to me that maybe EqualExpr.m3 and CompareExpr.m3 could be combined somehow?<BR>> I was surprised to see that they are separate.<BR>> <BR>> It also seemed odd to have to call ConstValue before GetBounds.<BR>> <BR>> Backends are not directly given the information for them to do this work, though<BR>> more advanced analysis might regain the information.<BR>> subranges and enums just end up as generally unbounded int32, etc.<BR>> (backends do see range checks and can remember what they imply but<BR>> I believe parameters are not range checked upon receipt, for example)<BR>> <BR>> see test case p233 (though it should probably move to the "c for code" section,<BR>> since running it doesn't do anything, one reads the code and notices that<BR>> many of the functions are optimized to just return a constant true or false)<BR>> <BR>> This is actually fallout/tangent from not-yet-done work to optimize integer (and possibly other)<BR>> compares in m3back, which has a pretty non-optimal implementation.<BR>> <BR>                                         </body>
</html>