<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">This just looks like a temporary stack variable wasn’t properly eliminated because the compiler modeled `Operand` internally as an “i64” which i386 doesn’t natively support. A further reduction, with notes about changes that sidestep the bug:<div class=""><br class=""><div class=""><a href="https://godbolt.org/z/zcCguv" class="">https://godbolt.org/z/zcCguv</a><br class=""><div><br class=""></div><div><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class="">On Oct 26, 2019, at 12:28 AM, Seth Brenith via llvm-dev <llvm-dev@lists.llvm.org> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Hello folks,<o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I’ve recently been looking at the generated code for a few functions in Chromium while investigating crashes, and I came across a curious pattern. A smallish repro case is available at<span class="Apple-converted-space"> </span><a href="https://godbolt.org/z/Dsu1WI" style="color: rgb(149, 79, 114); text-decoration: underline;" class="">https://godbolt.org/z/Dsu1WI</a><span class="Apple-converted-space"> </span>. In that case, the function Assembler::emit_arith receives a struct (Operand) by value and passes it by value to another function. That struct is 8 bytes long, so the -O3 generated code uses movsd to copy it up the stack. However, we end up with some loads that aren’t needed, as in the following chunk:<o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="color: blue;" class="">movsd</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: rgb(72, 100, 170);" class="">xmm0</span><span style="" class="">,<span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">qword</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">ptr</span><span style="" class=""><span class="Apple-converted-space"> </span>[</span><span style="color: rgb(72, 100, 170);" class="">ecx</span><span style="" class="">]<span class="Apple-converted-space"> </span></span><span style="color: green;" class=""># xmm0 = mem[0],zero</span><o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="color: blue;" class="">mov</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">dword</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">ptr</span><span style="" class=""><span class="Apple-converted-space"> </span>[</span><span style="color: rgb(72, 100, 170);" class="">esp</span><span style="" class=""><span class="Apple-converted-space"> </span>+<span class="Apple-converted-space"> </span></span><span style="color: rgb(9, 136, 90);" class="">24</span><span style="" class="">],<span class="Apple-converted-space"> </span></span><span style="color: rgb(72, 100, 170);" class="">edx</span><o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="color: blue;" class="">movsd</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">qword</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">ptr</span><span style="" class=""><span class="Apple-converted-space"> </span>[</span><span style="color: rgb(72, 100, 170);" class="">esp</span><span style="" class=""><span class="Apple-converted-space"> </span>+<span class="Apple-converted-space"> </span></span><span style="color: rgb(9, 136, 90);" class="">40</span><span style="" class="">],<span class="Apple-converted-space"> </span></span><span style="color: rgb(72, 100, 170);" class="">xmm0</span><o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="color: blue;" class="">movsd</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: rgb(72, 100, 170);" class="">xmm0</span><span style="" class="">,<span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">qword</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">ptr</span><span style="" class=""><span class="Apple-converted-space"> </span>[</span><span style="color: rgb(72, 100, 170);" class="">esp</span><span style="" class=""><span class="Apple-converted-space"> </span>+<span class="Apple-converted-space"> </span></span><span style="color: rgb(9, 136, 90);" class="">40</span><span style="" class="">]<span class="Apple-converted-space"> </span></span><span style="color: green;" class=""># xmm0 = mem[0],zero</span><o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><span style="color: blue;" class="">movsd</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">qword</span><span style="" class=""><span class="Apple-converted-space"> </span></span><span style="color: teal;" class="">ptr</span><span style="" class=""><span class="Apple-converted-space"> </span>[</span><span style="color: rgb(72, 100, 170);" class="">esp</span><span style="" class=""><span class="Apple-converted-space"> </span>+<span class="Apple-converted-space"> </span></span><span style="color: rgb(9, 136, 90);" class="">8</span><span style="" class="">],<span class="Apple-converted-space"> </span></span><span style="color: rgb(72, 100, 170);" class="">xmm0</span><o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">As far as I can tell, the fourth line has no effect. On its own, that seems like a small missed opportunity for optimization. However, this sequence of instructions also appears to trigger a hardware bug on a small fraction of devices which sometimes end up storing zero at esp+8. A more in-depth discussion of that issue can be found here:<span class="Apple-converted-space"> </span><a href="https://bugs.chromium.org/p/v8/issues/detail?id=9774" style="color: rgb(149, 79, 114); text-decoration: underline;" class="">https://bugs.chromium.org/p/v8/issues/detail?id=9774</a><span class="Apple-converted-space"> </span>.<o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">I’m hoping that getting rid of the second load in the sequence above would appease these misbehaving machines (though of course I don’t know that it would), as well as making the code a little smaller for everybody else. Does that sound like a reasonable idea? Would LLVM be interested in a patch related to eliminating reloads like this? Does anybody have advice about where I should start looking, or any reasons it would be very hard to achieve the result I’m hoping for?<o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Thanks,<o:p class=""></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">Seth<o:p class=""></o:p></div></div><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">_______________________________________________</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">LLVM Developers mailing list</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="mailto:llvm-dev@lists.llvm.org" style="color: rgb(149, 79, 114); text-decoration: underline; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">llvm-dev@lists.llvm.org</a><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" style="color: rgb(149, 79, 114); text-decoration: underline; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a></div></blockquote></div><br class=""></div></div></body></html>