[PATCH] Teach ScalarEvolution to sharpen range information.

Andrew Trick atrick at apple.com
Tue Oct 14 23:58:00 PDT 2014


On Oct 14, 2014, at 11:49 PM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:

>>> ! In D5639#12, @atrick wrote:
>> There are a couple obvious typos. Please make sure those are fixed to match your intentions.
> 
> Will fix, thanks!  Just to be clear -- is this okay to check in after those changes or should I re-upload for review?

Fine with me.

>> Otherwise, I think this is fine. I have to admit I had to stare at it for quite some time to understand what's going on, but it does seem like a decent fix for your reasonable test case.
> 
> An interesting thing related to the test case: if you change the `entry` block to
> 
> ```
> entry:
>  %length = load i32* %buffer ;; this line changed (!range removed)
>  %entry.pred = icmp slt i32 %length, 1 ;; this line changed (eq => slt)
>  br i1 %entry.pred, label %abort, label %loop.preheader
> ```
> 
> llvm TOT at `-O3` will optimize away `%oob.pred` just fine.  But adding the `!range` metadata makes `-instcombine` kick in and optimize `%length slt 1` to `%length eq 0` (the two are equivalent if the msb of `%length` is `0`) clobbering the `-indvars` optimization.  So, on llvm TOT, there is at least one case where adding a `!range` annotation **regresses** performance at `-O3`.  This patch fixes that issue too.

Awesome. FWIW, I really don’t think instcombine should be doing that early in the pipeline. Nor should indvars be doing something similar during “LFTR”.

-Andy

>> [off the subject of the review a bit]
>> In general, as we continue piling logic into SCEV I would encourage you to at least run some basic compile-time measurements. One way to do this is to link a bunch of IR files together and run opt -O2 -time-passes.
> 
> Thanks, will keep that in mind.
> 
> http://reviews.llvm.org/D5639
> 
> 





More information about the llvm-commits mailing list