<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/114194>114194</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86][CodeGen] Miscompilation due to transformation in LiveRangeShrink
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
MuellerMP
</td>
</tr>
</table>
<pre>
Invoking LLC with the sample IR code below results in a miscompile:
The reload of spilled stack values is hoisted in front of the start of a landingpad, resulting in undefined behavior when unwinding.
The issue can be reproduced in godbolt: https://llvm.godbolt.org/z/rnxzE19eP
If we look at the opt pipeline viewer, we can see that lrshrink is hoisting the add for two phis in front of the EHLabel.
Sample IR code:
```llvm
target triple = "x86_64-unknown-linux-gnu"
declare i32 @__gxx_personality_v0(...)
declare void @maythrow()
declare void @cleanup(i32)
@external_bool = external global i1
@externalA = external global i32
@externalB = external global i32
@externalC = external global i32
@externalD = external global i32
define void @test() personality ptr @__gxx_personality_v0 {
%1 = load i1, ptr @external_bool
br i1 %1, label %branchA, label %branchB
branchA:
%valueA = load i32, ptr @externalA
%valueC = load i32, ptr @externalC
; force spill
call void asm sideeffect "", "~{rbp},~{rsi},~{rdi},~{rcx},~{rbx},~{r12},~{r13},~{r14},~{r15},~{flags}"()
invoke void @maythrow() to label %end unwind label %lpad
branchB:
%valueB = load i32, ptr @externalB
%valueD = load i32, ptr @externalD
; force spill
call void asm sideeffect "", "~{rbp},~{rsi},~{rdi},~{rcx},~{rbx},~{r12},~{r13},~{r14},~{r15},~{flags}"()
invoke void @maythrow() to label %end unwind label %lpad
lpad:
%phiValue = phi i32 [%valueA, %branchA], [%valueB, %branchB]
%phiValue2 = phi i32 [%valueC, %branchA], [%valueD, %branchB]
%lp = landingpad { ptr, i32 }
cleanup
%3 = add i32 %phiValue2, %phiValue
call void @cleanup(i32 %3)
resume { ptr, i32 } %lp
end:
ret void
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVtuOozgTfhrnptQRGHLgIhc5TP5_pG5pNLNa7V1kcAHedmxkmyQ9F_vsKxtISB-m5wG2hTpU8dW5XC5mragU4orMNmS2m7DW1dqsnlqUEs3Tt0mu-cvqqzrpZ6EqeHzcwlm4GlyNYNmxkQhfv0OhOUKOUp_BoG2lsyAUMDgKW-hjIySSZA0k2pFo_UeNYFBqxkGXYBshJXKwjhXPcGKyRQvCQq2Fdci9mtJo5Tw22HTMBIKBZIoLVTWME7rt7XofhYJWcSyFQg451uwktIFzjZ5_FkFo2vly80hY2yIUTEHu3WuM5m3R2a80z7V0PoLaucaSZE3ontC9lKfjtP861aYidP-T0L1Rl59f4gy_ddq_lnBGkFo_A3MhBt04aESDUiiEk8AzGh_BubNvEcHVzIE0tjZCPV_T4YPz8oxzKLUBd9bQ1MK-SdKX_z-yHOVdkD_uiuVj6D7Oo-7xwXQsx0yFDpwRXoAkOyCUXpbzwzx9aNWz0mf1IIVqLw-VagmlYyscC8kMgkgokDQ6HKrL5dCgsVoxKdzL4RQRupxOp4Rm9xInLbgXObIXVxt9JnT5IaaQyFTbELoUCb2i-v9phBeHRjF5yLWWIYCBA5XUOZMg4jfg9fvAhL5Bbn4buf1t5O4TZJ-GMnRMnwWH1nVZglGGoXHmo9QDkMWm0wVA6CwOVsNRFLFvwV72LoEDPjcg4iDlkdI3mKdyw1RRr9_h9ZYGwNBxHhDO-Xpk3Zfxjfn1yNUgsf1MYnuVSDb-iBTYDZiBXTApu_wxewQrOGJZYuF8h4dn69_-IYuNyRuy2BG6DYQVI4KPieIyIvIxEdMxkYyJdEzMbkQpWWUDScftD8KP34-OCDh9yzwq3g-5G0_6CTkqxeZtKTafJXbzuhS7zyR2_5XiV6UIb-M6NLX40yc25LWpRTdCZ5vraekycj1vs11g3ACbO4C_zEc1G7TTj9RvP1O_-5V62XTtcL2R_aDxHeGFgqXFFT78DUP8piUJSvztFkRGXve2B7qXubXQ6zshaLsVLSwHR3zHqc75DoZqVBEw6ILufgAP_r-6NSd8lfAsydgEV_Eiiegii9NsUq9ozNOIIl1wSvksRkbzrIhzPueYlzhfTMSKRjSNoySKsmiWZtOiiHFZFPkizViaRaU_S0cm5DSsGdpUk7CjrOI4jbN0EnrKhrWNUoXnboPx7TrbTczKCz3kbWVJGklhnb2pccLJsO_9tZz7Ms42W83xf6jIbAdPw8bGnNAKeIu-qZ1hypbaHDuuUPAoTvidqQp_hB1l0hq5ut-OKuHqNp8W-tivSv3PQ2P031g4QvfBZUvovo_ptKL_BgAA__-_KzB0">