diff options
author | Max Kazantsev <mkazantsev@azul.com> | 2023-04-21 19:06:06 +0700 |
---|---|---|
committer | Max Kazantsev <mkazantsev@azul.com> | 2023-04-21 19:44:13 +0700 |
commit | 9d7785b2e99548f3fde6fa030443a4d443dec647 (patch) | |
tree | 3825324ae155a58ca2af4c4abe9ba6730067adbb /llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | |
parent | 1702ff3d12b9e292a122da206dae71a4ecd87506 (diff) | |
download | llvm-9d7785b2e99548f3fde6fa030443a4d443dec647.zip llvm-9d7785b2e99548f3fde6fa030443a4d443dec647.tar.gz llvm-9d7785b2e99548f3fde6fa030443a4d443dec647.tar.bz2 |
[BasicBlockUtils][NFCI] Extract branch inverting to a separate method
The motivation is to make possible branch inverting code reuse.
Patch by Aleksandr Popov!
Differential Revision: https://reviews.llvm.org/D148708
Diffstat (limited to 'llvm/lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index f0e2465..7509c48 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -2049,3 +2049,17 @@ BasicBlock *llvm::CreateControlFlowHub( return FirstGuardBlock; } + +void llvm::InvertBranch(BranchInst *PBI, IRBuilderBase &Builder) { + Value *NewCond = PBI->getCondition(); + // If this is a "cmp" instruction, only used for branching (and nowhere + // else), then we can simply invert the predicate. + if (NewCond->hasOneUse() && isa<CmpInst>(NewCond)) { + CmpInst *CI = cast<CmpInst>(NewCond); + CI->setPredicate(CI->getInversePredicate()); + } else + NewCond = Builder.CreateNot(NewCond, NewCond->getName() + ".not"); + + PBI->setCondition(NewCond); + PBI->swapSuccessors(); +} |