[Mesa-dev] [PATCH 3/3] nir: Simplify ine/ieq(ineg(a), a) -> ine/ieq(a, 0)

Thomas Helland thomashelland90 at gmail.com
Thu Aug 6 15:19:46 PDT 2015


2015-08-07 0:08 GMT+02:00 Matt Turner <mattst88 at gmail.com>:
> (Don't top quote)
>
> On Thu, Aug 6, 2015 at 7:22 AM, Boyan Ding <boyan.j.ding at gmail.com> wrote:
>> But, isn't -INT_MIN == INT_MIN?
>
> In C (-INT_MIN) is undefined since it relies on behavior of signed
> integer overflow.
>
> In GLSL though, I think you're right. The spec says that addition
> subtraction, and shift operations (weird to list shift operations)
> will wrap. Multiplication and division however do not -- when they
> overflow their results are undefined (per a clarification/change in
> the 4.30 spec).
>
> So yeah, I don't think this is safe.
>
> By the way, a good sanity check is to write a C function and compile
> with gcc and see if it performs the optimization you're implementing.
>
> bool int_cmp(int x) {
>     return -x == x;
> }
>
> 0000000000000000 <int_cmp>:
>    0: 89 f8                 mov    %edi,%eax
>    2: 01 f8                 add    %edi,%eax
>    4: 0f 94 c0             sete   %al
>    7: c3                   retq
>
> I'm not actually sure what it's doing, but the function does return
> true for INT_MIN.

Then we arrived at the same conclusion.
This patch is total rubish.
I actually did almost the same trick you suggest Matt,
when Boyan pointed out the issue.
I just hooked up a

if (-INT_MIN == INT_MIN)
   fprintf(stderr, "Yuuuup, %d, %d", -INT_MIN, INT_MIN);

in the middle of the VRP pass and gave it a whirl.
Needless to say, there was a bit of action on stderr .

Regards
Thomas


More information about the mesa-dev mailing list