//===-------------- 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 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(); 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; }