Skip to content

Commit 3a34710

Browse files
authored
[NFC][LLVM][AsmWriter] Move type printing to WriteAsOperandInternal (#161456)
Add option to `WriteAsOperandInternal` to print the type and use that to eliminate explicit type printing code in several places.
1 parent da16057 commit 3a34710

File tree

1 file changed

+30
-58
lines changed

1 file changed

+30
-58
lines changed

llvm/lib/IR/AsmWriter.cpp

Lines changed: 30 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1465,7 +1465,8 @@ struct AsmWriterContext {
14651465
//===----------------------------------------------------------------------===//
14661466

14671467
static void WriteAsOperandInternal(raw_ostream &Out, const Value *V,
1468-
AsmWriterContext &WriterCtx);
1468+
AsmWriterContext &WriterCtx,
1469+
bool PrintType = false);
14691470

14701471
static void WriteAsOperandInternal(raw_ostream &Out, const Metadata *MD,
14711472
AsmWriterContext &WriterCtx,
@@ -1685,23 +1686,19 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
16851686
ListSeparator LS;
16861687
for (unsigned i = 0, e = NumOpsToWrite; i != e; ++i) {
16871688
Out << LS;
1688-
WriterCtx.TypePrinter->print(CPA->getOperand(i)->getType(), Out);
1689-
Out << ' ';
1690-
WriteAsOperandInternal(Out, CPA->getOperand(i), WriterCtx);
1689+
WriteAsOperandInternal(Out, CPA->getOperand(i), WriterCtx,
1690+
/*PrintType=*/true);
16911691
}
16921692
Out << ')';
16931693
return;
16941694
}
16951695

16961696
if (const ConstantArray *CA = dyn_cast<ConstantArray>(CV)) {
1697-
Type *ETy = CA->getType()->getElementType();
16981697
Out << '[';
16991698
ListSeparator LS;
17001699
for (const Value *Op : CA->operands()) {
17011700
Out << LS;
1702-
WriterCtx.TypePrinter->print(ETy, Out);
1703-
Out << ' ';
1704-
WriteAsOperandInternal(Out, Op, WriterCtx);
1701+
WriteAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
17051702
}
17061703
Out << ']';
17071704
return;
@@ -1717,14 +1714,12 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
17171714
return;
17181715
}
17191716

1720-
Type *ETy = CA->getType()->getElementType();
17211717
Out << '[';
17221718
ListSeparator LS;
17231719
for (uint64_t i = 0, e = CA->getNumElements(); i != e; ++i) {
17241720
Out << LS;
1725-
WriterCtx.TypePrinter->print(ETy, Out);
1726-
Out << ' ';
1727-
WriteAsOperandInternal(Out, CA->getElementAsConstant(i), WriterCtx);
1721+
WriteAsOperandInternal(Out, CA->getElementAsConstant(i), WriterCtx,
1722+
/*PrintType=*/true);
17281723
}
17291724
Out << ']';
17301725
return;
@@ -1739,9 +1734,7 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
17391734
ListSeparator LS;
17401735
for (const Value *Op : CS->operands()) {
17411736
Out << LS;
1742-
WriterCtx.TypePrinter->print(Op->getType(), Out);
1743-
Out << ' ';
1744-
WriteAsOperandInternal(Out, Op, WriterCtx);
1737+
WriteAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
17451738
}
17461739
Out << ' ';
17471740
}
@@ -1753,7 +1746,6 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
17531746

17541747
if (isa<ConstantVector>(CV) || isa<ConstantDataVector>(CV)) {
17551748
auto *CVVTy = cast<FixedVectorType>(CV->getType());
1756-
Type *ETy = CVVTy->getElementType();
17571749

17581750
// Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is
17591751
// permitted on IR input to reduce the output changes when enabling
@@ -1763,9 +1755,7 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
17631755
if (auto *SplatVal = CV->getSplatValue()) {
17641756
if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal)) {
17651757
Out << "splat (";
1766-
WriterCtx.TypePrinter->print(ETy, Out);
1767-
Out << ' ';
1768-
WriteAsOperandInternal(Out, SplatVal, WriterCtx);
1758+
WriteAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);
17691759
Out << ')';
17701760
return;
17711761
}
@@ -1775,9 +1765,8 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
17751765
ListSeparator LS;
17761766
for (unsigned i = 0, e = CVVTy->getNumElements(); i != e; ++i) {
17771767
Out << LS;
1778-
WriterCtx.TypePrinter->print(ETy, Out);
1779-
Out << ' ';
1780-
WriteAsOperandInternal(Out, CV->getAggregateElement(i), WriterCtx);
1768+
WriteAsOperandInternal(Out, CV->getAggregateElement(i), WriterCtx,
1769+
/*PrintType=*/true);
17811770
}
17821771
Out << '>';
17831772
return;
@@ -1813,9 +1802,7 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
18131802
if (auto *SplatVal = CE->getSplatValue()) {
18141803
if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal)) {
18151804
Out << "splat (";
1816-
WriterCtx.TypePrinter->print(SplatVal->getType(), Out);
1817-
Out << ' ';
1818-
WriteAsOperandInternal(Out, SplatVal, WriterCtx);
1805+
WriteAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);
18191806
Out << ')';
18201807
return;
18211808
}
@@ -1834,9 +1821,7 @@ static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
18341821
ListSeparator LS;
18351822
for (const Value *Op : CE->operands()) {
18361823
Out << LS;
1837-
WriterCtx.TypePrinter->print(Op->getType(), Out);
1838-
Out << ' ';
1839-
WriteAsOperandInternal(Out, Op, WriterCtx);
1824+
WriteAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);
18401825
}
18411826

