#include "MCTargetDesc/R600MCTargetDesc.h"
#include "R600.h"
#include "R600RegisterInfo.h"
#include "R600Subtarget.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/SCCIterator.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachinePostDominators.h"
#include "llvm/InitializePasses.h"
usingnamespacellvm;
#define DEBUG_TYPE …
enum { … };
STATISTIC(numSerialPatternMatch, "CFGStructurizer number of serial pattern "
"matched");
STATISTIC(numIfPatternMatch, "CFGStructurizer number of if pattern "
"matched");
STATISTIC(numClonedBlock, "CFGStructurizer cloned blocks");
STATISTIC(numClonedInstr, "CFGStructurizer cloned instructions");
namespace llvm {
void initializeR600MachineCFGStructurizerPass(PassRegistry &);
}
namespace {
#define SHOWNEWINSTR(i) …
#define SHOWNEWBLK(b, msg) …
#define SHOWBLK_DETAIL(b, msg) …
#define INVALIDSCCNUM …
class BlockInformation { … };
class R600MachineCFGStructurizer : public MachineFunctionPass { … };
}
char R600MachineCFGStructurizer::ID = …;
int R600MachineCFGStructurizer::getSCCNum(MachineBasicBlock *MBB) const { … }
MachineBasicBlock *R600MachineCFGStructurizer::getLoopLandInfo(MachineLoop *LoopRep)
const { … }
bool R600MachineCFGStructurizer::hasBackEdge(MachineBasicBlock *MBB) const { … }
bool R600MachineCFGStructurizer::isRetiredBlock(MachineBasicBlock *MBB) const { … }
bool R600MachineCFGStructurizer::isActiveLoophead(MachineBasicBlock *MBB) const { … }
R600MachineCFGStructurizer::PathToKind R600MachineCFGStructurizer::singlePathTo(
MachineBasicBlock *SrcMBB, MachineBasicBlock *DstMBB,
bool AllowSideEntry) const { … }
int R600MachineCFGStructurizer::countActiveBlock(MBBVector::const_iterator It,
MBBVector::const_iterator E) const { … }
bool R600MachineCFGStructurizer::needMigrateBlock(MachineBasicBlock *MBB) const { … }
void R600MachineCFGStructurizer::reversePredicateSetter(
MachineBasicBlock::iterator I, MachineBasicBlock &MBB) { … }
void R600MachineCFGStructurizer::insertInstrEnd(MachineBasicBlock *MBB,
int NewOpcode, const DebugLoc &DL) { … }
MachineInstr *R600MachineCFGStructurizer::insertInstrBefore(MachineBasicBlock *MBB,
int NewOpcode,
const DebugLoc &DL) { … }
MachineInstr *R600MachineCFGStructurizer::insertInstrBefore(
MachineBasicBlock::iterator I, int NewOpcode) { … }
void R600MachineCFGStructurizer::insertCondBranchBefore(
MachineBasicBlock::iterator I, int NewOpcode, const DebugLoc &DL) { … }
void R600MachineCFGStructurizer::insertCondBranchBefore(
MachineBasicBlock *blk, MachineBasicBlock::iterator I, int NewOpcode,
int RegNum, const DebugLoc &DL) { … }
int R600MachineCFGStructurizer::getBranchNzeroOpcode(int OldOpcode) { … }
int R600MachineCFGStructurizer::getBranchZeroOpcode(int OldOpcode) { … }
int R600MachineCFGStructurizer::getContinueNzeroOpcode(int OldOpcode) { … }
int R600MachineCFGStructurizer::getContinueZeroOpcode(int OldOpcode) { … }
MachineBasicBlock *R600MachineCFGStructurizer::getTrueBranch(MachineInstr *MI) { … }
void R600MachineCFGStructurizer::setTrueBranch(MachineInstr *MI,
MachineBasicBlock *MBB) { … }
MachineBasicBlock *
R600MachineCFGStructurizer::getFalseBranch(MachineBasicBlock *MBB,
MachineInstr *MI) { … }
bool R600MachineCFGStructurizer::isCondBranch(MachineInstr *MI) { … }
bool R600MachineCFGStructurizer::isUncondBranch(MachineInstr *MI) { … }
DebugLoc R600MachineCFGStructurizer::getLastDebugLocInBB(MachineBasicBlock *MBB) { … }
MachineInstr *R600MachineCFGStructurizer::getNormalBlockBranchInstr(
MachineBasicBlock *MBB) { … }
MachineInstr *R600MachineCFGStructurizer::getLoopendBlockBranchInstr(
MachineBasicBlock *MBB) { … }
MachineInstr *R600MachineCFGStructurizer::getReturnInstr(MachineBasicBlock *MBB) { … }
bool R600MachineCFGStructurizer::isReturnBlock(MachineBasicBlock *MBB) { … }
void R600MachineCFGStructurizer::cloneSuccessorList(MachineBasicBlock *DstMBB,
MachineBasicBlock *SrcMBB) { … }
MachineBasicBlock *R600MachineCFGStructurizer::clone(MachineBasicBlock *MBB) { … }
void R600MachineCFGStructurizer::replaceInstrUseOfBlockWith(
MachineBasicBlock *SrcMBB, MachineBasicBlock *OldMBB,
MachineBasicBlock *NewBlk) { … }
void R600MachineCFGStructurizer::wrapup(MachineBasicBlock *MBB) { … }
bool R600MachineCFGStructurizer::prepare() { … }
bool R600MachineCFGStructurizer::run() { … }
void R600MachineCFGStructurizer::orderBlocks(MachineFunction *MF) { … }
int R600MachineCFGStructurizer::patternMatch(MachineBasicBlock *MBB) { … }
int R600MachineCFGStructurizer::patternMatchGroup(MachineBasicBlock *MBB) { … }
int R600MachineCFGStructurizer::serialPatternMatch(MachineBasicBlock *MBB) { … }
int R600MachineCFGStructurizer::ifPatternMatch(MachineBasicBlock *MBB) { … }
int R600MachineCFGStructurizer::loopendPatternMatch() { … }
int R600MachineCFGStructurizer::mergeLoop(MachineLoop *LoopRep) { … }
bool R600MachineCFGStructurizer::isSameloopDetachedContbreak(
MachineBasicBlock *Src1MBB, MachineBasicBlock *Src2MBB) { … }
int R600MachineCFGStructurizer::handleJumpintoIf(MachineBasicBlock *HeadMBB,
MachineBasicBlock *TrueMBB, MachineBasicBlock *FalseMBB) { … }
int R600MachineCFGStructurizer::handleJumpintoIfImp(MachineBasicBlock *HeadMBB,
MachineBasicBlock *TrueMBB, MachineBasicBlock *FalseMBB) { … }
#ifndef NDEBUG
void R600MachineCFGStructurizer::showImproveSimpleJumpintoIf(
MachineBasicBlock *HeadMBB, MachineBasicBlock *TrueMBB,
MachineBasicBlock *FalseMBB, MachineBasicBlock *LandMBB, bool Detail) {
dbgs() << "head = BB" << HeadMBB->getNumber()
<< " size = " << HeadMBB->size();
if (Detail) {
dbgs() << "\n";
HeadMBB->print(dbgs());
dbgs() << "\n";
}
if (TrueMBB) {
dbgs() << ", true = BB" << TrueMBB->getNumber() << " size = "
<< TrueMBB->size() << " numPred = " << TrueMBB->pred_size();
if (Detail) {
dbgs() << "\n";
TrueMBB->print(dbgs());
dbgs() << "\n";
}
}
if (FalseMBB) {
dbgs() << ", false = BB" << FalseMBB->getNumber() << " size = "
<< FalseMBB->size() << " numPred = " << FalseMBB->pred_size();
if (Detail) {
dbgs() << "\n";
FalseMBB->print(dbgs());
dbgs() << "\n";
}
}
if (LandMBB) {
dbgs() << ", land = BB" << LandMBB->getNumber() << " size = "
<< LandMBB->size() << " numPred = " << LandMBB->pred_size();
if (Detail) {
dbgs() << "\n";
LandMBB->print(dbgs());
dbgs() << "\n";
}
}
dbgs() << "\n";
}
#endif
int R600MachineCFGStructurizer::improveSimpleJumpintoIf(MachineBasicBlock *HeadMBB,
MachineBasicBlock *TrueMBB, MachineBasicBlock *FalseMBB,
MachineBasicBlock **LandMBBPtr) { … }
void R600MachineCFGStructurizer::mergeSerialBlock(MachineBasicBlock *DstMBB,
MachineBasicBlock *SrcMBB) { … }
void R600MachineCFGStructurizer::mergeIfthenelseBlock(MachineInstr *BranchMI,
MachineBasicBlock *MBB, MachineBasicBlock *TrueMBB,
MachineBasicBlock *FalseMBB, MachineBasicBlock *LandMBB) { … }
void R600MachineCFGStructurizer::mergeLooplandBlock(MachineBasicBlock *DstBlk,
MachineBasicBlock *LandMBB) { … }
void R600MachineCFGStructurizer::mergeLoopbreakBlock(MachineBasicBlock *ExitingMBB,
MachineBasicBlock *LandMBB) { … }
void R600MachineCFGStructurizer::settleLoopcontBlock(MachineBasicBlock *ContingMBB,
MachineBasicBlock *ContMBB) { … }
int R600MachineCFGStructurizer::cloneOnSideEntryTo(MachineBasicBlock *PreMBB,
MachineBasicBlock *SrcMBB, MachineBasicBlock *DstMBB) { … }
MachineBasicBlock *
R600MachineCFGStructurizer::cloneBlockForPredecessor(MachineBasicBlock *MBB,
MachineBasicBlock *PredMBB) { … }
void R600MachineCFGStructurizer::migrateInstruction(MachineBasicBlock *SrcMBB,
MachineBasicBlock *DstMBB, MachineBasicBlock::iterator I) { … }
MachineBasicBlock *
R600MachineCFGStructurizer::normalizeInfiniteLoopExit(MachineLoop* LoopRep) { … }
void R600MachineCFGStructurizer::removeUnconditionalBranch(MachineBasicBlock *MBB) { … }
void R600MachineCFGStructurizer::removeRedundantConditionalBranch(
MachineBasicBlock *MBB) { … }
void R600MachineCFGStructurizer::addDummyExitBlock(
SmallVectorImpl<MachineBasicBlock*> &RetMBB) { … }
void R600MachineCFGStructurizer::removeSuccessor(MachineBasicBlock *MBB) { … }
void R600MachineCFGStructurizer::recordSccnum(MachineBasicBlock *MBB,
int SccNum) { … }
void R600MachineCFGStructurizer::retireBlock(MachineBasicBlock *MBB) { … }
INITIALIZE_PASS_BEGIN(R600MachineCFGStructurizer, "amdgpustructurizer",
"AMDGPU CFG Structurizer", false, false)
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
INITIALIZE_PASS_END(R600MachineCFGStructurizer, "amdgpustructurizer",
"AMDGPU CFG Structurizer", false, false)
FunctionPass *llvm::createR600MachineCFGStructurizerPass() { … }