llvm-project/llvm/lib/Target/AArch64/AArch64RedundantCondBranchPass.cpp
David Green 8a4cc440f2 [AArch64] Run optimizeTerminators earlier too. (#170907)
Running optimizeTerminators prior to other optimizations like branch
layout can lead to more folding and better codegen, but is not on its
own able to capture all cases. There is benefit to running it in both
places. This adds the existing code from #161508 into the
AArch64RedundantCopyElimination pass, which sounds like a sensible
enough place for it.

This is a recommit with an extra fix for shrink-wrapping domtree use.
2025-12-11 15:33:15 +00:00

64 lines
2.1 KiB
C++

//=- AArch64RedundantCondBranch.cpp - Remove redundant conditional branches -=//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Late in the pipeline, especially with zero phi operands propagated after tail
// duplications, we can end up with CBZ/CBNZ/TBZ/TBNZ with a zero register. This
// simple pass looks at the terminators to a block, removing the redundant
// instructions where necessary.
//
//===----------------------------------------------------------------------===//
#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/Support/Debug.h"
using namespace llvm;
#define DEBUG_TYPE "aarch64-redundantcondbranch"
namespace {
class AArch64RedundantCondBranch : public MachineFunctionPass {
public:
static char ID;
AArch64RedundantCondBranch() : MachineFunctionPass(ID) {}
bool runOnMachineFunction(MachineFunction &MF) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().setNoVRegs();
}
StringRef getPassName() const override {
return "AArch64 Redundant Conditional Branch Elimination";
}
};
char AArch64RedundantCondBranch::ID = 0;
} // namespace
INITIALIZE_PASS(AArch64RedundantCondBranch, "aarch64-redundantcondbranch",
"AArch64 Redundant Conditional Branch Elimination pass", false,
false)
bool AArch64RedundantCondBranch::runOnMachineFunction(MachineFunction &MF) {
if (skipFunction(MF.getFunction()))
return false;
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
bool Changed = false;
for (MachineBasicBlock &MBB : MF)
Changed |= optimizeTerminators(&MBB, TII);
return Changed;
}
FunctionPass *llvm::createAArch64RedundantCondBranchPass() {
return new AArch64RedundantCondBranch();
}