[llvm] [BOLT][AArch64] Add a unittest for compare-and-branch inversion. (PR #181177)

via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 12 08:37:50 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-bolt

Author: Alexandros Lamprineas (labrinea)

<details>
<summary>Changes</summary>

Checks that isReversibleBranch() returns false
 - when the immediate value is 63 and needs +1 adjustment
 - when the immediate value is 0 and needs -1 adjustment

Checks that reverseBranchCondition() adjusts
 - the opcode
 - the immediate operand if necessary (+/-1)
 - the register operands if necessary (swap)

---
Full diff: https://github.com/llvm/llvm-project/pull/181177.diff


1 Files Affected:

- (modified) bolt/unittests/Core/MCPlusBuilder.cpp (+57) 


``````````diff
diff --git a/bolt/unittests/Core/MCPlusBuilder.cpp b/bolt/unittests/Core/MCPlusBuilder.cpp
index a8d25f3323b38..e11347a8c4c94 100644
--- a/bolt/unittests/Core/MCPlusBuilder.cpp
+++ b/bolt/unittests/Core/MCPlusBuilder.cpp
@@ -119,6 +119,63 @@ TEST_P(MCPlusBuilderTester, AliasSmallerX0) {
                  /*OnlySmaller=*/true);
 }
 
+TEST_P(MCPlusBuilderTester, AArch64_ReverseCompAndBranch) {
+  if (GetParam() != Triple::aarch64)
+    GTEST_SKIP();
+
+  BinaryFunction *BF = BC->createInjectedBinaryFunction("BF", true);
+  std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock();
+  std::unique_ptr<BinaryBasicBlock> TargetBB = BF->createBasicBlock();
+  BB->addSuccessor(TargetBB.get());
+
+  // cbgt x0, #0, target
+  MCInst NeedsImmInc = MCInstBuilder(AArch64::CBGTXri)
+      .addReg(AArch64::X0)
+      .addImm(0)
+      .addExpr(MCSymbolRefExpr::create(TargetBB->getLabel(), *BC->Ctx.get()));
+  BB->addInstruction(NeedsImmInc);
+  // cblo x0, #1, target
+  MCInst NeedsImmDec = MCInstBuilder(AArch64::CBLOXri)
+      .addReg(AArch64::X0)
+      .addImm(1)
+      .addExpr(MCSymbolRefExpr::create(TargetBB->getLabel(), *BC->Ctx.get()));
+  BB->addInstruction(NeedsImmDec);
+  // cbge x0, x1, target
+  MCInst NeedsRegSwap = MCInstBuilder(AArch64::CBGEXrr)
+      .addReg(AArch64::X0)
+      .addReg(AArch64::X1)
+      .addExpr(MCSymbolRefExpr::create(TargetBB->getLabel(), *BC->Ctx.get()));
+  BB->addInstruction(NeedsRegSwap);
+  // cbgt x0, #63, target
+  MCInst Irreversible = MCInstBuilder(AArch64::CBGTXri)
+      .addReg(AArch64::X0)
+      .addImm(63)
+      .addExpr(MCSymbolRefExpr::create(TargetBB->getLabel(), *BC->Ctx.get()));
+  BB->addInstruction(Irreversible);
+
+  auto II = BB->begin();
+  ASSERT_TRUE(BC->MIB->isReversibleBranch(*II));
+  BC->MIB->reverseBranchCondition(*II, TargetBB->getLabel(), BC->Ctx.get());
+  // cblt x0, #1, target
+  ASSERT_EQ(II->getOpcode(), AArch64::CBLTXri);
+  ASSERT_EQ(II->getOperand(1).getImm(), 1);
+  II++;
+  ASSERT_TRUE(BC->MIB->isReversibleBranch(*II));
+  BC->MIB->reverseBranchCondition(*II, TargetBB->getLabel(), BC->Ctx.get());
+  // cbhi x0, #0, target
+  ASSERT_EQ(II->getOpcode(), AArch64::CBHIXri);
+  ASSERT_EQ(II->getOperand(1).getImm(), 0);
+  II++;
+  ASSERT_TRUE(BC->MIB->isReversibleBranch(*II));
+  BC->MIB->reverseBranchCondition(*II, TargetBB->getLabel(), BC->Ctx.get());
+  // cbgt x1, x0, target
+  ASSERT_EQ(II->getOpcode(), AArch64::CBGTXrr);
+  ASSERT_EQ(II->getOperand(0).getReg(), AArch64::X1);
+  ASSERT_EQ(II->getOperand(1).getReg(), AArch64::X0);
+  II++;
+  ASSERT_FALSE(BC->MIB->isReversibleBranch(*II));
+}
+
 TEST_P(MCPlusBuilderTester, AArch64_CmpJE) {
   if (GetParam() != Triple::aarch64)
     GTEST_SKIP();

``````````

</details>


https://github.com/llvm/llvm-project/pull/181177


More information about the llvm-commits mailing list