<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 1, 2017, at 10:53 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">DW_OP_bra looks like it'd be a bit of a pain to work with since it's number of bytes (so you'll have to figure out the actual length of the expression sequence - not just the number of operations, etc). The LEB encoding in particular worries me a bit as being a pain to have to do that first, then compute the encoded length to figure out how many bytes to skip, etc. But that's not impossible/that arcane or anything...  If that works out OK, great. :)<br class=""></div></div></blockquote><div><br class=""></div><div>In DIExpression we could use the convention that the argument to DW_OP_bra encodes the number of operations (=DIExpression::ExprOperand iterators) to skip. In DwarfExpression.cpp we could get AsmPrinter to report back the length of the everything emitted (including the LEBs) — what is tricky is how to encode a forward reference such as the number of bytes to skip until the end of the expression. We would have to make DwarfExpression run two passes: first emit the expression into a buffer and then fix up the relative jump targets.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class="">(alternatively we could do some arithmetic and take the 42/87 example: (87 - 42) * val + 42. Admittedly it works easily when the 1 boolean value is associated with the larger of the two numbers... - but may be easier to do the more verbose & fussy (in terms of the byte computatiotns) version that's a bit more explicit about the values being used, etc)<br class=""></div></div></blockquote><div><br class=""></div><div>Another reason to prefer purely arithmetic solutions is that they might be (though I don't know enough about that) easier to compile into CodeView that arbitrary programs with control flow in them.</div><div><br class=""></div><div>Here's another attempt that doesn't assume anything about the two values:</div><div><br class=""></div><div>// val * 42 | ((~val)&1) * 87</div><div>DW_OP_dup DW_OP_constu 42 DW_OP_mul DW_OP_swap</div><div>DW_OP_not DW_OP_lit1 DW_OP_and DW_OP_constu 87 DW_OP_mul</div><div>DW_OP_or DW_OP_stack_value</div><div><br class=""></div>-- adrian<br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><br class="">*shrug* :)</div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Tue, Aug 1, 2017 at 10:47 AM Adrian Prantl <<a href="mailto:aprantl@apple.com" class="">aprantl@apple.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class=""><blockquote type="cite" class=""><div class="">On Aug 1, 2017, at 10:35 AM, Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank" class="">hfinkel@anl.gov</a>> wrote:</div><br class="m_5082754805788286079Apple-interchange-newline"><div class="">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000" class=""><p class=""><br class="">
    </p>
    <div class="m_5082754805788286079moz-cite-prefix">On 08/01/2017 12:28 PM, Adrian Prantl
      wrote:<br class="">
    </div>
    <blockquote type="cite" class="">
      
      <br class="">
      <div class="">
        <blockquote type="cite" class="">
          <div class="">On Aug 1, 2017, at 10:20 AM, Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank" class="">hfinkel@anl.gov</a>> wrote:</div>
          <br class="m_5082754805788286079Apple-interchange-newline">
          <div class="">
            <div bgcolor="#FFFFFF" text="#000000" class=""><p class=""><br class="">
              </p>
              <div class="m_5082754805788286079moz-cite-prefix">On 08/01/2017 11:54 AM, David
                Blaikie wrote:<br class="">
              </div>
              <blockquote 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 href="mailto:hfinkel@anl.gov" target="_blank" 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_5082754805788286079m_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 href="mailto:dblaikie@gmail.com" target="_blank" class="">dblaikie@gmail.com</a>>
                                wrote:</div>
                              <br class="m_5082754805788286079m_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 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 class=""><br class="">
        </div>
        <div class="">Whoa — this is going to be fun! A DWARF expression for that
          example might look like:</div>
        <div class=""><br class="">
        </div>
        <div class="">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 class=""><br class="">
        </div>
        <div class="">roughly: if (Val * 42) return Val * 42; else return 87;</div>
      </div>
    </blockquote>
    <br class="">
    Why can't you just encode: 'if (Val) return 42; else return 87;'?<br class=""></div></div></blockquote><div class=""><br class=""></div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class="">Yes that would be even shorter.</div><div class="">DW_OP_bra +4? DW_OP_constu 42 DW_OP_skip +<end-1> DW_OP_constu 87 DW_OP_constu DW_OP_stack_value</div><div class=""><div class=""> I started out with trying to craft an expression that wouldn't need any control flow and then got carried away :-)</div></div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class=""><br class=""></div><div class="">-- adrian</div></div></div><div style="word-wrap:break-word" class=""><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class="">
    <br class="">
     -Hal<br class="">
    <br class="">
    <blockquote type="cite" class="">
      <div class="">
        <div class=""><br class="">
        </div>
        <div class="">-- adrian</div>
        <blockquote type="cite" class="">
          <div class="">
            <div bgcolor="#FFFFFF" text="#000000" class=""> <br class="">
               -Hal<br class="">
              <br class="">
              <blockquote 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 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_5082754805788286079m_838875341229329508mimeAttachmentHeader"></fieldset>
                          <br class="">
                          <pre class="">_______________________________________________
llvm-commits mailing list
<a class="m_5082754805788286079m_838875341229329508moz-txt-link-abbreviated" href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>
<a class="m_5082754805788286079m_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_5082754805788286079m_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="m_5082754805788286079moz-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 class="">
    <pre class="m_5082754805788286079moz-signature" cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
  </div>

</div></blockquote></div></div></blockquote></div>
</div></blockquote></div><br class=""></body></html>