123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //===-------------- RISCVStripWSuffix.cpp - -w Suffix Removal -------------===//
- //
- //
- // 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
- //
- //===---------------------------------------------------------------------===//
- //
- // This pass removes the -w suffix from each addiw and slliw instructions
- // whenever all users are dependent only on the lower word of the result of the
- // instruction. We do this only for addiw and slliw because the -w forms are
- // less compressible.
- //
- //===---------------------------------------------------------------------===//
- #include "RISCV.h"
- #include "RISCVMachineFunctionInfo.h"
- using namespace llvm;
- static cl::opt<bool> DisableStripWSuffix("riscv-disable-strip-w-suffix",
- cl::desc("Disable strip W suffix"),
- cl::init(false), cl::Hidden);
- namespace {
- class RISCVStripWSuffix : public MachineFunctionPass {
- public:
- static char ID;
- RISCVStripWSuffix() : MachineFunctionPass(ID) {
- initializeRISCVStripWSuffixPass(*PassRegistry::getPassRegistry());
- }
- bool runOnMachineFunction(MachineFunction &MF) override;
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- AU.setPreservesCFG();
- MachineFunctionPass::getAnalysisUsage(AU);
- }
- StringRef getPassName() const override { return "RISCV Strip W Suffix"; }
- };
- } // end anonymous namespace
- char RISCVStripWSuffix::ID = 0;
- INITIALIZE_PASS(RISCVStripWSuffix, "riscv-strip-w-suffix",
- "RISCV Strip W Suffix", false, false)
- FunctionPass *llvm::createRISCVStripWSuffixPass() {
- return new RISCVStripWSuffix();
- }
- bool RISCVStripWSuffix::runOnMachineFunction(MachineFunction &MF) {
- if (skipFunction(MF.getFunction()) || DisableStripWSuffix)
- return false;
- MachineRegisterInfo &MRI = MF.getRegInfo();
- const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
- const RISCVInstrInfo &TII = *ST.getInstrInfo();
- if (!ST.is64Bit())
- return false;
- bool MadeChange = false;
- for (MachineBasicBlock &MBB : MF) {
- for (auto I = MBB.begin(), IE = MBB.end(); I != IE; ++I) {
- MachineInstr &MI = *I;
- switch (MI.getOpcode()) {
- case RISCV::ADDW:
- case RISCV::SLLIW:
- if (TII.hasAllWUsers(MI, MRI)) {
- unsigned Opc =
- MI.getOpcode() == RISCV::ADDW ? RISCV::ADD : RISCV::SLLI;
- MI.setDesc(TII.get(Opc));
- MadeChange = true;
- }
- break;
- }
- }
- }
- return MadeChange;
- }
|