Skip to content

Commit 3307990

Browse files
author
Michael Skvortsov
committed
Change control flow generation scheme
1 parent b62f8d8 commit 3307990

21 files changed

+276
-1202
lines changed

llvm/lib/CodeGen/TailDuplicator.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,10 +747,12 @@ bool TailDuplicator::duplicateSimpleBB(
747747
}
748748

749749
// Avoid adding fall through branches.
750+
if (TII->canFallthrough(*PredFBB, *NextBB)) { // TVM local
750751
if (PredFBB == NextBB)
751752
PredFBB = nullptr;
752753
if (PredTBB == NextBB && PredFBB == nullptr)
753754
PredTBB = nullptr;
755+
}
754756

755757
auto DL = PredBB->findBranchDebugLoc();
756758
TII->removeBranch(*PredBB);

llvm/lib/Target/TVM/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ add_llvm_target(TVMCodeGen
3131
TVMReplacePhysRegs.cpp
3232
TVMRegStackify.cpp
3333
TVMRegNumbering.cpp
34-
TVMPeephole.cpp
3534
TVMStack.cpp
3635
TVMStackBlockInfo.cpp
3736
TVMStackFixup.cpp
3837
TVMStackPatterns.cpp
3938
TVMStackModel.cpp
4039
TVMUtilities.cpp
41-
TVMContinuationsHoist.cpp
4240
TVMLoadStoreReplace.cpp
4341
TVMIfConversionTerm.cpp
4442
)

llvm/lib/Target/TVM/TVM.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,9 @@ FunctionPass *createTVMPrepareForLiveIntervals();
3434
FunctionPass *createTVMRematerialize();
3535
FunctionPass *createTVMRegStackify();
3636
FunctionPass *createTVMRegNumbering();
37-
FunctionPass *createTVMPeephole();
3837
FunctionPass *createTVMStackModel();
3938
FunctionPass *createTVMLoopInstructions();
4039
FunctionPass *createTVMLoopPrepare();
41-
FunctionPass *createTVMContinuationsHoist();
4240
FunctionPass *createTVMIfConversionTerm();
4341
BasicBlockPass *createTVMLoadStoreReplace();
4442

@@ -49,11 +47,9 @@ void initializeTVMPrepareForLiveIntervalsPass(PassRegistry &);
4947
void initializeTVMRematerializePass(PassRegistry &);
5048
void initializeTVMRegStackifyPass(PassRegistry &);
5149
void initializeTVMRegNumberingPass(PassRegistry &);
52-
void initializeTVMPeepholePass(PassRegistry &);
5350
void initializeTVMStackModelPass(PassRegistry &);
5451
void initializeTVMLoopInstructionsPass(PassRegistry &);
5552
void initializeTVMLoopPreparePass(PassRegistry &);
56-
void initializeTVMContinuationsHoistPass(PassRegistry &);
5753
void initializeTVMLoadStoreReplacePass(PassRegistry &);
5854
void initializeTVMIfConversionTermPass(PassRegistry &);
5955

llvm/lib/Target/TVM/TVMAsmPrinter.cpp

Lines changed: 52 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,17 @@ class TVMAsmPrinter : public AsmPrinter {
4949
void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O,
5050
const char *Modifier = nullptr);
5151
void EmitInstruction(const MachineInstr *MI) override;
52-
bool ShouldPrintNextBlock(const MachineBasicBlock &CurMBB) const override;
5352
std::string regToString(const MachineOperand &MO);
5453
void EmitBasicBlockStart(const MachineBasicBlock &MBB) const override;
54+
void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override;
55+
void EmitFunctionBodyEnd() override;
5556

5657
void EmitFunctionHeader() override;
5758

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

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

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

132129
MCInst TmpInst;
133130
MCInstLowering.lower(MI, TmpInst);
134-
// We need to access OutStreamer->GetOS() to have such code pattern:
135-
// (tabs for first offset from labels ans 2-spaces nested PUSHCONTs)
136-
// \tInstr1
137-
// \tInstr2
138-
// \tPUSHCONT
139-
// \t{
140-
// \t Instr3
141-
// \t Instr4
142-
// \t PUSHCONT
143-
// \t {
144-
// \t Instr5
145-
// \t Instr6
146-
// \t }
147-
// \t}
148-
OutStreamer->GetOS() << "\t";
131+
OutStreamer->GetOS() << (MF->size() < 2 ? " " : " ");
149132
EmitToStreamer(*OutStreamer, TmpInst);
150-
if (TmpInst.getOpcode() == TVM::PUSHCONT_MBB_S) {
151-
EmitSubBlockForPushcont(MCInstLowering, TmpInst, 0);
152-
}
153133
}
154134
}
155135

156-
bool TVMAsmPrinter::ShouldPrintNextBlock(const MachineBasicBlock &CurMBB) const {
157-
auto Term = CurMBB.terminators();
158-
// Continue if no terminators or fallthrough terminator
159-
if (Term.begin() == Term.end() ||
160-
Term.begin()->getOpcode() == TVM::IFJMP_S ||
161-
Term.begin()->getOpcode() == TVM::IFNOTJMP_S)
162-
return true;
163-
return false;
136+
void TVMAsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) const {
137+
if (MF->size() < 2)
138+
return;
139+
OutStreamer->AddComment(MBB.getName());
140+
OutStreamer->EmitRawText(" PUSHCONT {");
164141
}
165142

