<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 - [EarlyCSE] recognize swapped form of selects"
   href="https://bugs.llvm.org/show_bug.cgi?id=41101">41101</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[EarlyCSE] recognize swapped form of selects
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </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>Scalar Optimizations
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>spatel+llvm@rotateright.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>%sel2 is the same value as %sel1:

define void @f(i8 %a, i8 %b, i8 %c, i8 %d, i8* %p1, i8* %p2) {
  %cmp1 = icmp ult i8 %a, %b
  %sel1 = select i1 %cmp1, i8 %c, i8 %d
  store i8 %sel1, i8* %p1
  %cmp2 = icmp uge i8 %a, %b
  %sel2 = select i1 %cmp2, i8 %d, i8 %c
  store i8 %sel2, i8* %p2
  ret void
}

This minimal example would be handled by instcombine canonicalizations, but
that can fail when the compares have multiple uses.

We should also match the pattern where the select condition is inverted from
the 1st cmp:

define void @f(i8 %a, i8 %b, i8 %c, i8 %d, i8* %p1, i8* %p2) {
  %cmp = icmp ult i8 %a, %b
  %sel1 = select i1 %cmp, i8 %c, i8 %d
  store i8 %sel1, i8* %p1
  %not = xor i1 %cmp, true
  %sel2 = select i1 %not, i8 %d, i8 %c
  store i8 %sel2, i8* %p2
  ret void
}

This should also work with fcmp.</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>