HomePhabricator

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

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

Description

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

Summary:
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