<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 - [LoopVectorizer] Suspected wrong code at -Os"
   href="https://bugs.llvm.org/show_bug.cgi?id=51794">51794</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[LoopVectorizer]  Suspected wrong code at -Os
          </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>Linux
          </td>
        </tr>

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

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>Loop Optimizer
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>paulsson@linux.vnet.ibm.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>This program:

int a, d = 0 <= 0;
int *b = &a;
short c = 5;
int main() {
  *b = d;
e:
  --c;
  *b &= b != 0;
  *b ^= -1L;
  if (c)
    goto e;
  printf("%d\n", a);
}

should print '-2', which it does except at -Os when it prints '0' (clang
-march=arch13 -O2 wrong0).

If the loop vectorizer is disabled, -2 is printed also at -Os.

Given that the loop is obviously executed 5 times I suspect that the check
whether to go into the vectorized loop or scalarized loop is wrong at -Os.

At -O2 this check seems correct:

  %c.promoted = load i16, i16* @c, align 2, !tbaa !8
  %2 = add i16 %c.promoted, -1
  %3 = zext i16 %2 to i32
  %4 = add nuw nsw i32 %3, 1
  %min.iters.check = icmp ult i32 %4, 16
  br i1 %min.iters.check, label %scalar.ph, label %vector.ph

This should mean that in this case only the scalar loop is executed.

However at -Os I see this instead:

  %c.promoted = load i16, i16* @c, align 2, !tbaa !8
  %2 = add i16 %c.promoted, -1
  %3 = zext i16 %2 to i32
  %4 = add nuw nsw i32 %3, 1
  br i1 false, label %scalar.ph, label %vector.ph

For some reason the vectorized loop is now always executed, which in this case
should not happen as it will then run more times than intended (at least 16).
This seems strange as the result after iterations are not constant but are
rather toggling and ending up at -2 after exactly 5 iterations, if I am not
mistaken...</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>