<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 --- - [EarlyCSE, Missed Opt] Value forwarding based on writes which are not stores"
   href="http://llvm.org/bugs/show_bug.cgi?id=20809">20809</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[EarlyCSE, Missed Opt] Value forwarding based on writes which are not stores
          </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>Scalar Optimizations
          </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>Created <span class=""><a href="attachment.cgi?id=12959" name="attach_12959" title="Failing test case for EarlyCSE (undef load from malloc)">attachment 12959</a> <a href="attachment.cgi?id=12959&action=edit" title="Failing test case for EarlyCSE (undef load from malloc)">[details]</a></span>
Failing test case for EarlyCSE (undef load from malloc)

In EarlyCSE, we currently perform value forwarding on loads from the same
generation and the single write which defines the generation.  We also define a
new generation for other instructions which may write (rmw ops, calls, etc),
and some of those have well defined effects that we can exploit.  

As an example, consider a load which reads uninitialized memory.  We can
forward an undef value to the consumers of the load.  For example (also
attached):
declare i8* @malloc(i64) nounwind
define i8 @test1() {
entry:
  %call = tail call i8* @malloc(i64 100) nounwind
  %0 = load i8* %call, align 1 <-- can become undef
  ret i8 %0
}

Similarly, there are some classes of stores which can be trivially removed.  As
an example, we can remove stores of a zero value to calloc initialized memory
(if there are no intervening stores).  

Both of these optimizations are already implemented elsewhere (GVN and DSE
respectively), but would be cheap to implement in EarlyCSE and may expose
additional optimization oppurtunities in later passes.  My suggested
implementation strategy would be to extract the current functionality as a set
of helper routines and use them in both passes.  

Going even one step farther, some non-load instructions have well understood
read sets.  (Ex: memcpy from malloced memory)  This might be worth exploring as
well, but is substaintially more complicated and is probably best done as a
separate effort.</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>