18421827
if (CE->isCast()) {
@@ -1864,9 +1849,7 @@ static void writeMDTuple(raw_ostream &Out, const MDTuple *Node,
18641849
Out << "null";
18651850
} else if (auto *MDV = dyn_cast<ValueAsMetadata>(MD)) {
18661851
Value *V = MDV->getValue();
1867-
WriterCtx.TypePrinter->print(V->getType(), Out);
1868-
Out << ' ';
1869-
WriteAsOperandInternal(Out, V, WriterCtx);
1852+
WriteAsOperandInternal(Out, V, WriterCtx, /*PrintType=*/true);
18701853
} else {
18711854
WriteAsOperandInternal(Out, MD, WriterCtx);
18721855
WriterCtx.onWriteMetadataAsOperand(MD);
@@ -2634,7 +2617,7 @@ static void writeDIArgList(raw_ostream &Out, const DIArgList *N,
26342617
Out << "!DIArgList(";
26352618
ListSeparator FS;
26362619
MDFieldPrinter Printer(Out, WriterCtx);
2637-
for (Metadata *Arg : N->getArgs()) {
2620+
for (const Metadata *Arg : N->getArgs()) {
26382621
Out << FS;
26392622
WriteAsOperandInternal(Out, Arg, WriterCtx, true);
26402623
}
@@ -2700,7 +2683,13 @@ static void WriteMDNodeBodyInternal(raw_ostream &Out, const MDNode *Node,
27002683
// Full implementation of printing a Value as an operand with support for
27012684
// TypePrinting, etc.
27022685
static void WriteAsOperandInternal(raw_ostream &Out, const Value *V,
2703-
AsmWriterContext &WriterCtx) {
2686+
AsmWriterContext &WriterCtx,
2687+
bool PrintType) {
2688+
if (PrintType) {
2689+
WriterCtx.TypePrinter->print(V->getType(), Out);
2690+
Out << ' ';
2691+
}
2692+
27042693
if (V->hasName()) {
27052694
PrintLLVMName(Out, V);
27062695
return;
@@ -2825,9 +2814,7 @@ static void WriteAsOperandInternal(raw_ostream &Out, const Metadata *MD,
28252814
assert((FromValue || !isa<LocalAsMetadata>(V)) &&
28262815
"Unexpected function-local metadata outside of value argument");
28272816

2828-
WriterCtx.TypePrinter->print(V->getValue()->getType(), Out);
2829-
Out << ' ';
2830-
WriteAsOperandInternal(Out, V->getValue(), WriterCtx);
2817+
WriteAsOperandInternal(Out, V->getValue(), WriterCtx, /*PrintType=*/true);
28312818
}
28322819

28332820
namespace {
@@ -2965,12 +2952,8 @@ void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType) {
29652952
Out << "<null operand!>";
29662953
return;
29672954
}
2968-
if (PrintType) {
2969-
TypePrinter.print(Operand->getType(), Out);
2970-
Out << ' ';
2971-
}
2972-
auto WriterCtx = getContext();
2973-
WriteAsOperandInternal(Out, Operand, WriterCtx);
2955+
auto WriteCtx = getContext();
2956+
WriteAsOperandInternal(Out, Operand, WriteCtx, PrintType);
29742957
}
29752958

29762959
void AssemblyWriter::writeSyncScope(const LLVMContext &Context,
@@ -3049,20 +3032,14 @@ void AssemblyWriter::writeOperandBundles(const CallBase *Call) {
30493032

30503033
Out << '(';
30513034

3052-
bool FirstInput = true;
3035+
ListSeparator InnerLS;
30533036
auto WriterCtx = getContext();
30543037
for (const auto &Input : BU.Inputs) {
3055-
if (!FirstInput)
3056-
Out << ", ";
3057-
FirstInput = false;
3058-
3038+
Out << InnerLS;
30593039
if (Input == nullptr)
30603040
Out << "<null operand bundle!>";
3061-
else {
3062-
TypePrinter.print(Input->getType(), Out);
3063-
Out << " ";
3064-
WriteAsOperandInternal(Out, Input, WriterCtx);
3065-
}
3041+
else
3042+
WriteAsOperandInternal(Out, Input, WriterCtx, /*PrintType=*/true);
30663043
}
30673044

30683045
Out << ')';
@@ -5265,13 +5242,8 @@ static bool printWithoutType(const Value &V, raw_ostream &O,
52655242
static void printAsOperandImpl(const Value &V, raw_ostream &O, bool PrintType,
52665243
ModuleSlotTracker &MST) {
52675244
TypePrinting TypePrinter(MST.getModule());
5268-
if (PrintType) {
5269-
TypePrinter.print(V.getType(), O);
5270-
O << ' ';
5271-
}
5272-
52735245
AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine(), MST.getModule());
5274-
WriteAsOperandInternal(O, &V, WriterCtx);
5246+
WriteAsOperandInternal(O, &V, WriterCtx, PrintType);
52755247
}
52765248

52775249
void Value::printAsOperand(raw_ostream &O, bool PrintType,

0 commit comments

Comments
 (0)