Question on arithmetic overflow detection support in C2
Krystal Mok
rednaxelafx at gmail.com
Wed Jun 20 22:04:26 PDT 2012
Got the jo instruction emitted now. Thanks Vladimir!
I added a new FlagsProjNode type that derives from ProjNode, and explicitly
overrides bottom_type() and ideal_reg() to TypeInt::CC and Op_RegFlags,
respectively. That enabled the projection node matching to work.
Current status of the patch is avaiable here:
https://gist.github.com/b24382a3dda090ab63ff
But there are still some unexpected behavior. I was expecting the Bool(...
[ov]) node to be matched into a cmpOp, and the If node to be matched into a
jmpCon; instead, they're actually matched into the unsigned version. Can't
figure out what was going on yet.
The IR graph of Math.addExact(int, int),
after Optimize():
http://dl.iteye.com/upload/picture/pic/114606/0e8e47af-729e-36ca-baee-ed15174dd178.png
before matching:
http://dl.iteye.com/upload/picture/pic/114610/05e81e91-ef99-3d9c-a543-12dacb9c2ae4.png
(so far so good)
after matching and GCM:
http://dl.iteye.com/upload/picture/pic/114612/da53b8cf-3ed2-30d2-9cfa-a1a43e94a4c2.png
(oops...got jmpConU instead of the expected jmpCon)
Another problem is that I had to use a fixed register for the "dst" of
checkedAddI_reg and its data result projection. In this case I'm using eax;
but any fixed RegI will do.
The cause is stated before: I don't know how to specify the relationship
between the "dst" of checkedAddI_reg and its data result projection, so as
to make them use the same register.
If I can fix these two problems, then I'll go back and make a full-fledged
intrinsic for Math.addExact(int, int). The way I pattern match the overflow
checking logic wouldn't work when Math.addExact(int, int) is inlined into a
caller with complex control-flow.
Thanks,
Kris
On Thu, Jun 21, 2012 at 10:07 AM, Vladimir Kozlov <
vladimir.kozlov at oracle.com> wrote:
> C2 matchs from bottom to top of graph. So first it tries to match If node
> and failed. In second mail I explained that State for Proj node is
> incorrect for your case because ideal_reg() is incorrect:
>
> s->DFA( m->ideal_reg(), m );
>
> Vladimir
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20120621/162223cb/attachment.html
More information about the hotspot-compiler-dev
mailing list