HomePhabricator

[CodeExtractor] Do not extract unsafe lifetime markers

Description

[CodeExtractor] Do not extract unsafe lifetime markers

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

Details