[llvm-dev] Adding Extended-SSA to LLVM

Daniel Berlin via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 6 13:49:33 PST 2017


D29606 (a patch on top of the current patch set) handles all the critical
edge and diamond cases you mentioned here.
It's a bit more complex to handle in one pass, so i did it as a patch set
on top of the existing reviews so it can be reviewed separately.

I have not yet started to link together conjuctive/disjunctive info in a
way clients know that it is conjunctive/disjunctive
(but that seems easy enough).



On Sun, Feb 5, 2017 at 4:26 PM, Daniel Berlin <dberlin at dberlin.org> wrote:

>
>
> On Sun, Feb 5, 2017 at 3:41 PM, Nuno Lopes <nunoplopes at sapo.pt> wrote:
>
>> Thanks for the answers!  The plan makes sense to me.
>>
>> Regarding phis, what about diamonds, e.g.:
>>
>
>
>
>>
>> define i32 @f(i32 %x) {
>>   br .., label %bb0, label %bb1
>> bb0:
>>   %cmp = icmp sge i32 %x, 0  ; x > 0
>>   br i1 %cmp, label %bb2, label %bb3
>> bb1:
>>   %x2 = add nsw nuw %x, 1
>>   %cmp2 = icmp sge i32 %x2, 2     ; x+1 > 2 / x > 1
>>   br i1 %cmp2, label %bb2, label %bb3
>> bb2:
>>   %x3 = phi i32 [ %x, %bb0 ], [ %x2, %bb1 ]
>>   ; CVP says: %x3 is > 0
>>   ...
>>   br label %bb3
>> bb3:
>>    ...
>> }
>>
>> CVP can infer that %x > 0 because the union of the intervals given to the
>> phi node imply that.
>> Sure, we can split those edges, but maybe adding the predicate info to
>> blocks bb0 & bb1 would solve the problem?
>>
>
>
> Right, and these are all critical edges, as you say :)
> I will actually try a trick where we insert the def twice and try to place
> them before phi node uses.
> We sort phi node uses by incoming block, so they should end up next to
> each other.
>
>
>
>>
>>
>> - In processBranch you also consider branches on ANDs/ORs of comparisons,
>>>> and then each comparison is processed individually.  However, this seems
>>>> incorrect for one of the branches:
>>>> if (a && b) {
>>>> ...
>>>> } else {
>>>>  // holds: !a OR !b
>>>>  use(a)
>>>>  use(b)
>>>> }
>>>>
>>>> Right now it seems that the information that is attached to the else
>>>> branch is !a AND !b, which would be incorrect.
>>>>
>>>
>>> I could be pedantic and say the only information attached is a
>>> comparison, the branch, and whether the edge is the true edge or the false
>>> edge :)
>>> Which is correct.
>>>
>>> It also chains the info to give you the entire string of comparisons
>>> that were applied.
>>>
>>> However, in practice you are right, and clients are not likely to get
>>> this right with what i've given them.
>>>
>>> Since in practice, the only useful derived info is in the true branch of
>>> and, and the false branch of or, i'm going to make it not attach info to
>>> the other branch.
>>>
>>> Unless you can see a case it makes sense to?
>>>
>>
>> For CVP there is.  For example:
>> if (x > 2 && x < 5) {
>> ...
>> } else {
>>  // known: x <= 2 || x >= 5
>>  // CVP produces a range for x: [5, 3)  (no loss of information here at
>> all)
>>  if (x == 4) ...  // CVP folds this to false
>> }
>>
>>
>>
> Okay, so it does try to handle simple disjunctions.
>
>
>> So CVP can handle (simple) disjunctive information.  Other ValueTracking
>> analyses handle simple patterns as well, though probably at this time those
>> can't use this new stuff unless we go all in with e-SSA.
>> Not sure how to export the information to clients, though.  Supporting
>> arbitrary boolean combinations of comparisons seems tricky, but maybe
>> sticking to just 1-level of and/or is ok.
>>
>
>
> I mean, we can certainly mark and link the info however we want. I'm just
> not sure what the best way that clients want to use it is yet.
>
> Let me think about this as a followup, since it at least is now "correct"
> to obvious clients
>
>
>>
>> I'm mentioning CVP because it *really* needs to be refactored to use
>> e-SSA/SSI.  The current code is slow, is very limited in scope (w/ somewhat
>> arbitrary throttling), and is too complicated.
>>
>
> Note that with patches to do LVI in DFS postorder instead of BFS order, it
> actually should be close to ideal :)
>
> If CVP moves forward and queries LVI in RPO order, and LVI is doing PO, it
> should be as close to O(1) work per LVI call as you can get.
>
> Of course, it's still a mess, code wise, but ...
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170206/818570dd/attachment.html>


More information about the llvm-dev mailing list