This file implements a pass that converts X86 cmov instructions into branches when profitable.
More...
|
| STATISTIC (NumOfSkippedCmovGroups, "Number of unsupported CMOV-groups") |
|
| STATISTIC (NumOfCmovGroupCandidate, "Number of CMOV-group candidates") |
|
| STATISTIC (NumOfLoopCandidate, "Number of CMOV-conversion profitable loops") |
|
| STATISTIC (NumOfOptimizedCmovGroups, "Number of optimized CMOV-groups") |
|
static unsigned | getDepthOfOptCmov (unsigned TrueOpDepth, unsigned FalseOpDepth) |
|
static bool | checkEFLAGSLive (MachineInstr *MI) |
|
static void | packCmovGroup (MachineInstr *First, MachineInstr *Last) |
| Given /p First CMOV instruction and /p Last CMOV instruction representing a group of CMOV instructions, which may contain debug instructions in between, move all debug instructions to after the last CMOV instruction, making the CMOV group consecutive. More...
|
|
| INITIALIZE_PASS_BEGIN (X86CmovConverterPass, DEBUG_TYPE, "X86 cmov Conversion", false, false) INITIALIZE_PASS_END(X86CmovConverterPass |
|
This file implements a pass that converts X86 cmov instructions into branches when profitable.
This pass is conservative. It transforms if and only if it can guarantee a gain with high confidence.
Thus, the optimization applies under the following conditions:
- Consider as candidates only CMOVs in innermost loops (assume that most hotspots are represented by these loops).
- Given a group of CMOV instructions that are using the same EFLAGS def instruction: a. Consider them as candidates only if all have the same code condition or the opposite one to prevent generating more than one conditional jump per EFLAGS def instruction. b. Consider them as candidates only if all are profitable to be converted (assume that one bad conversion may cause a degradation).
- Apply conversion only for loops that are found profitable and only for CMOV candidates that were found profitable. a. A loop is considered profitable only if conversion will reduce its depth cost by some threshold. b. CMOV is considered profitable if the cost of its condition is higher than the average cost of its true-value and false-value by 25% of branch-misprediction-penalty. This assures no degradation even with 25% branch misprediction.
Note: This pass is assumed to run on SSA machine code.
Definition in file X86CmovConversion.cpp.
Given /p First CMOV instruction and /p Last CMOV instruction representing a group of CMOV instructions, which may contain debug instructions in between, move all debug instructions to after the last CMOV instruction, making the CMOV group consecutive.
Definition at line 596 of file X86CmovConversion.cpp.
References llvm::MachineBasicBlock::addLiveIn(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), llvm::MachineBasicBlock::addSuccessor(), llvm::any_of(), assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::MachineBasicBlock::begin(), llvm::BuildMI(), checkEFLAGSLive(), llvm::X86::COND_INVALID, llvm::MachineFunction::CreateMachineBasicBlock(), llvm::dbgs(), DEBUG_TYPE, llvm::MachineInstr::dump(), E, llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::MachineBasicBlock::end(), llvm::MachineBasicBlock::erase(), F(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::SmallVectorTemplateCommon< T, typename >::front(), llvm::MachineBasicBlock::getBasicBlock(), llvm::X86::GetCondBranchFromCond(), llvm::X86::getCondFromCMovOpc(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineInstr::getOpcode(), llvm::X86::GetOppositeBranchCondition(), llvm::MachineBasicBlock::getParent(), llvm::MachineInstr::getParent(), I, INITIALIZE_PASS_BEGIN(), INITIALIZE_PASS_DEPENDENCY, llvm::MachineBasicBlock::insert(), llvm::MachineFunction::insert(), llvm::MachineBasicBlock::insertAfter(), LLVM_DEBUG, llvm::MachineInstr::mayLoad(), MI, MRI, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::MachineBasicBlock::splice(), std::swap(), TII, and llvm::MachineBasicBlock::transferSuccessorsAndUpdatePHIs().