[llvm-dev] Failure to turn a div by power of 2 into a single shift

Haicheng Wu via llvm-dev llvm-dev at lists.llvm.org
Fri Mar 4 10:50:48 PST 2016


Thank you, both of you.

In Sanjoy's example, CorrelatedValuePropagation makes the change.  I guess I can do the similar thing to turn the sdiv to udiv.

Best,

Haicheng

-----Original Message-----
From: Sanjoy Das [mailto:sanjoy at playingwithpointers.com] 
Sent: Thursday, March 03, 2016 6:29 PM
To: Philip Reames
Cc: Haicheng Wu; llvm-dev
Subject: Re: [llvm-dev] Failure to turn a div by power of 2 into a single shift

SCEV certainly should be able to prove that "j" is positive; but I'm not sure if it is being queried about that via isKnownPredicate.

An interesting variant of the original example is

void foo(int n, volatile int* p) {
  int i, j;
  for (j = n; j > 1; j = i) {
    *p = (j > 0);
    i = j / 2;
  }
}

where the volatile store to *p does get optimized to "*p = true", but that happens before loop rotation, when the loop is still in the form of

define void @foo(i32 %n, i32* nocapture %p) #0 {
entry:
  br label %for.cond

for.cond:                                         ; preds = %for.body, %entry
  %j.0 = phi i32 [ %n, %entry ], [ %div, %for.body ]
  %cmp = icmp sgt i32 %j.0, 1
  br i1 %cmp, label %for.body, label %for.end

for.body:                                         ; preds = %for.cond
  %cmp1 = icmp sgt i32 %j.0, 0
  %conv = zext i1 %cmp1 to i32
  store volatile i32 %conv, i32* %p, align 4, !tbaa !2
  %div = sdiv i32 %j.0, 2
  br label %for.cond

for.end:                                          ; preds = %for.cond
  ret void
}

and the dominating check on j > 1 is still "obvious".

-- Sanjoy


On Thu, Mar 3, 2016 at 2:39 PM, Philip Reames <listmail at philipreames.com> wrote:
> I'd missed the fact that j wasn't just being decremented.  This isn't 
> as easy as I said.
>
> Philip
>
>
> On 03/03/2016 02:36 PM, Philip Reames via llvm-dev wrote:
>
> SCEV should be able to easily prove that j is positive here.  I'm not 
> sure where the right place to use that information would be in this case.
> Sanjoy, can you comment?
>
> Philip
>
> On 03/03/2016 02:06 PM, Haicheng Wu wrote:
>
> Hello,
>
>
>
> I have  a simple loop like below
>
>
>
> int I, j;
>
> for (j = n; j > 1; j = i) {
>
>   i = j / 2;
>
> }
>
>
>
> The signed division can be safely turned into a single shift since j 
> is known to be positive from the loop guard.  LLVM currently cannot 
> find out j is positive and compiles the above division into 3 
> instructions.  Any thoughts on where to fix this?
>
>
>
> Thank you in advance,
>
>
>
> Haicheng
>
>
>
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>



--
Sanjoy Das
http://playingwithpointers.com



More information about the llvm-dev mailing list