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

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 19 21:32:33 PDT 2016


> On Oct 19, 2016, at 8:40 PM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:
> 
> Hi Mehdi,
> 
> On Wed, Oct 19, 2016 at 8:29 PM, Mehdi Amini <mehdi.amini at apple.com> wrote:
>>> sext(x):
>>> t = zext x
>>> result = 0
>>> for i = 0 to bitwidth:
>>>   result |= t << i;
>>> return result
>> 
>> I don’t understand this definition of sext?
>> Are you trying to express that we will copy the sign one bit at a time, and so every `new` bit is a new “read” of the undef sign?
> 
> Yes, that's what I was trying to express.  But, as you pointed out,
> that isn't the actual definition of sext as specified in the lang ref.
> 
>>> 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”.
>> 
>> I didn’t get this last part?
> 
> If zext(x) is defined to always produce a concrete value (that is,
> zext(undef) is either 0 or 1), then this program can never fail the
> assert:
> 
>  %t = zext i1 %some_val to i2
>  %t.trunc = trunc(%t) to i1
>  assert(%t.trunc == %t.trunc)
> 
> even if %some_val is undef.
> 
> However, if you get rid of the trunc/zext pair, and transform this to:
> 
>  assert(%some_val == %some_val)
> 
> then it can fail the assert if %some_val is undef.
> 
> 
> For the transform above to be allowed, zext(undef) needs to retain the
> "undefness" in its result (that is, it needs to be a non-deterministic
> choice between 0 and 1 at each use site).
> 
> Does that answer your question, or were you asking something else?

That answers my question. 
But that’s not how we consider undef right now, is it?
I expect folding trunc(zext(x)) to x perfectly valid (i.e. the possibility that “maybe” X is undef should not prevent this transformation).

It comes back to how we “freeze” the undef, and this case does not seem much different from X ^ X to me right now.

— 
Mehdi




More information about the llvm-dev mailing list