BreakCriticalEdges for callbr indirect dests
authorNick Desaulniers <ndesaulniers@google.com>
Wed, 17 Jun 2020 18:37:31 +0000 (11:37 -0700)
committerNick Desaulniers <ndesaulniers@google.com>
Wed, 17 Jun 2020 18:45:06 +0000 (11:45 -0700)
commit88c965ba14cff1e04ccb4237966a9fefe902b1f4
treeac6c80898bc8ed64f8b6d996b693742b4c5e4765
parent9b22b29f684f6f5fbe3dd1478704270023f24226
BreakCriticalEdges for callbr indirect dests

Summary:
llvm::SplitEdge was failing an assertion that the BasicBlock only had
one successor (for BasicBlocks terminated by CallBrInst, we typically
have multiple successors).  It was surprising that the earlier call to
SplitCriticalEdge did not handle the critical edge (there was an early
return).  Removing that triggered another assertion relating to creating
a BlockAddress for a BasicBlock that did not (yet) have a parent, which
is a simple order of operations issue in llvm::SplitCriticalEdge (a
freshly constructed BasicBlock must be inserted into a Function's basic
block list to have a parent).

Thanks to @nathanchance for the report.
Fixes: https://github.com/ClangBuiltLinux/linux/issues/1018

Reviewers: craig.topper, jyknight, void, fhahn, efriedma

Reviewed By: efriedma

Subscribers: eli.friedman, rnk, efriedma, fhahn, hiraditya, llvm-commits, nathanchance, srhines

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D81607
llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
llvm/test/Transforms/CallSiteSplitting/callsite-split-callbr.ll [new file with mode: 0644]