val x = valOf (Word64.fromString &quot;1234567890abcdef&quot;)<br>val y = MLton.Word64.ror (x, 0w32)<br>val z = Word64.orb (Word64.&lt;&lt; (x, 0w32), Word64.&gt;&gt; (x, 0w32))<br><br>val () = print (Word64.toString y ^ &quot;\n&quot;)<br>

val () = print (Word64.toString z ^ &quot;\n&quot;)<br><br>Output:<br>1234567890ABCDEF<br>90ABCDEF12345678<br><br>Expected output:<br>90ABCDEF12345678<br>90ABCDEF12345678<br><br>I&#39;ve checked that this bug is NOT from gcc by compiling the following:<br>
#include &lt;stdint.h&gt;<br>#include &lt;stdio.h&gt;<br><br>uint64_t Word64_ror(uint64_t w1, uint32_t w2);<br><br>int main () {<br>  uint64_t x = Word64_ror(0x1234567890ABCDEFUL, 32);<br>  printf (&quot;%llX\n&quot;, x);<br>
  return 0;<br>}<br>gcc -Wall -O2 bug.c /usr/lib/mlton/self/libmlton.a -o bug<br><br>Output:<br>90ABCDEF12345678<br><br>The number 0w32 strikes me as a case that someone probably optimized incorrectly.<br><br>