[PATCH] D16240: [InstCombine] Simplify a known nonzero incoming value of PHI
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 18 17:12:16 PST 2016
sanjoy added inline comments.
================
Comment at: lib/Transforms/InstCombine/InstCombinePHI.cpp:940
@@ +939,3 @@
+ Value *VA = PN.getIncomingValue(i);
+ if (!isa<ConstantInt>(VA) && VA->hasOneUse() &&
+ isKnownNonZero(VA, DL, 0, AC, &PN, DT))
----------------
junbuml wrote:
> mssimpso wrote:
> > junbuml wrote:
> > > sanjoy wrote:
> > > > Why do you care about `VA` having only one use?
> > > In correctness perspective, we don't have to check VA->hasOneUse(), but I expected the real impact on performance only when the incoming value become a dead code from this modification. I'm okay with removing this check (VA->hasOneUse()) if we can expect any indirect benefit.
> > I think keeping the one-use check makes sense. If we only expect there to be a benefit if VA becomes dead, we want to avoid increasing compile-time. The only corner case that I can think of is if all of VAs users are PHIs that are compared with zero.
> > The only corner case that I can think of is if all of VAs users are PHIs that are compared with zero.
>
> This could a possible corner case, but to be simple for now, I may want to handle it as an extension if we need it.
I appreciate that there is a compile time tradeoff here, but reducing
the number of users of `VA` can help if it changes `VA` to have only
one user left (there are optimizations in instcombine predicated on
instructions having only one use). In general, my opinion is that if
it does not //hurt// performance to do this transform for `VA` with
more than one user, then we should not bail out.
================
Comment at: lib/Transforms/InstCombine/InstCombinePHI.cpp:942
@@ +941,3 @@
+ isKnownNonZero(VA, DL, 0, AC, &PN, DT))
+ PN.setIncomingValue(i, ConstantInt::get(PN.getType(), 1));
+ }
----------------
`isKnownNonZero` will try to prove the predicate for the location you
pass in as `CtxI`. You're passing in `PN` for `CtxI`, so currently
you won't optimize cases like:
```
br (%x > 0), label %left, label %right
left:
br label %merge ;; == LOC
right:
br label %merge
merge:
%p = phi i32 [ %x, %left ], [ %y, %right ]
%cmp = icmp eq i32 0, %p
```
The optimization won't trigger in this case because `%x` is not
provably non-zero at `%p`. However, `%x` //is// provably non-zero at
`LOC`, so passing in `LOC` for `CtxI` to `isKnownNonZero` should
return `true`.
http://reviews.llvm.org/D16240
More information about the llvm-commits
mailing list