[llvm-dev] RFC: Killing undef and spreading poison

Sanjoy Das via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 19 18:55:56 PDT 2016


Hi Alexandre,

On Wed, Oct 19, 2016 at 6:27 PM, Alexandre Isoard
<alexandre.isoard at gmail.com> wrote:
> Really interesting read. I am perplexed now, and am not even sure what is
> the meaning of undef anymore.

Welcome aboard. :)

> Example (unrelated to your blog post, but still weird):
> %x = sext i1 undef to i2
>
> I understand that I can replace it by either of:
> %x = i2 0
> %x = i2 -1
>
> But can I replace it by:
> %x = i2 undef
>
> I would have said no, at first sight, because -2 and 1 should not be
> possible values.
> But if I look at each bit, independently, each one can be either 0 or 1.
> Then, if we
> forget their "entanglement" (like we do shamelessly with xor %x, %x), and
> then
> concatenate them back together, we get the i2 undef...

Yes.

If your definition of sext is:

sext(x):
  if x == 0 then 0 else -1

then things are fine.  However, if your definition of sext is something like:

sext(x):
  t = zext x
  result = 0
  for i = 0 to bitwidth:
    result |= t << i;
  return result

then sext(undef) is, in fact, undef for the reason you highlighted.
In general, you cannot increase the number of uses of undef and
preserve semantics.

You could say that the "zext x" above is "either 0 or 1" (i.e. it
implicitly freezes its input), but then e.g. (in todays scheme)
"trunc(zext(x))" cannot be replaced by "x".

-- Sanjoy


More information about the llvm-dev mailing list