mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
1. dead-end blocks (= blocks which eventually end up in an unreachable): We cannot just ignore all dead-end blocks. This causes crashes for some corner cases (see the "infinite_loop_and_unreachable" test case). Instead just handle the common case of a simple single dead-end block - like we do in DestroyHoisting. For other (more complex) dead-end control flows, the analysis is not incorrect. In worst case we end up inserting a not-needed destroy instruction. 2. sortUnique I restructured the code a bit so that sortUnique is not needed anymore. sortUnique on pointer arrays can result in non-deterministic behavior. 3. lower_bound Also, using lower_bound on a vector is not good in this function, because it can result in quadratic behavior. Though, in practice, there are only very few elements in the vector. So it's more a theoretical thing. The restructuring made the code a bit simpler, e.g. beside the worklist, no other vectors are needed anymore.
18 KiB
18 KiB