forked from OSchip/llvm-project
a1778df474
Lifetime markers which reference inputs to the extraction region are not safe to extract. Example ('rhs' will be extracted): ``` entry: +------------+ | x = alloca | | y = alloca | +------------+ / \ lhs: rhs: +-------------------+ +-------------------+ | lifetime_start(x) | | lifetime_start(x) | | use(x) | | lifetime_start(y) | | lifetime_end(x) | | use(x, y) | | lifetime_start(y) | | lifetime_end(y) | | use(y) | | lifetime_end(x) | | lifetime_end(y) | +-------------------+ +-------------------+ ``` Prior to extraction, the stack coloring pass sees that the slots for 'x' and 'y' are in-use at the same time. After extraction, the coloring pass infers that 'x' and 'y' are *not* in-use concurrently, because markers from 'rhs' are no longer available to help decide otherwise. This leads to a miscompile, because the stack slots actually are in-use concurrently in the extracted function. Fix this by moving lifetime start/end markers for memory regions defined in the calling function around the call to the extracted function. Fixes llvm.org/PR39671 (rdar://45939472). Differential Revision: https://reviews.llvm.org/D55967 llvm-svn: 350420 |
||
---|---|---|
.. | ||
X86 | ||
delete-use-without-def-dbg-val.ll | ||
do-not-split.ll | ||
duplicate-phi-preds-crash.ll | ||
eh-pads.ll | ||
eh-typeid-for.ll | ||
extraction-subregion-breaks-phis.ll | ||
forward-dfs-reaches-marked-block.ll | ||
lifetime-markers-on-inputs.ll | ||
mark-the-whole-func-cold.ll | ||
minsize.ll | ||
multiple-exits.ll | ||
noreturn.ll | ||
outline-cold-asm.ll | ||
outline-disjoint-diamonds.ll | ||
outline-if-then-else.ll | ||
outline-multiple-entry-region.ll | ||
outline-while-loop.ll | ||
phi-with-distinct-outlined-values.ll | ||
region-overlap.ll | ||
split-cold-2.ll | ||
split-out-dbg-val-of-arg.ll | ||
succ-block-with-self-edge.ll | ||
unwind.ll |