[ValueTracking] isKnownNonZero() should take non-null-ness assumptions into…

Authored by lebedev.ri on Dec 18 2019, 9:24 AM.


[ValueTracking] isKnownNonZero() should take non-null-ness assumptions into consideration (PR43267)

It is pretty common to assume that something is not zero.
Even optimizer itself sometimes emits such assumptions
(e.g. addAssumeNonNull() in PromoteMemoryToRegister.cpp).

But we currently don't deal with such assumptions :)
The only way isKnownNonZero() handles assumptions is
by calling computeKnownBits() which calls computeKnownBitsFromAssume().
But x != 0 does not tell us anything about set bits,
it only says that there are *some* set bits.
So naturally, KnownBits does not get populated,
and we fail to make use of this assumption.

I propose to deal with this special case by special-casing it
via adding a isKnownNonZeroFromAssume() that returns boolean
when there is an applicable assumption.

While there, we also deal with other predicates,
mainly if the comparison is with constant.

Fixes PR43267.

Differential Revision: https://reviews.llvm.org/D71660