<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 08/01/2017 12:28 PM, Adrian Prantl
      wrote:<br>
    </div>
    <blockquote
      cite="mid:16D0F1E8-BF40-47F9-BD2B-1E8D197957D6@apple.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <br class="">
      <div>
        <blockquote type="cite" class="">
          <div class="">On Aug 1, 2017, at 10:20 AM, Hal Finkel <<a
              moz-do-not-send="true" href="mailto:hfinkel@anl.gov"
              class="">hfinkel@anl.gov</a>> wrote:</div>
          <br class="Apple-interchange-newline">
          <div class="">
            <div bgcolor="#FFFFFF" text="#000000" class="">
              <p class=""><br class="">
              </p>
              <div class="moz-cite-prefix">On 08/01/2017 11:54 AM, David
                Blaikie wrote:<br class="">
              </div>
              <blockquote
cite="mid:CAENS6EvM7VPmpJZg6CDwzSvYSide9ByFvQB5cSAKBneu+PewTA@mail.gmail.com"
                type="cite" class="">
                <div dir="ltr" class=""><br class="">
                  <br class="">
                  <div class="gmail_quote">
                    <div dir="ltr" class="">On Tue, Aug 1, 2017 at 9:43
                      AM Hal Finkel <<a moz-do-not-send="true"
                        href="mailto:hfinkel@anl.gov" class="">hfinkel@anl.gov</a>>
                      wrote:<br class="">
                    </div>
                    <blockquote class="gmail_quote" style="margin:0 0 0
                      .8ex;border-left:1px #ccc solid;padding-left:1ex">
                      <div bgcolor="#FFFFFF" text="#000000" class="">
                        <p class=""><br class="">
                        </p>
                        <div class="m_838875341229329508moz-cite-prefix">On
                          08/01/2017 11:28 AM, Adrian Prantl via
                          llvm-commits wrote:<br class="">
                        </div>
                        <blockquote type="cite" class=""> <br class="">
                          <div class="">
                            <blockquote type="cite" class="">
                              <div class="">On Aug 1, 2017, at 9:24 AM,
                                David Blaikie <<a
                                  moz-do-not-send="true"
                                  href="mailto:dblaikie@gmail.com"
                                  target="_blank" class="">dblaikie@gmail.com</a>>
                                wrote:</div>
                              <br
                                class="m_838875341229329508Apple-interchange-newline">
                              <div class="">
                                <div dir="ltr"
