@@ -1465,7 +1465,8 @@ struct AsmWriterContext {
14651465// ===----------------------------------------------------------------------===//
14661466
14671467static void WriteAsOperandInternal (raw_ostream &Out, const Value *V,
1468- AsmWriterContext &WriterCtx);
1468+ AsmWriterContext &WriterCtx,
1469+ bool PrintType = false );
14691470
14701471static 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.
27022685static 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
28332820namespace {
@@ -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
29762959void 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,
52655242static 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
52775249void Value::printAsOperand (raw_ostream &O, bool PrintType,
0 commit comments