Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change control flow generation scheme #114

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Change control flow generation scheme
  • Loading branch information
Michael Skvortsov committed Mar 16, 2020
commit 330799028bc3f2881a33112d9c1956b8ee93c111
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/TailDuplicator.cpp
Original file line number Diff line number Diff line change
@@ -747,10 +747,12 @@ bool TailDuplicator::duplicateSimpleBB(
}

// Avoid adding fall through branches.
if (TII->canFallthrough(*PredFBB, *NextBB)) { // TVM local
if (PredFBB == NextBB)
PredFBB = nullptr;
if (PredTBB == NextBB && PredFBB == nullptr)
PredTBB = nullptr;
}

auto DL = PredBB->findBranchDebugLoc();
TII->removeBranch(*PredBB);
2 changes: 0 additions & 2 deletions llvm/lib/Target/TVM/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -31,14 +31,12 @@ add_llvm_target(TVMCodeGen
TVMReplacePhysRegs.cpp
TVMRegStackify.cpp
TVMRegNumbering.cpp
TVMPeephole.cpp
TVMStack.cpp
TVMStackBlockInfo.cpp
TVMStackFixup.cpp
TVMStackPatterns.cpp
TVMStackModel.cpp
TVMUtilities.cpp
TVMContinuationsHoist.cpp
TVMLoadStoreReplace.cpp
TVMIfConversionTerm.cpp
)
4 changes: 0 additions & 4 deletions llvm/lib/Target/TVM/TVM.h
Original file line number Diff line number Diff line change
@@ -34,11 +34,9 @@ FunctionPass *createTVMPrepareForLiveIntervals();
FunctionPass *createTVMRematerialize();
FunctionPass *createTVMRegStackify();
FunctionPass *createTVMRegNumbering();
FunctionPass *createTVMPeephole();
FunctionPass *createTVMStackModel();
FunctionPass *createTVMLoopInstructions();
FunctionPass *createTVMLoopPrepare();
FunctionPass *createTVMContinuationsHoist();
FunctionPass *createTVMIfConversionTerm();
BasicBlockPass *createTVMLoadStoreReplace();

@@ -49,11 +47,9 @@ void initializeTVMPrepareForLiveIntervalsPass(PassRegistry &);
void initializeTVMRematerializePass(PassRegistry &);
void initializeTVMRegStackifyPass(PassRegistry &);
void initializeTVMRegNumberingPass(PassRegistry &);
void initializeTVMPeepholePass(PassRegistry &);
void initializeTVMStackModelPass(PassRegistry &);
void initializeTVMLoopInstructionsPass(PassRegistry &);
void initializeTVMLoopPreparePass(PassRegistry &);
void initializeTVMContinuationsHoistPass(PassRegistry &);
void initializeTVMLoadStoreReplacePass(PassRegistry &);
void initializeTVMIfConversionTermPass(PassRegistry &);

147 changes: 52 additions & 95 deletions llvm/lib/Target/TVM/TVMAsmPrinter.cpp
Original file line number Diff line number Diff line change
@@ -49,20 +49,17 @@ class TVMAsmPrinter : public AsmPrinter {
void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O,
const char *Modifier = nullptr);
void EmitInstruction(const MachineInstr *MI) override;
bool ShouldPrintNextBlock(const MachineBasicBlock &CurMBB) const override;
std::string regToString(const MachineOperand &MO);
void EmitBasicBlockStart(const MachineBasicBlock &MBB) const override;
void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override;
void EmitFunctionBodyEnd() override;

void EmitFunctionHeader() override;

/// Print a big LLVM constant int (>64 bit) to the .s file.
void EmitBigInt(const ConstantInt *CI) override;

bool runOnMachineFunction(MachineFunction &MF) override;
protected:
void EmitSubBlockForPushcont(const TVMMCInstLower &lower, const MCInst &Inst,
int depth);
void EmitBBEntry(const MachineBasicBlock &MBB) const;
private:
TVMFunctionInfo *MFI;
};
@@ -97,7 +94,7 @@ void TVMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,

//===----------------------------------------------------------------------===//
void TVMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
LLVM_DEBUG(dbgs() << "EmitInstruction: " << *MI << '\n');
LLVM_DEBUG(dbgs() << "EmitInstruction: " << *MI);
if (isVerbose())
for (auto Comment : MFI->getStackModelComments(MI)) {
OutStreamer->AddComment(Comment);
@@ -131,112 +128,72 @@ void TVMAsmPrinter::EmitInstruction(const MachineInstr *MI) {

MCInst TmpInst;
MCInstLowering.lower(MI, TmpInst);
// We need to access OutStreamer->GetOS() to have such code pattern:
// (tabs for first offset from labels ans 2-spaces nested PUSHCONTs)
// \tInstr1
// \tInstr2
// \tPUSHCONT
// \t{
// \t Instr3
// \t Instr4
// \t PUSHCONT
// \t {
// \t Instr5
// \t Instr6
// \t }
// \t}
OutStreamer->GetOS() << "\t";
OutStreamer->GetOS() << (MF->size() < 2 ? " " : " ");
EmitToStreamer(*OutStreamer, TmpInst);
if (TmpInst.getOpcode() == TVM::PUSHCONT_MBB_S) {
EmitSubBlockForPushcont(MCInstLowering, TmpInst, 0);
}
}
}