style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"
                                  class=""><br class="">
                                  <br class="">
                                  <div class="gmail_quote">
                                    <div dir="ltr" class="">On Tue, Aug
                                      1, 2017 at 9:04 AM Adrian Prantl
                                      via Phabricator <<a
                                        moz-do-not-send="true"
                                        href="mailto:reviews@reviews.llvm.org"
                                        target="_blank" class="">reviews@reviews.llvm.org</a>>
                                      wrote:<br class="">
                                    </div>
                                    <blockquote class="gmail_quote"
                                      style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">aprantl
                                      added inline comments.<br class="">
                                      <br class="">
                                      <br class="">
                                      ================<br class="">
                                      Comment at:
                                      lib/Transforms/IPO/GlobalOpt.cpp:1577<br
                                        class="">
                                      +  for(auto *GV : GVs)<br class="">
                                      +    NewGV->addDebugInfo(GV);<br
                                        class="">
                                      +<br class="">
                                      ----------------<br class="">
                                      NikolaPrica wrote:<br class="">
                                      > aprantl wrote:<br class="">
                                      > > I'm not familiar with
                                      this transformation: Do we need to
                                      add a DIExpression to mask out all
                                      but the first bit (i.e. can
                                      multiple bools be packed into the
                                      same uint32_t such that it could
                                      confuse debuggers)?<br class="">
                                      > The debug info which is
                                      provided here with addDebugInfo
                                      later generates address of the
                                      variable (DW_OP_addr: xxxx) in
                                      DW_AT_location. If we provide here
                                      metadata which is for 1byte
                                      variable  the debugger would get
                                      confused because the enum type is
                                      written as 4-byte and he would try
                                      to read 4 bytes. This is just
                                      temporary fix until proper way to
                                      handle this is found.<br class="">
                                      If I understood you correctly then
                                      the best way to represent this
                                      would be a `DW_OP_LLVM_fragment
                                      /*offset*/0 /*bitsize*/1 (or 8?)`<br
                                        class="">
                                      expression. This will get lowered
                                      into a DW_OP_bit_piece to tell the
                                      debugger that this location is
                                      describing of the first n bits of
                                      the variable.<br class="">
                                    </blockquote>
                                    <div class=""><br class="">
                                      A slight problem with this is that
                                      at least GDB won't print a single
                                      value if it's partially
                                      unavailable (eg: if it's a struct
                                      and the fragment describes one
                                      member but not the othe,r I think
                                      that's OK - but if it's a single
                                      int and only one out of 4 bytes
                                      are described - well, the value is
                                      known/unknowable).<br class="">
                                      <br class="">
                                    </div>
                                  </div>
                                </div>
                              </div>
                            </blockquote>
                            <div class=""><br class="">
                            </div>
                            <div class="">A debugger would have to print
                              the value as something like 0x??????01 to
                              indicate that pieces are missing. But no
                              debugger I'm aware of does that.</div>
                            <br class="">
                            <blockquote type="cite" class="">
                              <div class="">
                                <div dir="ltr"
style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"
                                  class="">
                                  <div class="gmail_quote">
                                    <div class="">If this optimization
                                      is really based on the proof that
                                      the other bytes are unused, never
                                      written to or read, then a
                                      fragment describing the other
                                      bytes as constant zero would be
                                      good to have as well.<br class="">
                                    </div>
                                  </div>
                                </div>
                              </div>
                            </blockquote>
                          </div>
                        </blockquote>
                        <br class="">
                      </div>
                      <div bgcolor="#FFFFFF" text="#000000" class="">
                        No, it is more complicated than that. See
                        TryToShrinkGlobalToBoolean in
                        lib/Transforms/IPO/GlobalOpt.cpp. It is looking
                        for cases where the global is only set to one
                        initialized value and one other value. In that
                        case, it can make a Boolean global and replace
                        uses of that Global with selects over that
                        value.</div>
                    </blockquote>
                    <div class=""><br class="">
                      Oh, wait - you mean a variable with value 42 and
                      87 gets collapsed to a boolean where true/1 is
                      used to represent 42 and false/0 is used to
                      represent 87?<br class="">
                    </div>
                  </div>
                </div>
              </blockquote>
              <br class="">
              Yes. The code does this:<br class="">
              <br class="">
                    // Change the load into a load of bool then a
              select.<br class="">
                    LoadInst *LI = cast<LoadInst>(UI);<br class="">
                    LoadInst *NLI = new LoadInst(NewGV,
              LI->getName()+".b", false, 0,<br class="">
                                                 LI->getOrdering(),
              LI->getSyncScopeID(), LI);<br class="">
                    Value *NSI;<br class="">
                    if (IsOneZero)<br class="">
                      NSI = new ZExtInst(NLI, LI->getType(), "", LI);<br
                class="">
                    else<br class="">
                      NSI = SelectInst::Create(NLI, OtherVal, InitVal,
              "", LI);<br class="">
                    NSI->takeName(LI);<br class="">
                    LI->replaceAllUsesWith(NSI);<br class="">
            </div>
          </div>
        </blockquote>
        <div><br class="">
        </div>
        <div>Whoa — this is going to be fun! A DWARF expression for that
          example might look like:</div>
        <div><br class="">
        </div>
        <div>DW_OP_constu 42 DW_OP_mul DW_OP_dup DW_OP_bra +2 DW_OP_skip
          +<end-1> DW_OP_constu 87 DW_OP_constu DW_OP_stack_value </div>
        <div><br class="">
        </div>
        <div>roughly: if (Val * 42) return Val * 42; else return 87;</div>
      </div>
    </blockquote>
    <br>
    Why can't you just encode: 'if (Val) return 42; else return 87;'?<br>
    <br>
     -Hal<br>
    <br>
    <blockquote
      cite="mid:16D0F1E8-BF40-47F9-BD2B-1E8D197957D6@apple.com"
      type="cite">
      <div>
        <div><br class="">
        </div>
        <div>-- adrian</div>
        <blockquote type="cite" class="">
          <div class="">
            <div bgcolor="#FFFFFF" text="#000000" class=""> <br
                class="">
               -Hal<br class="">
              <br class="">
              <blockquote
