<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - combineRepeatedFPDivisors may not generate a reciprocal outside of a loop"
   href="https://bugs.llvm.org/show_bug.cgi?id=32157">32157</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>combineRepeatedFPDivisors may not generate a reciprocal outside of a loop
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>4.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Macintosh
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>MacOS X
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Backend: X86
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>vit9696@avp.su
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=18059" name="attach_18059" title="fdiv replacement failure showcase">attachment 18059</a> <a href="attachment.cgi?id=18059&action=edit" title="fdiv replacement failure showcase">[details]</a></span>
fdiv replacement failure showcase

As discussed in <a href="http://lists.llvm.org/pipermail/llvm-dev/2017-March/110736.html">http://lists.llvm.org/pipermail/llvm-dev/2017-March/110736.html</a>
LLVM seems to sometimes fail to hoist the division out of a loop and replace it
with a multiplication by a reciprocal.

I included all the three C samples and their generated IR as an attachment.

First one is a basic example of the issue. There are two fdivs in two separate
basic blocks, and for this reason they seem to be not hoisted outside the loop.
The C code for it is as follows:

__attribute__ ((noinline)) bool calculate(double c) {
        uint32_t b = 0;
        uint32_t a = 0;
        while (b < 0xFFFFFFFF) {
                if ((uint64_t)(b / c) % 2 == 0)
                        a++;
                b++;
        }
        return a;
}

Second one is a basic example of the issue not happening. To do so 0xFFFFFFFF
is replaced by 0xFFFFFFF0 to get only one basic block created.

Third one is an example where there is only one fdiv inside the loop, which
does not get hoisted due to a x86-64 specific threshold equaling to 2. However,
gcc and icc seem to still generate a reciprocal in this case, so perhaps llvm
should take the same approach. 

The issue exists because not generating a reciprocal for these samples makes
the generated code approximately twice slower than the same from gcc/icc on
intel haswell. This is currently reproducible with 3.9.1/4.0.0rc2 given that
the source code is compiled with -O3 -ffast-math flag, which enables the
optimisation.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>