Page MenuHomePhabricator

[SplitEdge] Update SplitCriticalEdge to return a nullptr only when the edge is not critical
Needs ReviewPublic

Authored by sidbav on Jan 13 2021, 11:02 AM.

Details

Summary

The function SplitCriticalEdge (called by SplitEdge) can return a nullptr in cases where the edge is a critical. SplitEdge uses SplitCriticalEdge assuming it can always split all critical edges, which is an incorrect assumption.

The three cases where the function SplitCriticalEdge will return a nullptr is:

  1. DestBB is an exception block
  2. Options.IgnoreUnreachableDests is set to true and isa(DestBB->getFirstNonPHIOrDbgOrLifetime()) is not equal to a nullptr
  3. LoopSimplify form must be preserved (Options.PreserveLoopSimplify is true) and it cannot be maintained for a loop due to indirect branches

For each of these situations they are handled in the following way:

  1. Modified the function ehAwareSplitEdge originally from llvm/lib/Transforms/Coroutines/CoroFrame.cpp to handle the cases when the DestBB is an exception block. This function is called directly in SplitEdge. SplitEdge does not call SplitCriticalEdge in this case
  2. Options.IgnoreUnreachableDests is set to false by default, so this situation does not apply.
  3. Return a nullptr in this situation since the SplitCriticalEdge also returned nullptr. Nothing we can do in this case.

Diff Detail

Event Timeline

sidbav created this revision.Jan 13 2021, 11:02 AM
sidbav requested review of this revision.Jan 13 2021, 11:02 AM
Herald added a project: Restricted Project. · View Herald TranscriptJan 13 2021, 11:02 AM
sidbav retitled this revision from [SplitEdge] Update to handle cases which were not previously considered when the edge is critical. to [SplitEdge] Update SplitCriticalEdge to return a nullptr only when the edge is not critical.Wed, Mar 3, 9:21 AM

Ping