cite="mid:CAENS6EvM7VPmpJZg6CDwzSvYSide9ByFvQB5cSAKBneu+PewTA@mail.gmail.com"
                type="cite" class="">
                <div dir="ltr" class="">
                  <div class="gmail_quote">
                    <div class=""><br class="">
                      Oh. Yeah. That's a bit more involved. (but nice
                      that it means we can represent the values exactly
                      - hopefully)<br class="">
                      <br class="">
                      Thanks!<br class="">
                       </div>
                    <blockquote class="gmail_quote" style="margin:0 0 0
                      .8ex;border-left:1px #ccc solid;padding-left:1ex">
                      <div bgcolor="#FFFFFF" text="#000000" class=""> I
                        think you actually want to generate a DWARF
                        expression for these.<br class="">
                        <br class="">
                         -Hal<br class="">
                        <br class="">
                      </div>
                      <div bgcolor="#FFFFFF" text="#000000" class="">
                        <blockquote type="cite" class="">
                          <div class="">
                            <div class=""><br class="">
                            </div>
                            Agreed, that would be the most practical
                            solution — if we can prove that it is
                            correct.</div>
                          <div class=""><br class="">
                          </div>
                          <div class="">-- adrian<br class="">
                            <blockquote type="cite" class="">
                              <div class="">
                                <div dir="ltr"
style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"
                                  class="">
                                  <div class="gmail_quote">
                                    <div class=""><br class="">
                                      But I doubt that's the case - no
                                      doubt if we can see all the reads
                                      and writes, we optimize away the
                                      writes if we know they won't be
                                      read, so we may end up with only
                                      the one byte. C'est la vie.<br
                                        class="">
                                      <br class="">
                                      Just mention it to
                                      check/understand what the
                                      optimization is/isn't doing, etc.<br
                                        class="">
                                       </div>
                                    <blockquote class="gmail_quote"
                                      style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br
                                        class="">
                                      <br class="">
                                      <a moz-do-not-send="true"
                                        href="https://reviews.llvm.org/D35994"
                                        rel="noreferrer" target="_blank"
                                        class="">https://reviews.llvm.org/D35994</a></blockquote>
                                  </div>
                                </div>
                              </div>
                            </blockquote>
                          </div>
                          <br class="">
                          <br class="">
                          <fieldset
                            class="m_838875341229329508mimeAttachmentHeader"></fieldset>
                          <br class="">
                          <pre class="">_______________________________________________
llvm-commits mailing list
<a moz-do-not-send="true" class="m_838875341229329508moz-txt-link-abbreviated" href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>
<a moz-do-not-send="true" class="m_838875341229329508moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a>
</pre>
                        </blockquote>
                      </div>
                      <div bgcolor="#FFFFFF" text="#000000" class=""> <br
                          class="">
                        <pre class="m_838875341229329508moz-signature" cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
                      </div>
                    </blockquote>
                  </div>
                </div>
              </blockquote>
              <br class="">
              <pre class="moz-signature" cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
            </div>
          </div>
        </blockquote>
      </div>
      <br class="">
    </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>