[llvm] [BOLT][AArch64] Transform cmpbr ~> cmp + br when inversion not possible (PR #185731)
Paschalis Mpeis via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 1 08:09:22 PDT 2026
================
@@ -318,6 +321,123 @@ TEST_P(MCPlusBuilderTester, AArch64_ReverseCompAndBranch) {
ASSERT_FALSE(BC->MIB->isReversibleBranch(Overflows));
}
+TEST_P(MCPlusBuilderTester, AArch64_ReverseCompAndBranch_Underflows) {
+ if (GetParam() != Triple::aarch64)
+ GTEST_SKIP();
+
+ BinaryFunction *BF = BC->createInjectedBinaryFunction("BF", true);
+ BinaryBasicBlock *EntryBB = BF->addBasicBlock();
+ BinaryBasicBlock *FallThroughBB = BF->addBasicBlock();
+ BinaryBasicBlock *TargetBB = BF->addBasicBlock();
+ BF->addEntryPoint(*EntryBB);
+ EntryBB->addSuccessor(TargetBB);
+ EntryBB->addSuccessor(FallThroughBB);
+
+ // Inversion requires expansion, immediate value underflows.
+ // cblt x0, #0, target ~> cmp x0, #0
+ // b.ge target
+ auto I =
+ EntryBB->addInstruction(MCInstBuilder(AArch64::CBLTXri)
+ .addReg(AArch64::X0)
+ .addImm(0)
+ .addExpr(MCSymbolRefExpr::create(
+ TargetBB->getLabel(), *BC->Ctx.get())));
+ BinaryFunctionCallGraph CG(buildCallGraph(*BC.get()));
+ RegAnalysis RA(*BC.get(), &BC->getBinaryFunctions(), &CG);
+ DataflowInfoManager DIM(*BF, &RA, nullptr);
+
+ ASSERT_TRUE(BC->MIB->isReversibleBranch(*I, &DIM));
+ BC->MIB->reverseBranchCondition(EntryBB, *I, TargetBB->getLabel(),
+ BC->Ctx.get());
+ auto R = EntryBB->rbegin();
----------------
paschalis-mpeis wrote:
Any reason to `rbegin()` here?
https://github.com/llvm/llvm-project/pull/185731
More information about the llvm-commits
mailing list