[llvm-dev] PHI nodes and connected ICMp

Sanjoy Das via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 10 00:47:02 PDT 2017


It may be helpful to see the incoming value as the incoming value of
the "next" PHI (i.e. the instance of the PHI node on the next
iteration).  With that interpretation in mind, you can see that
comparing the PHI node itself is equivalent to:

do {
  ...
  // I is the value that becomes the PHI node
} while (I++ < N);

and comparing with the incoming value of the PHI is equivalent to:

do {
  ...
} while (++I < N);


I can't think of any fundamental reason why one would be preferred for
increasing induction variables and the other would be preferred for
decreasing induction variables.  I suspect what you're seeing is just
an artifact of how clang lowers these loops.

I'm also not sure what you mean by "I can have only two cases".   Loop
backedge conditions can be arbitrarily complex, if that's what you're
asking.

-- Sanjoy


On Thu, Aug 10, 2017 at 12:34 AM, Anastasiya Ruzhanskaya via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> Hello,
> I have one more question about how phi nodes and their corresponding ICmp
> instructions are associated. maybe it is simple, but at first I thought that
> we always compare against one of incoming value. Is it true that  I can have
> only  two cases:
> %indvars.iv = phi i64 [ %indvars.iv.next, %1 ], [ 0, %0 ]
> ...
> %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
> %exitcond = icmp eq i64 %indvars.iv.next, 32
>
>
> and
>
> %i.11 = phi i32 [ %i.11.be, %.backedge ], [ 32, %1 ]
> ...
> %13 = icmp sgt i32 %i.11, 3
> ?
> In the first one we always have icmp on the incoming value after addition,
> multiplication and so on.
> In the second - we compare at first against our phi variable and then
> perform operations. I have noticed, that the first case correspond to "up"
> operations - +=, *= ans do on, the second - to "down" : -=, /= and so on.
> But maybe it depends on logic of the cycle too... So, are their two cases :
> comparing in exiting block against PHI variable or against one of its'
> incoming value?
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>


More information about the llvm-dev mailing list