[llvm-dev] trunc nsw/nuw?

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 5 07:59:55 PDT 2017


On 07/04/2017 01:41 AM, Dr.-Ing. Christoph Cullmann via llvm-dev wrote:
> Hi,
>
>> Hi Alexandre,
>>
>> LLVM currently doesn't have trunc nsw/nuw, no.
>> Which frontend would emit such instructions? Any application in mind?
>> Just asking because if no frontend could emit those, then the motivation to
>> add nsw/nuw support to trunc would be very low I guess.
> I think the clang frontend could use that to allow better static analysis of integer overflows
> on the LLVM IR.
>
> It might be interesting for static analysis tools that want to know if you truncate something
> that is too large for the target range but you need the sign to determine, e.g. the C/C++ frontend
> could use that flag for trunc of signed/unsigned integers, then you could e.g. check if
>
> (uint8_t)x
>
> changes the values if x has stuff out of the 0..255 range.
>
> e.g. x as int with -100 => trunc nuw to 8 => bad
>
> (int8_t)x
>
>    => trunc nsw to 8 => ok

I'm not sure that a C/C++ frontend could add this flag. In C++, the 
conversion for unsigned types is specified and for signed types, it's 
implementation defined, but in neither case is it UB.

  -Hal

>
> Greetings
> Christoph
>
>> Thanks,
>> Nuno
>>
>> -----Original Message-----
>> From: Alexandre Isoard via llvm-dev
>> Sent: Monday, July 3, 2017 8:38 PM
>> To: llvm-dev
>> Subject: [llvm-dev] trunc nsw/nuw?
>>
>>
>> Hello,
>>
>>  From [1], trunc does not seems to have a nsw/nuw attribute.
>> Is it possible to have that? Or do we have that and it is not up-to-date?
>>
>> The definition would be:
>>
>> If the nuw keyword is present, the result value of the trunc is a poison
>> value if the truncated high order bits are non-zero. If the nsw keyword is
>> present, the result value of the trunc is a poison value if the truncated
>> high order bits are not all equal to the non-truncated bit of the highest
>> order.
>>
>> This allow to cancel out:
>> - sext with trunc nsw
>> - zext with trunc nuw
>>
>> And probably to commute with add/sub/mul/lshr/ashr/shl/urem/udiv/udiv (with
>> the correct flags).
>>
>> [1]: http://llvm.org/docs/LangRef.html#trunc-to-instruction
>>
>>
>> --
>>
>> Alexandre Isoard
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-dev mailing list