<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </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 --- - Failure to exploit loop invariant store"
   href="http://llvm.org/bugs/show_bug.cgi?id=21797">21797</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Failure to exploit loop invariant store
          </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>listmail@philipreames.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>At O3, we are currently failing to exploit the loop invariant store in the
following example:
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @readmem() readonly

; Function Attrs: noreturn
define void @test1(i32* nonnull dereferenceable(4) %p, i32 %v) {
entry:
  br label %for.body

for.body:                                         ; preds = %for.body, %entry
  store i32 %v, i32* %p, align 4
  tail call void @readmem()
  br label %for.body
}

The store is of a loop invariant value to a loop invariant location.  The
address does not alias with any other store in the loop.  We should be able to
lift the store before the loop and execute it exactly once.  

This might be implemented as a special case in LICM, but it could also be
handled by ensuring the loop is unrolled and recognizing that the store still
in the loop has become fully redundant.  I'm unsure which would be easier to
implement and/or more worthwhile.  

I am unsure of the general applicability of this case.  I saw it come up in one
of our internal benchmarks, but only due to another optimizer bug.  I'm filing
it mostly because it seems like an interesting transform to consider.</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>