//===-- X86FixupInstTunings.cpp - replace instructions -----------===// // // 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 file does a tuning pass replacing slower machine instructions // with faster ones. We do this here, as opposed to during normal ISel, as // attempting to get the "right" instruction can break patterns. This pass // is not meant search for special cases where an instruction can be transformed // to another, it is only meant to do transformations where the old instruction // is always replacable with the new instructions. For example: // // `vpermq ymm` -> `vshufd ymm` // -- BAD, not always valid (lane cross/non-repeated mask) // // `vpermilps ymm` -> `vshufd ymm` // -- GOOD, always replaceable // //===----------------------------------------------------------------------===// #include "X86.h" #include "X86InstrInfo.h" #include "X86Subtarget.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineRegisterInfo.h" usingnamespacellvm; #define DEBUG_TYPE … STATISTIC(NumInstChanges, "Number of instructions changes"); namespace { class X86FixupInstTuningPass : public MachineFunctionPass { … }; } // end anonymous namespace char X86FixupInstTuningPass::ID = …; INITIALIZE_PASS(…) FunctionPass *llvm::createX86FixupInstTuning() { … } template <typename T> static std::optional<bool> CmpOptionals(T NewVal, T CurVal) { … } bool X86FixupInstTuningPass::processInstruction( MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator &I) { … } bool X86FixupInstTuningPass::runOnMachineFunction(MachineFunction &MF) { … }