[llvm-dev] trunc nsw/nuw?
Alexandre Isoard via llvm-dev
llvm-dev at lists.llvm.org
Wed Jul 5 13:09:18 PDT 2017
On Wed, Jul 5, 2017 at 3:59 PM, Hal Finkel via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> On 07/04/2017 01:41 AM, Dr.-Ing. Christoph Cullmann via llvm-dev wrote:
>> 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
>>> 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
>> 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
>> => 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.
Hmm, I don't get it.
- if the conversion for unsigned types is specified, how is it undefined
- if the conversion for signed types is UB, then this is a direct
application of those flags, isn't it?
>>> -----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?
>>> From , 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
>>> 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
>>> 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
>>> the correct flags).
>>> : http://llvm.org/docs/LangRef.html#trunc-to-instruction
>>> Alexandre Isoard
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
> Hal Finkel
> Lead, Compiler Technology and Programming Languages
> Leadership Computing Facility
> Argonne National Laboratory
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev