Question on arithmetic overflow detection support in C2
Vladimir Kozlov
vladimir.kozlov at oracle.com
Thu Jun 28 07:18:13 PDT 2012
This looks good.
Add next line only in cmpOp() operand to matching signed.
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
Do not rename, just use 'n' as argument:
+CheckedAddINode* CheckedAddINode::make(Compile* C, Node* cmpadd) {
+ Node* n = cmpadd;
Did you tried INT_REG_mask() instead of INT_RAX_REG_mask() in
checkedAddI_sum_proj_mask() to avoid using bound register in
checkedAddI_rReg()? And did you tried match(Set dst (CheckedAddI dst src))?
Thanks,
Vladimir
Krystal Mok wrote:
> Hi all,
>
> Just FYI, I've posted an updated version of the patch here:
> https://gist.github.com/db03ab15ef8b76246b84#file_checked_add_prototype.ver3.patch
>
> It pretty much implements what John suggested in a previous email
> (quoted below).
>
> This version still suffers from a couple of problem mentioned before:
> 1. It's emitting a jmpConU instead of a jmpCon during instruction
> selection. Is there a way to force it use jmpCon here?
> 2. I had to use a fixed register for the sum projection of CheckedAddI,
> otherwise I couldn't find a way to specify this projection should use
> the same register as "dst".
>
> - Kris
>
> On Wed, Jun 20, 2012 at 3:12 AM, John Rose <john.r.rose at oracle.com
> <mailto:john.r.rose at oracle.com>> wrote:
>
> On Jun 19, 2012, at 7:07 AM, Krystal Mok wrote:
>
>> In the DivMod example, Div and Mod nodes with the same inputs
>> start out floating separately, and get fused into a single DivMod
>> late in Optimize(). The DivMod node type is a MultiNode with 2
>> projections, one for the div and the other for the mod. There's
>> special treatment of DivMod in Matcher, and custom logic to match
>> the projections.
>>
>> If I add a new node type AddIOverflow following the same model, I
>> might get it like this:
>> https://gist.github.com/bdd13666e4796b09f36e
>> This node type would have 2 projections just like DivMod, one for
>> the add, and the other for the overflow condition.
>
> (rename INT_CC ⇒ INT_CC_PAIR for clarity)
>
>> Then there are two questions:
>>
>> 1. I'd need another new node type, presumably called
>> "CheckAddIOverflow" here, that derives from CmpINode and acts as
>> if it produces condition codes. AddI(a, b) and
>> CheckAddIOverflow(a, b) float separately, just like the DivMod
>> example. They get fused up late in Optimize() into the
>> AddIOverflow shown above. Does this sound right?
>
> Yes, that sounds right. The names don't feel right, yet. What's
> the best term for a version of Add which is not subject to overflow?
> That's what the user will be trying to build. Maybe a word like
> "Checked" or "Safe" is best, rather than focusing on overflow.
>
> Maybe: AddI(a, b) plus CmpAddI(a, b) ⇒ CheckedAddI(a, b) plus two
> projections yielding the first two values.
> You might be right about adding two new BoolNode states. That way
> you can think in terms of:
> if ((c = a + b) != 0) …
> turning into
> c=AddI(a,b); cc=CmpAddI(a,b); if(Bool::nz(cc)) …
>
> And overflow turns into the natural special case supported by the HW.
>
>> 2. With AddIOverflow going into the Matcher, how should I write
>> the match rule in the ad file, to
>> match: If(Bool(Proj(AddIOverflow(a, b)).overflow, ne), labl) ?
>>
>> Would it look like: match(If cop (AddIOverflow dest src)) ?
>
> (You have probably already noticed it; the matcher.cpp comment
> "Convert (If (Bool (CmpX A B))) into (If (Bool) (CmpX A B))" is
> highly relevant to matching If nodes. See also uses of BinaryNode.)
>
> Following the DivMod pattern, the matcher (in its current state)
> will have to match the CheckedAddI as a stand-alone node. Subtrees
> of matches can only have one use; this is a key matcher invariant.
> But every DivMod or CheckedAddI will have two uses: Its two
> projections.
>
> So you'll have:
>
> match(CheckedAddI);
>
> and the pre-existing rule:
>
> If(cop cmp)
>
> The cop will be Bool::ov (or Bool::nz in the example above) and the
> cmp will be CheckedAddI.cmp.
>
> You might think about extending the matcher machine to allow rules
> which specify the disposition of both projections:
>
> match( (If cop (Proj#1 (CheckedAddI a b))); (Set c (Proj#0
> (CheckedAddI a b))));
>
> This would be a Big Project. Long term, I believe it is worth
> thinking about ways to model instructions that do more than one
> thing at a time.
>
>> If the pair of overflow/non-overflow conditions are in BoolTest
>> and in cmpOp, perhaps I wouldn't need to match the If node, and
>> could just let jmpCon rule handle it as-is.
>> That way I just have to match AddIOverflow itself in the ad file,
>> like DivMod.
>
> — John
>
>
More information about the hotspot-compiler-dev
mailing list