|
LLVM 24.0.0git
|
#include "RISCV.h"#include "RISCVSubtarget.h"#include "RISCVTargetMachine.h"#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"#include "llvm/CodeGen/MachineFunctionPass.h"#include "llvm/CodeGen/MachinePassManager.h"#include "llvm/CodeGen/MachineRegisterInfo.h"#include "llvm/CodeGen/Passes.h"#include "llvm/IR/Analysis.h"#include "llvm/IR/DebugInfoMetadata.h"#include "llvm/MC/TargetRegistry.h"#include "llvm/Support/Debug.h"#include "llvm/Target/TargetOptions.h"#include <optional>Go to the source code of this file.
Macros | |
| #define | DEBUG_TYPE "riscv-merge-base-offset" |
| #define | RISCV_MERGE_BASE_OFFSET_NAME "RISC-V Merge Base Offset" |
Functions | |
| INITIALIZE_PASS (RISCVMergeBaseOffsetLegacy, DEBUG_TYPE, RISCV_MERGE_BASE_OFFSET_NAME, false, false) static bool detectFoldable(MachineInstr &Hi | |
| if (HiOpc !=RISCV::LUI &&HiOpc !=RISCV::AUIPC &&HiOpc !=RISCV::PseudoMovAddr &&HiOpc !=RISCV::QC_E_LI) return false | |
| if (HiOp1.getTargetFlags() !=ExpectedFlags) return false | |
| if (!(HiOp1.isGlobal()||HiOp1.isCPI()||HiOp1.isBlockAddress())||HiOp1.getOffset() !=0) return false | |
| if (HiOpc==RISCV::PseudoMovAddr||HiOpc==RISCV::QC_E_LI) | |
| if (!MRI->hasOneUse(HiDestReg)) return false | |
| if (Lo->getOpcode() !=RISCV::ADDI) return false | |
| if (HiOp1.isGlobal()) | |
| static bool | foldOffset (MachineInstr &Hi, MachineInstr &Lo, MachineInstr &Tail, int64_t Offset, MachineRegisterInfo *MRI) |
| static bool | foldLargeOffset (MachineInstr &Hi, MachineInstr &Lo, MachineInstr &TailAdd, Register GAReg, MachineRegisterInfo *MRI, const RISCVSubtarget *ST) |
| static bool | foldShiftedOffset (MachineInstr &Hi, MachineInstr &Lo, MachineInstr &TailShXAdd, Register GAReg, MachineRegisterInfo *MRI) |
| static bool | detectAndFoldOffset (MachineInstr &Hi, MachineInstr &Lo, MachineRegisterInfo *MRI, const RISCVSubtarget *ST) |
| static void | overwriteMachineOperandInPlace (MachineOperand &MO, const MachineOperand &ImmOp) |
| static bool | foldIntoMemoryOps (MachineInstr &Hi, MachineInstr &Lo, MachineRegisterInfo *MRI, const RISCVSubtarget *ST) |
| static bool | foldShxaddIntoScaledMemory (MachineInstr &Hi, MachineInstr &Lo, MachineRegisterInfo *MRI, const RISCVSubtarget *ST) |
| static bool | runMergeBaseOffset (MachineFunction &Fn) |
Variables | |
| MachineInstr *& | Lo = &*MRI->use_instr_begin(HiDestReg) |
| MachineInstr MachineRegisterInfo * | MRI |
| const MachineOperand & | HiOp1 = Hi.getOperand(1) |
| unsigned | ExpectedFlags |
| else | |
| return | true |
| #define DEBUG_TYPE "riscv-merge-base-offset" |
Definition at line 30 of file RISCVMergeBaseOffset.cpp.
| #define RISCV_MERGE_BASE_OFFSET_NAME "RISC-V Merge Base Offset" |
Definition at line 31 of file RISCVMergeBaseOffset.cpp.
Referenced by INITIALIZE_PASS().
|
static |
Definition at line 332 of file RISCVMergeBaseOffset.cpp.
References llvm::dbgs(), foldLargeOffset(), foldOffset(), foldShiftedOffset(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::Hi, LLVM_DEBUG, Lo, MRI, and llvm::Offset.
Referenced by runMergeBaseOffset().
|
static |
Definition at line 419 of file RISCVMergeBaseOffset.cpp.
References llvm::InlineAsm::A, AbstractManglingParser< Derived, Alloc >::NumOps, assert(), llvm::MachineOperand::ChangeToImmediate(), llvm::dbgs(), llvm::MachineOperand::getImm(), llvm::MachineOperand::getReg(), llvm::Hi, I, llvm::DenseMapBase< StorageT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::MachineOperand::isImm(), llvm::isInt(), llvm::MachineOperand::isReg(), LLVM_DEBUG, llvm_unreachable, Lo, llvm::make_early_inc_range(), llvm::InlineAsm::MIOp_FirstOperand, MRI, llvm::Offset, overwriteMachineOperandInPlace(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::MachineOperand::setOffset(), llvm::SignExtend64(), TII, and UseMI.
Referenced by runMergeBaseOffset().
|
static |
Definition at line 205 of file RISCVMergeBaseOffset.cpp.
References assert(), llvm::dbgs(), llvm::MachineInstr::eraseFromParent(), foldOffset(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineOperand::getTargetFlags(), llvm::Hi, llvm::isInt(), llvm::MachineOperand::isReg(), LLVM_DEBUG, Lo, llvm::RISCVII::MO_None, MRI, llvm::Offset, Reg, and llvm::SignExtend64().
Referenced by detectAndFoldOffset().
|
static |
Definition at line 142 of file RISCVMergeBaseOffset.cpp.
References llvm::DIExpression::appendOffset(), llvm::DIExpression::appendOpsToArg(), assert(), llvm::dbgs(), llvm::GlobalValue::getDataLayout(), llvm::MachineInstr::getDebugExpression(), llvm::MachineInstr::getDebugExpressionOp(), llvm::MachineInstr::getDebugOperandIndex(), llvm::MachineInstr::getParent(), llvm::DataLayout::getTypeAllocSize(), llvm::GlobalValue::getValueType(), llvm::Hi, llvm::MachineInstr::isDebugValue(), llvm::isInt(), LLVM_DEBUG, Lo, MRI, llvm::Offset, llvm::MachineOperand::setMetadata(), and uint64_t.
Referenced by detectAndFoldOffset(), foldLargeOffset(), and foldShiftedOffset().
|
static |
Definition at line 286 of file RISCVMergeBaseOffset.cpp.
References assert(), llvm::dbgs(), llvm::MachineInstr::eraseFromParent(), foldOffset(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::Hi, llvm::MachineOperand::isImm(), llvm::isInt(), llvm::MachineOperand::isReg(), llvm::Register::isVirtual(), LLVM_DEBUG, llvm_unreachable, Lo, MRI, llvm::Offset, and uint64_t.
Referenced by detectAndFoldOffset().
|
static |
Definition at line 675 of file RISCVMergeBaseOffset.cpp.
References llvm::MachineInstrBuilder::add(), llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::MachineInstrBuilder::cloneMemRefs(), llvm::MachineInstr::eraseFromParent(), llvm::MachineInstr::getDebugLoc(), llvm::MachineOperand::getImm(), llvm::getKillRegState(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::Hi, Imm, llvm::MachineOperand::isImm(), llvm::MachineOperand::isKill(), llvm::MachineOperand::isReg(), llvm::Register::isVirtual(), Lo, MBB, MRI, Opc, llvm::SignExtend64(), and TII.
Referenced by runMergeBaseOffset().
| if | ( | !(HiOp1.isGlobal()||HiOp1.isCPI()||HiOp1.isBlockAddress())||HiOp1.getOffset() ! | = 0 | ) |
| if | ( | HiOp1.getTargetFlags() ! | = ExpectedFlags | ) |
References ExpectedFlags, and HiOp1.
| else if | ( | HiOp1. | isGlobal() | ) |
Definition at line 125 of file RISCVMergeBaseOffset.cpp.
| if | ( | HiOpc ! | = RISCV::LUI && HiOpc != RISCV::AUIPC && HiOpc != RISCV::PseudoMovAddr && HiOpc != RISCV::QC_E_LI | ) |
Definition at line 110 of file RISCVMergeBaseOffset.cpp.
References assert(), llvm::MachineOperand::getOffset(), llvm::MachineOperand::getTargetFlags(), llvm::MachineOperand::getType(), llvm::MachineOperand::isBlockAddress(), llvm::MachineOperand::isCPI(), llvm::MachineOperand::isGlobal(), Lo, llvm::RISCVII::MO_LO, llvm::MachineOperand::MO_MCSymbol, and llvm::RISCVII::MO_PCREL_LO.
| if | ( | HiOpc | = = RISCV::PseudoMovAddr || HiOpc == RISCV::QC_E_LI | ) |
Definition at line 96 of file RISCVMergeBaseOffset.cpp.
| INITIALIZE_PASS | ( | RISCVMergeBaseOffsetLegacy | , |
| DEBUG_TYPE | , | ||
| RISCV_MERGE_BASE_OFFSET_NAME | , | ||
| false | , | ||
| false | ) & |
References DEBUG_TYPE, and RISCV_MERGE_BASE_OFFSET_NAME.
|
static |
Definition at line 396 of file RISCVMergeBaseOffset.cpp.
References llvm::MachineOperand::ChangeToBA(), llvm::MachineOperand::ChangeToCPI(), llvm::MachineOperand::ChangeToGA(), llvm::MachineOperand::ChangeToMCSymbol(), llvm::MachineOperand::getBlockAddress(), llvm::MachineOperand::getGlobal(), llvm::MachineOperand::getIndex(), llvm::MachineOperand::getMCSymbol(), llvm::MachineOperand::getOffset(), llvm::MachineOperand::getTargetFlags(), llvm::MachineOperand::getType(), llvm::MachineOperand::MO_BlockAddress, llvm::MachineOperand::MO_ConstantPoolIndex, llvm::MachineOperand::MO_GlobalAddress, llvm::MachineOperand::MO_MCSymbol, llvm::report_fatal_error(), and llvm::MachineOperand::setOffset().
Referenced by foldIntoMemoryOps().
|
static |
Definition at line 788 of file RISCVMergeBaseOffset.cpp.
References llvm::dbgs(), detectAndFoldOffset(), foldIntoMemoryOps(), foldShxaddIntoScaledMemory(), llvm::MachineFunction::getRegInfo(), llvm::MachineFunction::getSubtarget(), llvm::Hi, LLVM_DEBUG, Lo, MBB, and MRI.
Referenced by llvm::RISCVMergeBaseOffsetPass::run().
| else |
Definition at line 100 of file RISCVMergeBaseOffset.cpp.
| unsigned ExpectedFlags |
Definition at line 86 of file RISCVMergeBaseOffset.cpp.
Referenced by if().
| const MachineOperand& HiOp1 = Hi.getOperand(1) |
Definition at line 85 of file RISCVMergeBaseOffset.cpp.
| Lo = &*MRI->use_instr_begin(HiDestReg) |
Definition at line 78 of file RISCVMergeBaseOffset.cpp.
Referenced by absoluteSymbolDiff(), AddCombineTo64BitSMLAL16(), buildGPRPair(), buildSplatPartsS64WithVL(), canonicalizeShuffleMaskWithHorizOp(), checkImmOpForPKF32InstrReplicatesLower32BitsOfScalarOperand(), collectConcatOps(), combineAddMulh(), combineAddPackedByteDot(), combineArithReduction(), combineExtractWithShuffle(), combineHorizOpWithShuffle(), combineINSERT_SUBVECTOR(), combinePExtTruncate(), combineShiftRightLogical(), combineStore(), combineTargetShuffle(), combineVECREDUCE_LOGIC(), combineVECREDUCE_MUL(), combineVectorInsert(), combineVPMADD(), combineX86ShuffleChain(), combineX86ShufflesRecursively(), computeKnownBitsForPMADDUBSW(), computeKnownBitsForPMADDWD(), convertShiftLeftToScale(), createPermlane16(), createPermlaneX16(), createVariablePermute(), detectAndFoldOffset(), eat12Bytes(), eat16Bytes(), emitPseudoVMSKCOND(), Expand64BitShift(), expandBitCastF128ToI128(), expandBitCastI128ToF128(), expandBufferLoadIntrinsic(), expandMulWithOverflow(), extractGPRPair(), extractLOHI(), foldIntoMemoryOps(), foldLargeOffset(), foldOffset(), foldShiftedOffset(), foldShxaddIntoScaledMemory(), getBaseWithOffsetUsingSplitOR(), getCopyFromParts(), getFauxShuffleMask(), getMaskNode(), getMOVMSK(), getMul64(), getv64i1Argument(), getVectorBitwiseReduce(), if(), if(), if(), if(), isI32SignExtended(), LLVMDIBuilderGetOrCreateSubrange(), LowerAVXCONCAT_VECTORS(), LowerBITCAST(), LowerBITREVERSE(), lowerBUILD_VECTOR(), LowerBUILD_VECTORvXi1(), LowerCONCAT_VECTORSvXi1(), LowerCVTPS2PH(), LowerEXTEND_VECTOR_INREG(), LowerFunnelShift(), lowerGR128ToI128(), lowerI128ToGR128(), LowerLabelRef(), LowerMINMAX_REDUCE(), lowerMUL_LOHI(), lowerMUL_LOHI32(), LowerMULH(), LowerMULO(), LowerNTStore(), LowerPARITY(), LowerRotate(), LowerShift(), LowerShiftParts(), lowerShuffleAsBlend(), lowerShuffleAsByteRotate(), lowerShuffleAsByteRotateAndPermute(), lowerShuffleAsSpecificExtension(), lowerShuffleAsUNPCKAndPermute(), lowerShuffleAsVALIGN(), LowerTruncate(), LowerTruncateVecI1(), LowerTruncateVecPack(), LowerTruncateVecPackWithSignBits(), LowerVECREDUCE(), LowerVecReduceMinMax(), LowerVECTOR_SHUFFLE(), lowerVECTOR_SHUFFLE_XVPERMIQ(), lowerVECTOR_SHUFFLEAsByteRotate(), lowerVECTOR_SHUFFLEAsPSlide1(), LowerVectorAllEqual(), LowerVectorCTLZInRegLUT(), LowerWRITE_REGISTER(), matchBinaryPermuteShuffle(), matchOrConcat(), matchShuffleAsByteRotate(), matchShuffleAsElementRotate(), MergeBlocksConvert(), mostAlignedValueInRange(), Passv64i1ArgInRegs(), performADDCombine(), performBITCASTCombine(), performExtBinopLoadFold(), PerformInsertSubvectorCombine(), performInsertSubvectorCombine(), performSPLIT_PAIR_F64Combine(), readInstruction64(), ReplaceATOMIC_LOAD_128Results(), ReplaceCMP_SWAP_128Results(), ReplaceCMP_SWAP_64Results(), ReplaceLongIntrinsic(), ReplaceReductionResults(), runMergeBaseOffset(), selectImm(), simplifyX86pmadd(), splatPartsI64WithVL(), splatSplitI64WithVL(), SplitAndExtendv16i1(), splitAndLowerShuffle(), splitVector(), SplitVectorReductionOp(), truncateVectorWithNARROW(), truncateVectorWithPACK(), tryCombineExtendRShTrunc(), TryWideExtMulCombine(), unpack64(), unpackF64OnLA32DSoftABI(), unpackF64OnRV32DSoftABI(), unpackGPRVecOnRV32(), visitORCommutative(), and WinDBZCheckDenominator().
Definition at line 79 of file RISCVMergeBaseOffset.cpp.
| return true |
Definition at line 136 of file RISCVMergeBaseOffset.cpp.