<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 07/05/2017 03:10 PM, Alexandre
      Isoard wrote:<br>
    </div>
    <blockquote
cite="mid:CANLM5LfM=RD_efks34Cc=R4L07=eAPVgiVtZ8UmZAxFVip57kg@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <div dir="ltr">Ah, ok. I read it wrong. In *neither* case it is
        UB.
        <div><br>
        </div>
        <div>Hum, can an implementation define it as UB? :-)</div>
      </div>
    </blockquote>
    <br>
    Nope :-)<br>
    <br>
    The only case I've thought of where we could add these for C++ would
    be on conversions to (most) enums (because they used signed
    underlying types and the out-of-bounds mapping won't generally be
    one of the allowed values (or maybe we can define this to be the
    case?)).<br>
    <br>
     -Hal<br>
    <br>
    <blockquote
cite="mid:CANLM5LfM=RD_efks34Cc=R4L07=eAPVgiVtZ8UmZAxFVip57kg@mail.gmail.com"
      type="cite">
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Wed, Jul 5, 2017 at 9:09 PM,
          Alexandre Isoard <span dir="ltr"><<a
              moz-do-not-send="true"
              href="mailto:alexandre.isoard@gmail.com" target="_blank">alexandre.isoard@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div dir="ltr"><br>
              <div class="gmail_extra"><br>
                <div class="gmail_quote"><span class="">On Wed, Jul 5,
                    2017 at 3:59 PM, Hal Finkel via llvm-dev <span
                      dir="ltr"><<a moz-do-not-send="true"
                        href="mailto:llvm-dev@lists.llvm.org"
                        target="_blank">llvm-dev@lists.llvm.org</a>></span>
                    wrote:<br>
                    <blockquote class="gmail_quote" style="margin:0 0 0
                      .8ex;border-left:1px #ccc solid;padding-left:1ex"><span><br>
                        On 07/04/2017 01:41 AM, Dr.-Ing. Christoph
                        Cullmann via llvm-dev wrote:<br>
                        <blockquote class="gmail_quote" style="margin:0
                          0 0 .8ex;border-left:1px #ccc
                          solid;padding-left:1ex">
                          Hi,<br>
                          <br>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex">
                            Hi Alexandre,<br>
                            <br>
                            LLVM currently doesn't have trunc nsw/nuw,
                            no.<br>
                            Which frontend would emit such instructions?
                            Any application in mind?<br>
                            Just asking because if no frontend could
                            emit those, then the motivation to<br>
                            add nsw/nuw support to trunc would be very
                            low I guess.<br>
                          </blockquote>
                          I think the clang frontend could use that to
                          allow better static analysis of integer
                          overflows<br>
                          on the LLVM IR.<br>
                          <br>
                          It might be interesting for static analysis
                          tools that want to know if you truncate
                          something<br>
                          that is too large for the target range but you
                          need the sign to determine, e.g. the C/C++
                          frontend<br>
                          could use that flag for trunc of
                          signed/unsigned integers, then you could e.g.
                          check if<br>
                          <br>
                          (uint8_t)x<br>
                          <br>
                          changes the values if x has stuff out of the
                          0..255 range.<br>
                          <br>
                          e.g. x as int with -100 => trunc nuw to 8
                          => bad<br>
                          <br>
                          (int8_t)x<br>
                          <br>
                             => trunc nsw to 8 => ok<br>
                        </blockquote>
                        <br>
                      </span>
                      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.<br>
                    </blockquote>
                    <div><br>
                    </div>
                  </span>
                  <div>Hmm, I don't get it.</div>
                  <div><br>
                  </div>
                  <div>Two questions:</div>
                  <div>- if the conversion for unsigned types is
                    specified, how is it undefined behavior?</div>
                  <div>- if the conversion for signed types is UB, then
                    this is a direct application of those flags, isn't
                    it?</div>
                  <div>
                    <div class="h5">
                      <div><br>
                      </div>
                      <blockquote class="gmail_quote" style="margin:0 0
                        0 .8ex;border-left:1px #ccc
                        solid;padding-left:1ex">
                         -Hal
                        <div>
                          <div class="m_-5682808666156860653h5"><br>
                            <br>
                            <blockquote class="gmail_quote"
                              style="margin:0 0 0 .8ex;border-left:1px
                              #ccc solid;padding-left:1ex">
                              <br>
                              Greetings<br>
                              Christoph<br>
                              <br>
                              <blockquote class="gmail_quote"
                                style="margin:0 0 0 .8ex;border-left:1px
                                #ccc solid;padding-left:1ex">
                                Thanks,<br>
                                Nuno<br>
                                <br>
                                -----Original Message-----<br>
                                From: Alexandre Isoard via llvm-dev<br>
                                Sent: Monday, July 3, 2017 8:38 PM<br>
                                To: llvm-dev<br>
                                Subject: [llvm-dev] trunc nsw/nuw?<br>
                                <br>
                                <br>
                                Hello,<br>
                                <br>
                                 From [1], trunc does not seems to have
                                a nsw/nuw attribute.<br>
                                Is it possible to have that? Or do we
                                have that and it is not up-to-date?<br>
                                <br>
                                The definition would be:<br>
                                <br>
                                If the nuw keyword is present, the
                                result value of the trunc is a poison<br>
                                value if the truncated high order bits
                                are non-zero. If the nsw keyword is<br>
                                present, the result value of the trunc
                                is a poison value if the truncated<br>
                                high order bits are not all equal to the
                                non-truncated bit of the highest<br>
                                order.<br>
                                <br>
                                This allow to cancel out:<br>
                                - sext with trunc nsw<br>
                                - zext with trunc nuw<br>
                                <br>
                                And probably to commute with
                                add/sub/mul/lshr/ashr/shl/urem<wbr>/udiv/udiv
                                (with<br>
                                the correct flags).<br>
                                <br>
                                [1]: <a moz-do-not-send="true"
                                  href="http://llvm.org/docs/LangRef.html#trunc-to-instruction"
                                  rel="noreferrer" target="_blank">http://llvm.org/docs/LangRef.h<wbr>tml#trunc-to-instruction</a><br>
                                <br>
                                <br>
                                --<br>
                                <br>
                                Alexandre Isoard<br>
                                <br>
                                ______________________________<wbr>_________________<br>
                                LLVM Developers mailing list<br>
                                <a moz-do-not-send="true"
                                  href="mailto:llvm-dev@lists.llvm.org"
                                  target="_blank">llvm-dev@lists.llvm.org</a><br>
                                <a moz-do-not-send="true"
                                  href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev"
                                  rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
                              </blockquote>
                            </blockquote>
                            <br>
                            -- <br>
                          </div>
                        </div>
                        Hal Finkel<br>
                        Lead, Compiler Technology and Programming
                        Languages<br>
                        Leadership Computing Facility<br>
                        Argonne National Laboratory
                        <div class="m_-5682808666156860653HOEnZb">
                          <div class="m_-5682808666156860653h5"><br>
                            <br>
                            ______________________________<wbr>_________________<br>
                            LLVM Developers mailing list<br>
                            <a moz-do-not-send="true"
                              href="mailto:llvm-dev@lists.llvm.org"
                              target="_blank">llvm-dev@lists.llvm.org</a><br>
                            <a moz-do-not-send="true"
                              href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev"
                              rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
                          </div>
                        </div>
                      </blockquote>
                    </div>
                  </div>
                </div>
                <span class="HOEnZb"><font color="#888888"><br>
                    <br clear="all">
                    <div><br>
                    </div>
                    -- <br>
                    <div class="m_-5682808666156860653gmail_signature"
                      data-smartmail="gmail_signature">
                      <div dir="ltr"><b>Alexandre Isoard</b><br>
                      </div>
                    </div>
                  </font></span></div>
            </div>
          </blockquote>
        </div>
        <br>
        <br clear="all">
        <div><br>
        </div>
        -- <br>
        <div class="gmail_signature" data-smartmail="gmail_signature">
          <div dir="ltr"><b>Alexandre Isoard</b><br>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
  </body>
</html>