166-
void TVMAsmPrinter::EmitBBEntry(const MachineBasicBlock &MBB) const {
167-
if (isVerbose()) {
168-
if (const BasicBlock *BB = MBB.getBasicBlock()) {
169-
if (BB->hasName()) {
170-
BB->printAsOperand(OutStreamer->GetCommentOS(), false, BB->getModule());
171-
OutStreamer->GetCommentOS() << '\n';
172-
}
173-
}
174-
auto BBStackComment = MFI->getStackModelBBComment(&MBB);
175-
if (!BBStackComment.empty())
176-
OutStreamer->AddComment(BBStackComment, true);
177-
}
178-
OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":", false);
143+
void TVMAsmPrinter::EmitBasicBlockEnd(const MachineBasicBlock &MBB) {
144+
if (MF->size() < 2)
145+
return;
146+
OutStreamer->EmitRawText(" }");
179147
}
180148

181-
void TVMAsmPrinter::EmitSubBlockForPushcont(const TVMMCInstLower &lower,
182-
const MCInst &Inst,
183-
int depth) {
184-
OutStreamer->EmitRawText("\t" + std::string(depth, ' ') + "{\n");
149+
void TVMAsmPrinter::EmitFunctionHeader() {
150+
const Function &F = MF->getFunction();
151+
if (F.hasFnAttribute("tvm_raw_func")) {
152+
OutStreamer->EmitRawText("\t.internal\t:" + CurrentFnSym->getName());
153+
} else {
154+
AsmPrinter::EmitFunctionHeader();
155+
}
156+
}
185157

186-
const auto &Mapping = lower.getMCInstrsMap();
187-
const MachineBasicBlock *MBB = nullptr;
158+
void TVMAsmPrinter::EmitFunctionBodyEnd() {
159+
unsigned Blocks = MF->size();
160+
if (Blocks < 2)
161+
return;
188162

189-
auto I = llvm::find_if(Inst, [](const MCOperand &op) { return op.isInst(); });
190-
if (I != Inst.end()) {
191-
auto MIit = Mapping.find(I->getInst());
192-
if (MIit != Mapping.end()) {
193-
if ((MBB = MIit->second->getParent()))
194-
EmitBBEntry(*MBB);
163+
auto *FI = MF->getInfo<TVMFunctionInfo>();
164+
unsigned Arguments = FI->getParams().size();
165+
unsigned ReturnValues = FI->getResults().size();
166+
167+
if (Arguments > 0) {
168+
if (Blocks <= 16 && Arguments <= 16) {
169+
OutStreamer->EmitRawText(" BLKSWAP\t" + Twine(Arguments) + ", " +
170+
Twine(Blocks));
171+
} else {
172+
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Arguments));
173+
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Blocks));
174+
OutStreamer->EmitRawText(" BLKSWX");
195175
}
196176
}
197177

198-
for (const auto &op : Inst) {
199-
if (op.isInst()) {
200-
auto &curInst = *op.getInst();
201-
if (isVerbose()) {
202-
auto MIit = Mapping.find(&curInst);
203-
// PUSHCONT_MBB comment will be printed later, at closing brace '}'
204-
if (MIit != Mapping.end() && curInst.getOpcode() != TVM::PUSHCONT_MBB_S)
205-
for (auto &Comment : MFI->getStackModelComments(MIit->second))
206-
OutStreamer->AddComment(Comment);
207-
if (curInst.getOpcode() == TVM::FALLTHROUGH_RETURN) {
208-
OutStreamer->AddComment("fallthrough return");
209-
OutStreamer->AddBlankLine();
210-
}
211-
}
212-
OutStreamer->GetOS() << "\t";
213-
static_cast<formatted_raw_ostream &>(OutStreamer->GetOS()).
214-
PadToColumn(10 + depth);
215-
EmitToStreamer(*OutStreamer, curInst);
216-
if (curInst.getOpcode() == TVM::PUSHCONT_MBB_S)
217-
EmitSubBlockForPushcont(lower, curInst, depth + 2);
178+
OutStreamer->EmitRawText(" PUSH s" + Twine(Blocks + Arguments - 1));
179+
OutStreamer->EmitRawText(" EXECUTE");
180+
181+
if (ReturnValues > 0) {
182+
if (Blocks <= 16 && ReturnValues <= 16) {
183+
OutStreamer->EmitRawText(" BLKSWAP\t" + Twine(Blocks) + ", " +
184+
Twine(ReturnValues));
185+
} else {
186+
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Blocks));
187+
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(ReturnValues));
188+
OutStreamer->EmitRawText(" BLKSWX");
218189
}
219190
}
220-
if (isVerbose()) {
221-
// Print PUSHCONT_MBB comments at close brace '}'
222-
auto MIit = Mapping.find(&Inst);
223-
if (MIit != Mapping.end())
224-
for (auto &Comment : MFI->getStackModelComments(MIit->second))
225-
OutStreamer->AddComment(Comment);
226-
}
227-
OutStreamer->EmitRawText("\t" + std::string(depth, ' ') + "}\n");
228-
}
229-
230-
void TVMAsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) const {
231-
EmitBBEntry(MBB);
232-
}
233191

234-
void TVMAsmPrinter::EmitFunctionHeader() {
235-
const Function &F = MF->getFunction();
236-
if (F.hasFnAttribute("tvm_raw_func")) {
237-
OutStreamer->EmitRawText("\t.internal\t:" + CurrentFnSym->getName());
192+
if (Blocks < 16) {
193+
OutStreamer->EmitRawText(" BLKDROP\t" + Twine(Blocks));
238194
} else {
239-
AsmPrinter::EmitFunctionHeader();
195+
OutStreamer->EmitRawText(" PUSHINT\t" + Twine(Blocks));
196+
OutStreamer->EmitRawText(" DROPX");
240197
}
241198
}
242199

0 commit comments

Comments
 (0)