Skip to content

[NFC][TableGen] Adopt scaled indent in PredicateExpander #109801

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

Merged
merged 1 commit into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
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
24 changes: 24 additions & 0 deletions llvm/include/llvm/Support/raw_ostream.h
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,30 @@ struct indent {
assert(NumIndents >= N && "Indentation undeflow");
return indent(NumIndents - N, Scale);
}
indent &operator++() { // Prefix ++.
++NumIndents;
return *this;
}
indent operator++(int) { // Postfix ++.
indent Old = *this;
++NumIndents;
return Old;
}
indent &operator--() { // Prefix --.
assert(NumIndents >= 1);
--NumIndents;
return *this;
}
indent operator--(int) { // Postfix --.
indent Old = *this;
assert(NumIndents >= 1);
--NumIndents;
return Old;
}
indent &operator=(unsigned N) {
NumIndents = N;
return *this;
}
};

inline raw_ostream &operator<<(raw_ostream &OS, const indent &Indent) {
Expand Down
20 changes: 20 additions & 0 deletions llvm/unittests/Support/raw_ostream_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,26 @@ TEST(raw_ostreamTest, Indent) {
EXPECT_EQ(Spaces(10), printToString(Scaled));
Scaled -= 1;
EXPECT_EQ(Spaces(8), printToString(Scaled));

// Operators.
Indent = 10;
EXPECT_EQ(Spaces(10), printToString(Indent));

indent Temp = Indent++;
EXPECT_EQ(Spaces(11), printToString(Indent));
EXPECT_EQ(Spaces(10), printToString(Temp));

Temp = Indent--;
EXPECT_EQ(Spaces(10), printToString(Indent));
EXPECT_EQ(Spaces(11), printToString(Temp));

Temp = ++Indent;
EXPECT_EQ(Spaces(11), printToString(Indent));
EXPECT_EQ(Spaces(11), printToString(Temp));

Temp = --Indent;
EXPECT_EQ(Spaces(10), printToString(Indent));
EXPECT_EQ(Spaces(10), printToString(Temp));
}

TEST(raw_ostreamTest, FormatHex) {
Expand Down
107 changes: 40 additions & 67 deletions llvm/utils/TableGen/Common/PredicateExpander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,21 +153,18 @@ void PredicateExpander::expandCheckOpcode(raw_ostream &OS,
}

OS << '(';
increaseIndentLevel();
++Indent;
for (const Record *Rec : Opcodes) {
OS << '\n';
OS.indent(getIndentLevel() * 2);
OS << '\n' << Indent;
if (!First)
OS << (shouldNegate() ? "&& " : "|| ");

expandCheckOpcode(OS, Rec);
First = false;
}

OS << '\n';
decreaseIndentLevel();
OS.indent(getIndentLevel() * 2);
OS << ')';
--Indent;
OS << '\n' << Indent << ')';
}

void PredicateExpander::expandCheckPseudo(raw_ostream &OS,
Expand All @@ -187,22 +184,19 @@ void PredicateExpander::expandPredicateSequence(
// Okay, there is more than one predicate in the set.
bool First = true;
OS << (shouldNegate() ? "!(" : "(");
increaseIndentLevel();
++Indent;

bool OldValue = shouldNegate();
setNegatePredicate(false);
for (const Record *Rec : Sequence) {
OS << '\n';
OS.indent(getIndentLevel() * 2);
OS << '\n' << Indent;
if (!First)
OS << (IsCheckAll ? "&& " : "|| ");
expandPredicate(OS, Rec);
First = false;
}
OS << '\n';
decreaseIndentLevel();
OS.indent(getIndentLevel() * 2);
OS << ')';
--Indent;
OS << '\n' << Indent << ')';
setNegatePredicate(OldValue);
}

Expand Down Expand Up @@ -269,15 +263,14 @@ void PredicateExpander::expandReturnStatement(raw_ostream &OS,
void PredicateExpander::expandOpcodeSwitchCase(raw_ostream &OS,
const Record *Rec) {
for (const Record *Opcode : Rec->getValueAsListOfDefs("Opcodes")) {
OS.indent(getIndentLevel() * 2);
OS << "case " << Opcode->getValueAsString("Namespace")
OS << Indent << "case " << Opcode->getValueAsString("Namespace")
<< "::" << Opcode->getName() << ":\n";
}

increaseIndentLevel();
OS.indent(getIndentLevel() * 2);
++Indent;
OS << Indent;
expandStatement(OS, Rec->getValueAsDef("CaseStmt"));
decreaseIndentLevel();
--Indent;
}

void PredicateExpander::expandOpcodeSwitchStatement(
Expand All @@ -292,17 +285,12 @@ void PredicateExpander::expandOpcodeSwitchStatement(
}

// Expand the default case.
SS.indent(getIndentLevel() * 2);
SS << "default:\n";
SS << Indent << "default:\n";

increaseIndentLevel();
SS.indent(getIndentLevel() * 2);
++Indent;
SS << Indent;
expandStatement(SS, Default);
decreaseIndentLevel();
SS << '\n';

SS.indent(getIndentLevel() * 2);
SS << "} // end of switch-stmt";
SS << '\n' << Indent << "} // end of switch-stmt";
OS << Buffer;
}

Expand Down Expand Up @@ -436,8 +424,7 @@ void STIPredicateExpander::expandHeader(raw_ostream &OS,
const Record *Rec = Fn.getDeclaration();
StringRef FunctionName = Rec->getValueAsString("Name");

OS.indent(getIndentLevel() * 2);
OS << "bool ";
OS << Indent << "bool ";
if (shouldExpandDefinition())
OS << getClassPrefix() << "::";
OS << FunctionName << "(";
Expand All @@ -463,26 +450,22 @@ void STIPredicateExpander::expandPrologue(raw_ostream &OS,
bool UpdatesOpcodeMask =
Fn.getDeclaration()->getValueAsBit("UpdatesOpcodeMask");

increaseIndentLevel();
unsigned IndentLevel = getIndentLevel();
++Indent;
for (const Record *Delegate :
Fn.getDeclaration()->getValueAsListOfDefs("Delegates")) {
OS.indent(IndentLevel * 2);
OS << "if (" << Delegate->getValueAsString("Name") << "(MI";
OS << Indent << "if (" << Delegate->getValueAsString("Name") << "(MI";
if (UpdatesOpcodeMask)
OS << ", Mask";
if (shouldExpandForMC())
OS << ", ProcessorID";
OS << "))\n";
OS.indent((1 + IndentLevel) * 2);
OS << "return true;\n\n";
OS << Indent + 1 << "return true;\n\n";
}

if (shouldExpandForMC())
return;

OS.indent(IndentLevel * 2);
OS << "unsigned ProcessorID = getSchedModel().getProcessorID();\n";
OS << Indent << "unsigned ProcessorID = getSchedModel().getProcessorID();\n";
}

void STIPredicateExpander::expandOpcodeGroup(raw_ostream &OS,
Expand All @@ -497,8 +480,7 @@ void STIPredicateExpander::expandOpcodeGroup(raw_ostream &OS,
continue;

if (FirstProcID) {
OS.indent(getIndentLevel() * 2);
OS << "if (ProcessorID == " << I;
OS << Indent << "if (ProcessorID == " << I;
} else {
OS << " || ProcessorID == " << I;
}
Expand All @@ -507,21 +489,20 @@ void STIPredicateExpander::expandOpcodeGroup(raw_ostream &OS,

OS << ") {\n";

increaseIndentLevel();
OS.indent(getIndentLevel() * 2);
++Indent;
OS << Indent;
if (ShouldUpdateOpcodeMask) {
if (PI.OperandMask.isZero())
OS << "Mask.clearAllBits();\n";
else
OS << "Mask = " << PI.OperandMask << ";\n";
OS.indent(getIndentLevel() * 2);
OS << Indent;
}
OS << "return ";
expandPredicate(OS, PI.Predicate);
OS << ";\n";
decreaseIndentLevel();
OS.indent(getIndentLevel() * 2);
OS << "}\n";
--Indent;
OS << Indent << "}\n";
}
}

Expand All @@ -530,46 +511,38 @@ void STIPredicateExpander::expandBody(raw_ostream &OS,
bool UpdatesOpcodeMask =
Fn.getDeclaration()->getValueAsBit("UpdatesOpcodeMask");

unsigned IndentLevel = getIndentLevel();
OS.indent(IndentLevel * 2);
OS << "switch(MI" << (isByRef() ? "." : "->") << "getOpcode()) {\n";
OS.indent(IndentLevel * 2);
OS << "default:\n";
OS.indent(IndentLevel * 2);
OS << " break;";
OS << Indent << "switch(MI" << (isByRef() ? "." : "->") << "getOpcode()) {\n";
OS << Indent << "default:\n";
OS << Indent << " break;";

for (const OpcodeGroup &Group : Fn.getGroups()) {
for (const Record *Opcode : Group.getOpcodes()) {
OS << '\n';
OS.indent(IndentLevel * 2);
OS << "case " << getTargetName() << "::" << Opcode->getName() << ":";
OS << '\n'
<< Indent << "case " << getTargetName() << "::" << Opcode->getName()
<< ":";
}

OS << '\n';
increaseIndentLevel();
++Indent;
expandOpcodeGroup(OS, Group, UpdatesOpcodeMask);

OS.indent(getIndentLevel() * 2);
OS << "break;\n";
decreaseIndentLevel();
OS << Indent << "break;\n";
--Indent;
}

OS.indent(IndentLevel * 2);
OS << "}\n";
OS << Indent << "}\n";
}

void STIPredicateExpander::expandEpilogue(raw_ostream &OS,
const STIPredicateFunction &Fn) {
OS << '\n';
OS.indent(getIndentLevel() * 2);
OS << '\n' << Indent;
OS << "return ";
expandPredicate(OS, Fn.getDefaultReturnPredicate());
OS << ";\n";

decreaseIndentLevel();
OS.indent(getIndentLevel() * 2);
--Indent;
StringRef FunctionName = Fn.getDeclaration()->getValueAsString("Name");
OS << "} // " << ClassPrefix << "::" << FunctionName << "\n\n";
OS << Indent << "} // " << ClassPrefix << "::" << FunctionName << "\n\n";
}

void STIPredicateExpander::expandSTIPredicate(raw_ostream &OS,
Expand Down
19 changes: 9 additions & 10 deletions llvm/utils/TableGen/Common/PredicateExpander.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,38 @@

#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/raw_ostream.h"

namespace llvm {

class raw_ostream;
class Record;

class PredicateExpander {
bool EmitCallsByRef;
bool NegatePredicate;
bool ExpandForMC;
unsigned IndentLevel;
StringRef TargetName;

PredicateExpander(const PredicateExpander &) = delete;
PredicateExpander &operator=(const PredicateExpander &) = delete;

protected:
indent Indent;

public:
PredicateExpander(StringRef Target)
explicit PredicateExpander(StringRef Target, unsigned Indent = 1)
: EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
IndentLevel(1U), TargetName(Target) {}
TargetName(Target), Indent(Indent, 2) {}
bool isByRef() const { return EmitCallsByRef; }
bool shouldNegate() const { return NegatePredicate; }
bool shouldExpandForMC() const { return ExpandForMC; }
unsigned getIndentLevel() const { return IndentLevel; }
indent &getIndent() { return Indent; }
StringRef getTargetName() const { return TargetName; }

void setByRef(bool Value) { EmitCallsByRef = Value; }
void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
void setNegatePredicate(bool Value) { NegatePredicate = Value; }
void setExpandForMC(bool Value) { ExpandForMC = Value; }
void setIndentLevel(unsigned Level) { IndentLevel = Level; }
void increaseIndentLevel() { ++IndentLevel; }
void decreaseIndentLevel() { --IndentLevel; }

void expandTrue(raw_ostream &OS);
void expandFalse(raw_ostream &OS);
Expand Down Expand Up @@ -116,8 +115,8 @@ class STIPredicateExpander : public PredicateExpander {
void expandEpilogue(raw_ostream &OS, const STIPredicateFunction &Fn);

public:
STIPredicateExpander(StringRef Target)
: PredicateExpander(Target), ExpandDefinition(false) {}
explicit STIPredicateExpander(StringRef Target, unsigned Indent = 1)
: PredicateExpander(Target, Indent), ExpandDefinition(false) {}

bool shouldExpandDefinition() const { return ExpandDefinition; }
StringRef getClassPrefix() const { return ClassPrefix; }
Expand Down
4 changes: 2 additions & 2 deletions llvm/utils/TableGen/InstrInfoEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ void InstrInfoEmitter::emitMCIIHelperMethods(raw_ostream &OS,
OS << "bool " << Rec->getValueAsString("FunctionName");
OS << "(const MCInst &MI) {\n";

OS.indent(PE.getIndentLevel() * 2);
OS << PE.getIndent();
PE.expandStatement(OS, Rec->getValueAsDef("Body"));
OS << "\n}\n\n";
}
Expand Down Expand Up @@ -914,7 +914,7 @@ void InstrInfoEmitter::emitTIIHelperMethods(raw_ostream &OS,
}

OS << " {\n";
OS.indent(PE.getIndentLevel() * 2);
OS << PE.getIndent();
PE.expandStatement(OS, Rec->getValueAsDef("Body"));
OS << "\n}\n\n";
}
Expand Down
4 changes: 2 additions & 2 deletions llvm/utils/TableGen/MacroFusionPredicatorEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ void MacroFusionPredicatorEmitter::emitFirstPredicate(const Record *Predicate,
OS.indent(4) << "const MachineInstr *MI = FirstMI;\n";
OS.indent(4) << "if (";
PE.setNegatePredicate(true);
PE.setIndentLevel(3);
PE.getIndent() = 3;
PE.expandPredicate(OS, Predicate->getValueAsDef("Predicate"));
OS << ")\n";
OS.indent(4) << " return false;\n";
Expand All @@ -181,7 +181,7 @@ void MacroFusionPredicatorEmitter::emitSecondPredicate(const Record *Predicate,
OS.indent(4) << "const MachineInstr *MI = &SecondMI;\n";
OS.indent(4) << "if (";
PE.setNegatePredicate(true);
PE.setIndentLevel(3);
PE.getIndent() = 3;
PE.expandPredicate(OS, Predicate->getValueAsDef("Predicate"));
OS << ")\n";
OS.indent(4) << " return false;\n";
Expand Down
Loading
Loading