Hi Remi,<br><br><div class="gmail_quote">On Tue, Jun 19, 2012 at 3:19 PM, Rémi Forax <span dir="ltr">&lt;<a href="mailto:forax@univ-mlv.fr" target="_blank">forax@univ-mlv.fr</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I&#39;m not sure to understand why you need a pair of values knowing that<br>
methods like Math.addExact() throws an ArithmeticException if it overflows<br>
so in my opinion, only one value is needed.<br>
<br></blockquote><div>We need to model the implementation logic of Math.addExact() in C2&#39;s IR, and we have to represent it with basic IR nodes. There&#39;s no node in this IR that could &quot;do addition and throw exception on overflow&quot;. We could certainly make one, but then it&#39;d be a macro node, and has to be expanded (lowered) into the more basic nodes later on.</div>

<div><br></div><div>There&#39;s only one example I know of in C2 that carries very heavy logic all the way into instruction selection, which is the STTNI optimizations for some String methods.</div><div><br></div><div>As Vladimir and John already said, the IR in C2 usually produce only one data out edge (in other words, produces only a single value). Data nodes that produces multiple values are handled by projection nodes.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I think the easy way is to check if their is a catch(ArithmeticException) that is<br>
transformed to a goto (the VM already does that) and to generate an add + a jump on overflow<br>
for that case.<br>
<br></blockquote><div>That&#39;s actually not as easy as it seems. Well, it&#39;s the matter of where to put the logic into.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


BTW, I&#39;m very happy and I suppose that Charles (Nutter) and the Jython team is happy too,<br>
that you guys take a look to that optimization.<br>
<br></blockquote><div>I&#39;m very happy to find something new to work on, so that I can get up to speed with C2. Hopefully I can get something running for you in time :-)</div><div><br></div><div>BTW, have you tried out Graal for custom optimizations?</div>

<div><br></div><div>- Kris</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
cheers,<br>
Rémi<div><div><br>
<br>
On 06/19/2012 06:43 AM, Vladimir Kozlov wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Vladimir Kozlov wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
It will be difficult. Almost all data nodes produce only one result and <br>
</blockquote>
<br>
I meant only one data edge (not result) is produced.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
this rule is used in all parts of C2 (from parser to RA). One exception is conditional stores which produce flag and memory state (look in macro.cpp in expand_allocate_common() method). This case handled specially everywhere. And you do need to add overflow and non-overflow pair to BoolTest values.<br>


<br>
Vladimir<br>
<br>
Krystal Mok wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all,<br>
<br>
I&#39;m doing some experiments in C2, trying to add support in the IR for arithmetic overflow detection. Looks like it&#39;s quite involved, though.<br>
Any suggestions on how it could be done would be greatly appreciated :-)<br>
<br>
My questions:<br>
<br>
1. The structure of IfNode: does the IR have to be in the form of<br>
If_proj-&gt;If-&gt;Bool-&gt;Cmp<br>
<br>
Although there&#39;s code in idealize_test() (in ifnode.cpp) that checks if iff-&gt;in(1)-&gt;is_Bool(), other places seem to assume the sole data input to If is a Bool, e.g. the transformation in Matcher::find_shared().<br>


<br>
What if I wanted to add some node type other than Bool as the test input to If? Something like (If (CheckOverflow expr)), does that feel right?<br>
<br>
2. The BoolTest kinds, does it feel right to add a pair of kinds for overflow? Like BoolTest::ovf and BoolTest::noovf. They&#39;ll still fit in the 3-bit encoding.<br>
<br>
If this pair is added, then to make it useful, the input to Bool wouldn&#39;t always be Cmp anymore; instead it could be any arithmetic nodes that modifies the condition flags as a side-effect.<br>
And...that doesn&#39;t seem to fit in C2&#39;s IR right now, since the only kind of node that models DEF of the condition flags are the Cmp nodes.<br>
<br>
3. As a quick-n-dirty experiment, I tried not to touch the machine-independent IR, and instead modify only the ad file to pattern match the current Java implementation of Match.addExact(int, int) to make it emit a jo (jump-if-overflow) instruction for overflow detection, but it failed to compile.<br>


The patch is here: <a href="https://gist.github.com/3818aa3acbc78e28e7fa" target="_blank">https://gist.github.com/<u></u>3818aa3acbc78e28e7fa</a><br>
<br>
(Aside: the Ideal graph of the overflow check expression is like this:<br>
<a href="http://dl.iteye.com/upload/picture/pic/114476/674e0a78-5515-3da3-8ea6-6eedbeb32f8e.png" target="_blank">http://dl.iteye.com/upload/<u></u>picture/pic/114476/674e0a78-<u></u>5515-3da3-8ea6-6eedbeb32f8e.<u></u>png</a> <br>


This is the state right before matching the matcher rules)<br>
<br>
ADLC didn&#39;t complain, but the generated jmpAddOverflowNode::Expand() function had compilation errors, saying:<br>
<br>
../generated/adfiles/ad_x86_<u></u>64_expand.cpp: In member function ‘virtual MachNode* jmpAddOverflowNode::Expand(<u></u>State*, Node_List&amp;, Node*)’:<br>
../generated/adfiles/ad_x86_<u></u>64_expand.cpp:5915: error: ‘num8’ was not declared in this scope<br>
<br>
Apparently I was doing something wrong in the ad file, but I don&#39;t quite get what it was.<br>
<br>
Regards,<br>
Kris<br>
</blockquote></blockquote></blockquote>
<br>
<br>
</div></div></blockquote></div><br>