<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><span class="vcard"><a class="email" href="mailto:richard-llvm@metafoo.co.uk" title="Richard Smith <richard-llvm@metafoo.co.uk>"> <span class="fn">Richard Smith</span></a>
</span> changed
          <a class="bz_bug_link 
          bz_status_RESOLVED  bz_closed"
   title="RESOLVED INVALID - Wrong condition evaluation"
   href="https://bugs.llvm.org/show_bug.cgi?id=39707">bug 39707</a>
          <br>
             <table border="1" cellspacing="0" cellpadding="8">
          <tr>
            <th>What</th>
            <th>Removed</th>
            <th>Added</th>
          </tr>

         <tr>
           <td style="text-align:right;">Status</td>
           <td>NEW
           </td>
           <td>RESOLVED
           </td>
         </tr>

         <tr>
           <td style="text-align:right;">Resolution</td>
           <td>---
           </td>
           <td>INVALID
           </td>
         </tr></table>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_RESOLVED  bz_closed"
   title="RESOLVED INVALID - Wrong condition evaluation"
   href="https://bugs.llvm.org/show_bug.cgi?id=39707#c5">Comment # 5</a>
              on <a class="bz_bug_link 
          bz_status_RESOLVED  bz_closed"
   title="RESOLVED INVALID - Wrong condition evaluation"
   href="https://bugs.llvm.org/show_bug.cgi?id=39707">bug 39707</a>
              from <span class="vcard"><a class="email" href="mailto:richard-llvm@metafoo.co.uk" title="Richard Smith <richard-llvm@metafoo.co.uk>"> <span class="fn">Richard Smith</span></a>
</span></b>
        <pre>(In reply to Roger from <a href="show_bug.cgi?id=39707#c4">comment #4</a>)
<span class="quote">> opt_bootscrub lives in the .init section, and whether the virtual address is
> valid or not depends on the value of system_state (mappings for .init data
> are removed if system_state >= SYS_STATE_active).</span >

I see, thanks for explaining.

LLVM assumes that regular global variables don't behave this way (and in
particular, that loads and stores of them have no side-effects beyond the
memory being stored). This is not really specific to LLVM, though; other
optimizing compilers make similar assumptions. As far as I'm aware, we don't
have any flag or setting to turn this off when optimizing.

Because a load or store of this variable *does* have an additional side-effect
beyond the normal semantics (in particular, it can trap if the section
containing it has been unmapped), the variable should be marked 'volatile' to
prevent accesses of it being speculated or reordered.

I'm going to mark this as working as intended on the above basis, but please do
reopen if you still see this load being speculated when the variable is marked
as volatile, or if there's something in the code that you think should already
be sufficient to imply that the load of the variable can't be hoisted. (Also,
if GCC has a flag to turn off this assumption or similar, we'd probably be
interested in a compatibility feature for that.)</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>