<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 --- - Optimizer should consider "maythrow" calls (those without "nounwind) as having side effects."
   href="http://llvm.org/bugs/show_bug.cgi?id=18912">18912</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Optimizer should consider "maythrow" calls (those without "nounwind) as having side effects.
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </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>normal
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>new bugs
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>atrick@apple.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>We should not allow instructions with potential side effects to move
across mayThrow calls. This is an informally accepted interpretation of
the LLVM SPEC. However, in practice, optimizations rely too heavily on
the presence of memory writes to model side effects.

We want to be able to define a call as "readonly" and *not* "nounwind". We want
to be able to eliminate redundant loads across such calls, however, we do not
want potentially unsafe loads to be hoisted above such calls. We also do not
want to allow such calls to be reordered with respect to each other, and other
readonly && mayThrow instructions.

This is important for implementing runtime calls, as commonly needed for high
level language constructs. It also allows llvm.experimental.stackmap to be
modeled correctly.

The purpose of this PR is to complete an audit of the optimizer/codegen to
catch cases that violate the assumptions above, improve the API, and better
document this requirement.

Here is just one example where codegen violates the rule:

int32_t foo(int32_t* ptr) { 
  int i = 0; 
  int result; 
  do { 
    bar(ptr); 
    result = *ptr; 
    bar(ptr); 
  } while (i++ < *ptr); 
  return result; 


declare void @bar(i32*) readonly; 

(So 'bar' is 'readonly' and 'may-unwind')

When LICM tries to sink the calls to 'bar', it sees the 'readonly', assumes no
side effects and sinks it below the loads.</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>