//===-- BasicBlockPathCloning.cpp ---=========-----------------------------===// // // 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 // //===----------------------------------------------------------------------===// // /// \file /// BasicBlockPathCloning implementation. /// /// The purpose of this pass is to clone basic block paths based on information /// provided by the -fbasic-block-sections=list option. /// Please refer to BasicBlockSectionsProfileReader.cpp to see a path cloning /// example. //===----------------------------------------------------------------------===// // This pass clones the machine basic blocks alongs the given paths and sets up // the CFG. It assigns BBIDs to the cloned blocks so that the // `BasicBlockSections` pass can correctly map the cluster information to the // blocks. The cloned block's BBID will have the same BaseID as the original // block, but will get a unique non-zero CloneID (original blocks all have zero // CloneIDs). This pass applies a path cloning if it satisfies the following // conditions: // 1. All BBIDs in the path should be mapped to existing blocks. // 2. Each two consecutive BBIDs in the path must have a successor // relationship in the CFG. // 3. The path should not include a block with indirect branches, except for // the last block. // If a path does not satisfy all three conditions, it will be rejected, but the // CloneIDs for its (supposed to be cloned) blocks will be bypassed to make sure // that the `BasicBlockSections` pass can map cluster info correctly to the // actually-cloned blocks. //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/CodeGen/BasicBlockSectionUtils.h" #include "llvm/CodeGen/BasicBlockSectionsProfileReader.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/InitializePasses.h" #include "llvm/Support/WithColor.h" #include "llvm/Target/TargetMachine.h" usingnamespacellvm; namespace { // Clones the given block and assigns the given `CloneID` to its BBID. Copies // the instructions into the new block and sets up its successors. MachineBasicBlock *CloneMachineBasicBlock(MachineBasicBlock &OrigBB, unsigned CloneID) { … } // Returns if we can legally apply the cloning represented by `ClonePath`. // `BBIDToBlock` contains the original basic blocks in function `MF` keyed by // their `BBID::BaseID`. bool IsValidCloning(const MachineFunction &MF, const DenseMap<unsigned, MachineBasicBlock *> &BBIDToBlock, const SmallVector<unsigned> &ClonePath) { … } // Applies all clonings specified in `ClonePaths` to `MF`. Returns true // if any clonings have been applied. bool ApplyCloning(MachineFunction &MF, const SmallVector<SmallVector<unsigned>> &ClonePaths) { … } } // end anonymous namespace namespace llvm { class BasicBlockPathCloning : public MachineFunctionPass { … }; } // namespace llvm char BasicBlockPathCloning::ID = …; INITIALIZE_PASS_BEGIN( BasicBlockPathCloning, "bb-path-cloning", "Applies path clonings for the -basic-block-sections=list option", false, false) INITIALIZE_PASS_DEPENDENCY(BasicBlockSectionsProfileReaderWrapperPass) INITIALIZE_PASS_END( BasicBlockPathCloning, "bb-path-cloning", "Applies path clonings for the -basic-block-sections=list option", false, false) bool BasicBlockPathCloning::runOnMachineFunction(MachineFunction &MF) { … } void BasicBlockPathCloning::getAnalysisUsage(AnalysisUsage &AU) const { … } MachineFunctionPass *llvm::createBasicBlockPathCloningPass() { … }