aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
diff options
context:
space:
mode:
authorMax Kazantsev <mkazantsev@azul.com>2023-04-21 19:06:06 +0700
committerMax Kazantsev <mkazantsev@azul.com>2023-04-21 19:44:13 +0700
commit9d7785b2e99548f3fde6fa030443a4d443dec647 (patch)
tree3825324ae155a58ca2af4c4abe9ba6730067adbb /llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
parent1702ff3d12b9e292a122da206dae71a4ecd87506 (diff)
downloadllvm-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.cpp14
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();
+}