mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
While doing bottom up dataflow, if we encounter an unmatched retain instruction, that can pair with a 'KnownSafe' already visited release instruction, we turn off KnownSafety if the two RCIdentities mayAlias. This is done in BottomUpRefCountState::checkAndResetKnownSafety. In order to determine if a retain is umatched, we look at IncToDecStateMap. If a retain was matched during bottom up dataflow, it is always found in IncToDecStateMap with value of the matched release's BottomUpRefCountState. Similarly, during top down dataflow, if we encounter an unmatched release instruction, that can pair with a 'KnownSafe' already visited retain instruction, we turn off KnownSafety if the two RCIdentities mayAlias. This is done in TopDownRefCountState::checkAndResetKnownSafety. In order to determine if a release is umatched, we look at DecToIncStateMap. If a release was matched during top down dataflow, it is always found in DecToIncStateMap with value of the matched retain's TopDownRefCountState. For ARCLoopOpts, during bottom up and top down traversal of a region with a nested loop, we find if the retain/release in the loop summary was matched or not by looking at the persistent RefCountInstToMatched map. This map is populated when processing the nested loop region from the IncToDecStateMap/DecToStateMap which gets thrown away after the loop region is processed. This fixes the bugs in both ARCSequenceOpts without loop support and with loop support.
10 KiB
10 KiB