bool TVMAsmPrinter::ShouldPrintNextBlock(const MachineBasicBlock &CurMBB) const {
auto Term = CurMBB.terminators();
// Continue if no terminators or fallthrough terminator
if (Term.begin() == Term.end() ||
Term.begin()->getOpcode() == TVM::IFJMP_S ||
Term.begin()->getOpcode() == TVM::IFNOTJMP_S)
return true;
return false;
void TVMAsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) const {
if (MF->size() < 2)
return;
OutStreamer->AddComment(MBB.getName());
OutStreamer->EmitRawText(" PUSHCONT {");
}

void TVMAsmPrinter::EmitBBEntry(const MachineBasicBlock &MBB) const {
if (isVerbose()) {
if (const BasicBlock *BB = MBB.getBasicBlock()) {
if (BB->hasName()) {
BB->printAsOperand(OutStreamer->GetCommentOS(), false, BB->getModule());
OutStreamer->GetCommentOS() << '\n';
}
}
auto BBStackComment = MFI->getStackModelBBComment(&MBB);
if (!BBStackComment.empty())
OutStreamer->AddComment(BBStackComment, true);
}
OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":", false);
void TVMAsmPrinter::EmitBasicBlockEnd(const MachineBasicBlock &MBB) {
if (MF->size() < 2)
return;
OutStreamer->EmitRawText(" }");
}

void TVMAsmPrinter::EmitSubBlockForPushcont(const TVMMCInstLower &lower,
const MCInst &Inst,
int depth) {
OutStreamer->EmitRawText("\t" + std::string(depth, ' ') + "{\n");
void TVMAsmPrinter::EmitFunctionHeader() {
const Function &F = MF->getFunction();
if (F.hasFnAttribute("tvm_raw_func")) {
OutStreamer->EmitRawText("\t.internal\t:" + CurrentFnSym->getName());
} else {
AsmPrinter::EmitFunctionHeader();
}
}

const auto &Mapping = lower.getMCInstrsMap();
const MachineBasicBlock *MBB = nullptr;
void TVMAsmPrinter::EmitFunctionBodyEnd() {
unsigned Blocks = MF->size();
if (Blocks < 2)
return;

auto I = llvm::find_if(Inst, [](const MCOperand &op) { return op.isInst(); });
if (I != Inst.end()) {
auto MIit = Mapping.find(I->getInst());
if (MIit != Mapping.end()) {
if ((MBB = MIit->second->getParent()))
EmitBBEntry(*MBB);
auto *FI = MF->getInfo<TVMFunctionInfo>();
unsigned Arguments = FI->getParams().size();
unsigned ReturnValues = FI->getResults().size();

if (Arguments > 0) {
if (Blocks <= 16 && Arguments <= 16) {
OutStreamer->EmitRawText(" BLKSWAP\t" + Twine(Arguments) + ", " +
Twine(Blocks));
} else {
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Arguments));
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Blocks));
OutStreamer->EmitRawText(" BLKSWX");
}
}

for (const auto &op : Inst) {
if (op.isInst()) {
auto &curInst = *op.getInst();
if (isVerbose()) {
auto MIit = Mapping.find(&curInst);
// PUSHCONT_MBB comment will be printed later, at closing brace '}'
if (MIit != Mapping.end() && curInst.getOpcode() != TVM::PUSHCONT_MBB_S)
for (auto &Comment : MFI->getStackModelComments(MIit->second))
OutStreamer->AddComment(Comment);
if (curInst.getOpcode() == TVM::FALLTHROUGH_RETURN) {
OutStreamer->AddComment("fallthrough return");
OutStreamer->AddBlankLine();
}
}
OutStreamer->GetOS() << "\t";
static_cast<formatted_raw_ostream &>(OutStreamer->GetOS()).
PadToColumn(10 + depth);
EmitToStreamer(*OutStreamer, curInst);
if (curInst.getOpcode() == TVM::PUSHCONT_MBB_S)
EmitSubBlockForPushcont(lower, curInst, depth + 2);
OutStreamer->EmitRawText(" PUSH s" + Twine(Blocks + Arguments - 1));
OutStreamer->EmitRawText(" EXECUTE");

if (ReturnValues > 0) {
if (Blocks <= 16 && ReturnValues <= 16) {
OutStreamer->EmitRawText(" BLKSWAP\t" + Twine(Blocks) + ", " +
Twine(ReturnValues));
} else {
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Blocks));
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(ReturnValues));
OutStreamer->EmitRawText(" BLKSWX");
}
}
if (isVerbose()) {
// Print PUSHCONT_MBB comments at close brace '}'
auto MIit = Mapping.find(&Inst);
if (MIit != Mapping.end())
for (auto &Comment : MFI->getStackModelComments(MIit->second))
OutStreamer->AddComment(Comment);
}
OutStreamer->EmitRawText("\t" + std::string(depth, ' ') + "}\n");
}

void TVMAsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) const {
EmitBBEntry(MBB);
}

void TVMAsmPrinter::EmitFunctionHeader() {
const Function &F = MF->getFunction();
if (F.hasFnAttribute("tvm_raw_func")) {
OutStreamer->EmitRawText("\t.internal\t:" + CurrentFnSym->getName());
if (Blocks < 16) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we avoid the magic number here?

OutStreamer->EmitRawText(" BLKDROP\t" + Twine(Blocks));
} else {
AsmPrinter::EmitFunctionHeader();
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Blocks));
OutStreamer->EmitRawText(" DROPX");
}
}

Loading