blob: 90238815908889e05be40578430389410749110c [file] [edit]
//=- 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/TargetInstrInfo.h"
using namespace llvm;
#define DEBUG_TYPE "aarch64-redundantcondbranch"
namespace {
class AArch64RedundantCondBranchLegacy : public MachineFunctionPass {
public:
static char ID;
AArch64RedundantCondBranchLegacy() : MachineFunctionPass(ID) {}
StringRef getPassName() const override {
return "AArch64 Redundant Conditional Branch Elimination";
}
protected:
bool runOnMachineFunction(MachineFunction &MF) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().setNoVRegs();
}
};
char AArch64RedundantCondBranchLegacy::ID = 0;
} // namespace
INITIALIZE_PASS(AArch64RedundantCondBranchLegacy, "aarch64-redundantcondbranch",
"AArch64 Redundant Conditional Branch Elimination pass", false,
false)
static bool runAArch64RedundantCondBranch(MachineFunction &MF) {
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
bool Changed = false;
for (MachineBasicBlock &MBB : MF)
Changed |= optimizeTerminators(&MBB, TII);
return Changed;
}
bool AArch64RedundantCondBranchLegacy::runOnMachineFunction(
MachineFunction &MF) {
if (skipFunction(MF.getFunction()))
return false;
return runAArch64RedundantCondBranch(MF);
}
PreservedAnalyses
AArch64RedundantCondBranchPass::run(MachineFunction &MF,
MachineFunctionAnalysisManager &) {
if (runAArch64RedundantCondBranch(MF)) {
return getMachineFunctionPassPreservedAnalyses();
}
return PreservedAnalyses::all();
}
FunctionPass *llvm::createAArch64RedundantCondBranchPass() {
return new AArch64RedundantCondBranchLegacy();
}