<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/132085>132085</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[StackColoring] Incorrect slot merging due to stackcoloring-lifetime-start-on-first-use
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:codegen,
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tmiasko
</td>
</tr>
</table>
<pre>
In the program below, the allocation `a` and allocation `b` have overlapping
live ranges, so it should be impossible to observe them having the same
address. Nevertheless StackColoring merges stack slots for `a` and `b`. This
is incorrect since addresses of those allocations might be captured by `g`.
```llvm
define void @f() {
start:
%a = alloca [1000 x i8], align 1
%b = alloca [1000 x i8], align 1
call void @llvm.lifetime.start.p0(i64 1000, ptr %a)
call void @llvm.lifetime.start.p0(i64 1000, ptr %b)
call void @g(ptr %a)
call void @llvm.lifetime.end.p0(i64 1000, ptr %a)
call void @g(ptr %b)
call void @llvm.lifetime.end.p0(i64 1000, ptr %b)
ret void
}
declare void @g(ptr %n)
```
```console
$ llc-21 a.ll -print-before=stack-coloring -print-after=stack-coloring
# Machine code for function f: IsSSA, TracksLiveness
Frame Objects:
fi#0: size=1000, align=1, at location [SP+8]
fi#1: size=1000, align=1, at location [SP+8]
<snip>
# *** IR Dump After Merge disjoint stack slots (stack-coloring) ***:
# Machine code for function f: IsSSA, TracksLiveness
Frame Objects:
fi#0: size=1000, align=1, at location [SP+8]
fi#1: dead
<snip>
```
This is caused by stackcoloring-lifetime-start-on-first-use (the default) where
stack coloring shrinks live range towards first use.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVcGO2zYQ_Rr6MpBBUZLXPuigXdfAAk1bdPMDFDmSmKVIgUM5Tb--IG3vZpMcssilgADDFOfNm6c3M5LIjA6xZc09a44bucbJhzbORtKz3_Ref2kfHcQJYQl-DHKGHq3_zMRDPpTWeiWj8Q7Yjku24yCd_ua4T8eTPCP4MwYrl8W4kfHOmjNCkG5ESnjkwUSgya9WQ49g5sUTmd4iRA--JwxnTFnnBGbcmBmQnJHxTmodkGgLf-AZQ5zQIhE8RameH7z1IV2fMYxIQOkQyPpIMPjwhviV7Rbg42SI8c4QGKd8CKgikHEK4ZoKCfwAcfL0tQwEsxmnmPgrucQ1oIb-S8IdEy7jXXp2_PJYe54Z7zQOxiGcvdHAaj4wsWfiAOzunvGOogyRVSkOgIlGAquO14zAmvuScw7_gNmz5phklNaMDsrb9f4d15W09oVF4ra1ZsBoZtxmFtuFM7E3uxoSSopeYsicmDj8GkL_Q4SRif07UqDT76T4VYIfM_j5BC_xAWMOTx_67pg_r7Iy4I-SukvQiyG-8YfyjrxN_maiBmtVIUqQW2uhWIJxsehx8AFZdcymLtTN6tfXcogYvnub4Sr4INWUbKe8xtwIw-pU7tmBVR080tNTl-r7GKR6pt_NGR1S6olTkDPCn_0nVJFuzhwMExVPgWT-TYxu8mSDpf_5T4TXydDcP_3FxH124gtE-QsQrHogZxZW_XYtkYnu8sDj33Bc5wW6pAh8SJMAtKFP3rj4ZiIwsf9GrdSJN5xLtf9z9TRK_Z0abx2WphsYAiVXukyoXPSt5uLm-CJ3beFdMZhAsVgJk0Jp8Goc5GpjkufzhAEvo0o9w4sJaQrGPRO8znmI_rMMmiCjwUq43ei20ofqIDfYlne1qMuyOdSbqcWhrgUXsta81rseudpxlE1fa7Wvq0ZuTCu4aHhVHspDWZX1VpT7_o7vGiX2g1LIWc1xlsZucxP7MG4M0YptWQm-bzZW9mgpbz4h8iSuuvQ1R3RMCCYemBCzIeXnxdgsejpujpvQpttFv46UJoShSK8pook2r9M3u4c1R3h83SPWx7yNkkp6zfvtp_XfrMG2U4xLNo84MXEaTZzWfqv8zMQpV3L5KZbgk82YOOXKiYnTtfhzK_4LAAD___90eoU">