<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Benjamin,<br>
    <br>
    This doesn't really feel like the right approach to the problem. 
    Adding another run of GVN after every unrolling opportunity is a
    fairly heavy weight hammer.  Have you looked to see if there's a
    simple change you could make to the unroller itself to handle this
    case?  I haven't looked at the code, but my suspicion is there would
    be.<br>
    <br>
    Philip<br>
    <br>
    <div class="moz-cite-prefix">On 11/29/2014 12:59 PM, Benjamin
      Poulain wrote:<br>
    </div>
    <blockquote cite="mid:547A33AB.1040105@webkit.org" type="cite">Hi,
      <br>
      <br>
      I noticed the optimized code generated for loops often include
      redundant checks that the size is not zero.
      <br>
      <br>
      For example, code like this:
      <br>
        unsigned total = 0;
      <br>
        for (unsigned i = 0; i < size; ++i) { ...
      <br>
      <br>
      when optimized, generate the following prologue:
      <br>
        entry:
      <br>
          %cmp4 = icmp eq i32 %size, 0
      <br>
          br i1 %cmp4, label %for.end, label %for.body.lr.ph
      <br>
      <br>
        for.body.lr.ph:                                   ; preds =
      %entry
      <br>
         %0 = add i32 %size, -1
      <br>
          %xtraiter = and i32 %size, 3
      <br>
          %lcmp.mod = icmp ne i32 %xtraiter, 0
      <br>
          %lcmp.overflow = icmp eq i32 %size, 0
      <br>
          %lcmp.or = or i1 %lcmp.overflow, %lcmp.mod
      <br>
          br i1 %lcmp.or, label %for.body.prol, label
      %for.body.lr.ph.split
      <br>
      <br>
      Notice the redundant test for "icmp eq i32 %size, 0". When
      compiled to target, we have one redundant check per loop that can
      never be true.
      <br>
      <br>
      The extra check for size==0 comes from LoopUnroll. It is never
      optimized out because LoopUnrollPass is run after the passes that
      could eliminate redundant conditions.
      <br>
      <br>
      I have attached a patch that fixes the problem. For every pass of
      LoopUnroll, I added a GVN pass to remove every redundant
      conditions and branches. My patch is without test, I need guidance
      on how to properly test this.
      <br>
      <br>
      Benjamin
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
llvm-commits mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>