diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2018-03-14 21:52:13 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2018-03-14 21:52:13 +0000 |
commit | e85b06d65f695c576df1e529ee37cb15e6902401 (patch) | |
tree | 8cc427373ec791f148ac34dd3f8153e4b6727aed /llvm/lib | |
parent | ca5cc20e5163f0ee16a51832ac21ed5d6d20529f (diff) | |
download | bcm5719-llvm-e85b06d65f695c576df1e529ee37cb15e6902401.tar.gz bcm5719-llvm-e85b06d65f695c576df1e529ee37cb15e6902401.zip |
[CodeGen] Use MIR syntax for MachineMemOperand printing
Get rid of the "; mem:" suffix and use the one we use in MIR: ":: (load 2)".
rdar://38163529
Differential Revision: https://reviews.llvm.org/D42377
llvm-svn: 327580
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/MIRPrinter.cpp | 156 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 28 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MachineOperand.cpp | 271 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp | 27 |
4 files changed, 211 insertions, 271 deletions
diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index e2be2e989b6..25cf9374e47 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -19,7 +19,6 @@ #include "llvm/ADT/SmallBitVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include "llvm/CodeGen/GlobalISel/RegisterBank.h" @@ -157,14 +156,10 @@ public: void print(const MachineBasicBlock &MBB); void print(const MachineInstr &MI); - void printIRValueReference(const Value &V); void printStackObjectReference(int FrameIndex); void print(const MachineInstr &MI, unsigned OpIdx, const TargetRegisterInfo *TRI, bool ShouldPrintRegisterTies, LLT TypeToPrint, bool PrintDef = true); - void print(const LLVMContext &Context, const TargetInstrInfo &TII, - const MachineMemOperand &Op); - void printSyncScope(const LLVMContext &Context, SyncScope::ID SSID); }; } // end namespace llvm @@ -698,36 +693,17 @@ void MIPrinter::print(const MachineInstr &MI) { if (!MI.memoperands_empty()) { OS << " :: "; const LLVMContext &Context = MF->getFunction().getContext(); + const MachineFrameInfo &MFI = MF->getFrameInfo(); bool NeedComma = false; for (const auto *Op : MI.memoperands()) { if (NeedComma) OS << ", "; - print(Context, *TII, *Op); + Op->print(OS, MST, SSNs, Context, &MFI, TII); NeedComma = true; } } } -void MIPrinter::printIRValueReference(const Value &V) { - if (isa<GlobalValue>(V)) { - V.printAsOperand(OS, /*PrintType=*/false, MST); - return; - } - if (isa<Constant>(V)) { - // Machine memory operands can load/store to/from constant value pointers. - OS << '`'; - V.printAsOperand(OS, /*PrintType=*/true, MST); - OS << '`'; - return; - } - OS << "%ir."; - if (V.hasName()) { - printLLVMNameWithoutPrefix(OS, V.getName()); - return; - } - MachineOperand::printIRSlotNumber(OS, MST.getLocalSlot(&V)); -} - void MIPrinter::printStackObjectReference(int FrameIndex) { auto ObjectInfo = StackObjectOperandMapping.find(FrameIndex); assert(ObjectInfo != StackObjectOperandMapping.end() && @@ -788,134 +764,6 @@ void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx, } } -static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, - unsigned TMMOFlag) { - auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); - for (const auto &I : Flags) { - if (I.first == TMMOFlag) { - return I.second; - } - } - return nullptr; -} - -void MIPrinter::print(const LLVMContext &Context, const TargetInstrInfo &TII, - const MachineMemOperand &Op) { - OS << '('; - if (Op.isVolatile()) - OS << "volatile "; - if (Op.isNonTemporal()) - OS << "non-temporal "; - if (Op.isDereferenceable()) - OS << "dereferenceable "; - if (Op.isInvariant()) - OS << "invariant "; - if (Op.getFlags() & MachineMemOperand::MOTargetFlag1) - OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag1) - << "\" "; - if (Op.getFlags() & MachineMemOperand::MOTargetFlag2) - OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag2) - << "\" "; - if (Op.getFlags() & MachineMemOperand::MOTargetFlag3) - OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag3) - << "\" "; - - assert((Op.isLoad() || Op.isStore()) && "machine memory operand must be a load or store (or both)"); - if (Op.isLoad()) - OS << "load "; - if (Op.isStore()) - OS << "store "; - - printSyncScope(Context, Op.getSyncScopeID()); - - if (Op.getOrdering() != AtomicOrdering::NotAtomic) - OS << toIRString(Op.getOrdering()) << ' '; - if (Op.getFailureOrdering() != AtomicOrdering::NotAtomic) - OS << toIRString(Op.getFailureOrdering()) << ' '; - - OS << Op.getSize(); - if (const Value *Val = Op.getValue()) { - OS << ((Op.isLoad() && Op.isStore()) ? " on " - : Op.isLoad() ? " from " : " into "); - printIRValueReference(*Val); - } else if (const PseudoSourceValue *PVal = Op.getPseudoValue()) { - OS << ((Op.isLoad() && Op.isStore()) ? " on " - : Op.isLoad() ? " from " : " into "); - assert(PVal && "Expected a pseudo source value"); - switch (PVal->kind()) { - case PseudoSourceValue::Stack: - OS << "stack"; - break; - case PseudoSourceValue::GOT: - OS << "got"; - break; - case PseudoSourceValue::JumpTable: - OS << "jump-table"; - break; - case PseudoSourceValue::ConstantPool: - OS << "constant-pool"; - break; - case PseudoSourceValue::FixedStack: - printStackObjectReference( - cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex()); - break; - case PseudoSourceValue::GlobalValueCallEntry: - OS << "call-entry "; - cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand( - OS, /*PrintType=*/false, MST); - break; - case PseudoSourceValue::ExternalSymbolCallEntry: - OS << "call-entry &"; - printLLVMNameWithoutPrefix( - OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol()); - break; - case PseudoSourceValue::TargetCustom: - llvm_unreachable("TargetCustom pseudo source values are not supported"); - break; - } - } - MachineOperand::printOperandOffset(OS, Op.getOffset()); - if (Op.getBaseAlignment() != Op.getSize()) - OS << ", align " << Op.getBaseAlignment(); - auto AAInfo = Op.getAAInfo(); - if (AAInfo.TBAA) { - OS << ", !tbaa "; - AAInfo.TBAA->printAsOperand(OS, MST); - } - if (AAInfo.Scope) { - OS << ", !alias.scope "; - AAInfo.Scope->printAsOperand(OS, MST); - } - if (AAInfo.NoAlias) { - OS << ", !noalias "; - AAInfo.NoAlias->printAsOperand(OS, MST); - } - if (Op.getRanges()) { - OS << ", !range "; - Op.getRanges()->printAsOperand(OS, MST); - } - if (unsigned AS = Op.getAddrSpace()) - OS << ", addrspace " << AS; - OS << ')'; -} - -void MIPrinter::printSyncScope(const LLVMContext &Context, SyncScope::ID SSID) { - switch (SSID) { - case SyncScope::System: { - break; - } - default: { - if (SSNs.empty()) - Context.getSyncScopeNames(SSNs); - - OS << "syncscope(\""; - PrintEscapedString(SSNs[SSID], OS); - OS << "\") "; - break; - } - } -} - void llvm::printMIR(raw_ostream &OS, const Module &M) { yaml::Output Out(OS); Out << const_cast<Module &>(M); diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 3fbf50df18b..8f5e8e964ae 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -1441,25 +1441,33 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST, } } - bool HaveSemi = false; if (!memoperands_empty()) { - if (!HaveSemi) { - OS << ";"; - HaveSemi = true; + SmallVector<StringRef, 0> SSNs; + const LLVMContext *Context = nullptr; + std::unique_ptr<LLVMContext> CtxPtr; + const MachineFrameInfo *MFI = nullptr; + if (const MachineFunction *MF = getMFIfAvailable(*this)) { + MFI = &MF->getFrameInfo(); + Context = &MF->getFunction().getContext(); + } else { + CtxPtr = llvm::make_unique<LLVMContext>(); + Context = CtxPtr.get(); } - OS << " mem:"; - for (mmo_iterator i = memoperands_begin(), e = memoperands_end(); - i != e; ++i) { - (*i)->print(OS, MST); - if (std::next(i) != e) - OS << " "; + OS << " :: "; + bool NeedComma = false; + for (const MachineMemOperand *Op : memoperands()) { + if (NeedComma) + OS << ", "; + Op->print(OS, MST, SSNs, *Context, MFI, TII); + NeedComma = true; } } if (SkipDebugLoc) return; + bool HaveSemi = false; // Print debug location information. if (isDebugValue() && getOperand(e - 2).isMetadata()) { if (!HaveSemi) diff --git a/llvm/lib/CodeGen/MachineOperand.cpp b/llvm/lib/CodeGen/MachineOperand.cpp index 409dd079a3c..13bcc7a4fe4 100644 --- a/llvm/lib/CodeGen/MachineOperand.cpp +++ b/llvm/lib/CodeGen/MachineOperand.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/MachineOperand.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Analysis/Loads.h" #include "llvm/CodeGen/MIRPrinter.h" #include "llvm/CodeGen/MachineFrameInfo.h" @@ -440,6 +441,69 @@ static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB, OS << "<unknown>"; } +static void printIRValueReference(raw_ostream &OS, const Value &V, + ModuleSlotTracker &MST) { + if (isa<GlobalValue>(V)) { + V.printAsOperand(OS, /*PrintType=*/false, MST); + return; + } + if (isa<Constant>(V)) { + // Machine memory operands can load/store to/from constant value pointers. + OS << '`'; + V.printAsOperand(OS, /*PrintType=*/true, MST); + OS << '`'; + return; + } + OS << "%ir."; + if (V.hasName()) { + printLLVMNameWithoutPrefix(OS, V.getName()); + return; + } + MachineOperand::printIRSlotNumber(OS, MST.getLocalSlot(&V)); +} + +static void printSyncScope(raw_ostream &OS, const LLVMContext &Context, + SyncScope::ID SSID, + SmallVectorImpl<StringRef> &SSNs) { + switch (SSID) { + case SyncScope::System: + break; + default: + if (SSNs.empty()) + Context.getSyncScopeNames(SSNs); + + OS << "syncscope(\""; + PrintEscapedString(SSNs[SSID], OS); + OS << "\") "; + break; + } +} + +static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, + unsigned TMMOFlag) { + auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); + for (const auto &I : Flags) { + if (I.first == TMMOFlag) { + return I.second; + } + } + return nullptr; +} + +static void printFrameIndex(raw_ostream& OS, int FrameIndex, bool IsFixed, + const MachineFrameInfo *MFI) { + StringRef Name; + if (MFI) { + IsFixed = MFI->isFixedObjectIndex(FrameIndex); + if (const AllocaInst *Alloca = MFI->getObjectAllocation(FrameIndex)) + if (Alloca->hasName()) + Name = Alloca->getName(); + if (IsFixed) + FrameIndex -= MFI->getObjectIndexBegin(); + } + MachineOperand::printStackObjectReference(OS, FrameIndex, IsFixed, Name); +} + void MachineOperand::printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI) { OS << "%subreg."; @@ -716,17 +780,10 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, case MachineOperand::MO_FrameIndex: { int FrameIndex = getIndex(); bool IsFixed = false; - StringRef Name; - if (const MachineFunction *MF = getMFIfAvailable(*this)) { - const MachineFrameInfo &MFI = MF->getFrameInfo(); - IsFixed = MFI.isFixedObjectIndex(FrameIndex); - if (const AllocaInst *Alloca = MFI.getObjectAllocation(FrameIndex)) - if (Alloca->hasName()) - Name = Alloca->getName(); - if (IsFixed) - FrameIndex -= MFI.getObjectIndexBegin(); - } - printStackObjectReference(OS, FrameIndex, IsFixed, Name); + const MachineFrameInfo *MFI = nullptr; + if (const MachineFunction *MF = getMFIfAvailable(*this)) + MFI = &MF->getFrameInfo(); + printFrameIndex(OS, FrameIndex, IsFixed, MFI); break; } case MachineOperand::MO_ConstantPoolIndex: @@ -961,108 +1018,116 @@ void MachineMemOperand::print(raw_ostream &OS) const { ModuleSlotTracker DummyMST(nullptr); print(OS, DummyMST); } + void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const { - assert((isLoad() || isStore()) && "SV has to be a load, store or both."); + SmallVector<StringRef, 0> SSNs; + LLVMContext Ctx; + print(OS, MST, SSNs, Ctx, nullptr, nullptr); +} +void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, + SmallVectorImpl<StringRef> &SSNs, + const LLVMContext &Context, + const MachineFrameInfo *MFI, + const TargetInstrInfo *TII) const { + OS << '('; if (isVolatile()) - OS << "Volatile "; - + OS << "volatile "; + if (isNonTemporal()) + OS << "non-temporal "; + if (isDereferenceable()) + OS << "dereferenceable "; + if (isInvariant()) + OS << "invariant "; + if (getFlags() & MachineMemOperand::MOTargetFlag1) + OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag1) + << "\" "; + if (getFlags() & MachineMemOperand::MOTargetFlag2) + OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag2) + << "\" "; + if (getFlags() & MachineMemOperand::MOTargetFlag3) + OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag3) + << "\" "; + + assert((isLoad() || isStore()) && + "machine memory operand must be a load or store (or both)"); if (isLoad()) - OS << "LD"; + OS << "load "; if (isStore()) - OS << "ST"; - OS << getSize(); + OS << "store "; - // Print the address information. - OS << "["; - if (const Value *V = getValue()) - V->printAsOperand(OS, /*PrintType=*/false, MST); - else if (const PseudoSourceValue *PSV = getPseudoValue()) - PSV->printCustom(OS); - else - OS << "<unknown>"; + printSyncScope(OS, Context, getSyncScopeID(), SSNs); - unsigned AS = getAddrSpace(); - if (AS != 0) - OS << "(addrspace=" << AS << ')'; - - // If the alignment of the memory reference itself differs from the alignment - // of the base pointer, print the base alignment explicitly, next to the base - // pointer. - if (getBaseAlignment() != getAlignment()) - OS << "(align=" << getBaseAlignment() << ")"; - - if (getOffset() != 0) - OS << "+" << getOffset(); - OS << "]"; - - // Print the alignment of the reference. - if (getBaseAlignment() != getAlignment() || getBaseAlignment() != getSize()) - OS << "(align=" << getAlignment() << ")"; - - // Print TBAA info. - if (const MDNode *TBAAInfo = getAAInfo().TBAA) { - OS << "(tbaa="; - if (TBAAInfo->getNumOperands() > 0) - TBAAInfo->getOperand(0)->printAsOperand(OS, MST); - else - OS << "<unknown>"; - OS << ")"; - } + if (getOrdering() != AtomicOrdering::NotAtomic) + OS << toIRString(getOrdering()) << ' '; + if (getFailureOrdering() != AtomicOrdering::NotAtomic) + OS << toIRString(getFailureOrdering()) << ' '; - // Print AA scope info. - if (const MDNode *ScopeInfo = getAAInfo().Scope) { - OS << "(alias.scope="; - if (ScopeInfo->getNumOperands() > 0) - for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) { - ScopeInfo->getOperand(i)->printAsOperand(OS, MST); - if (i != ie - 1) - OS << ","; - } - else - OS << "<unknown>"; - OS << ")"; + OS << getSize(); + if (const Value *Val = getValue()) { + OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); + printIRValueReference(OS, *Val, MST); + } else if (const PseudoSourceValue *PVal = getPseudoValue()) { + OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); + assert(PVal && "Expected a pseudo source value"); + switch (PVal->kind()) { + case PseudoSourceValue::Stack: + OS << "stack"; + break; + case PseudoSourceValue::GOT: + OS << "got"; + break; + case PseudoSourceValue::JumpTable: + OS << "jump-table"; + break; + case PseudoSourceValue::ConstantPool: + OS << "constant-pool"; + break; + case PseudoSourceValue::FixedStack: { + int FrameIndex = cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex(); + bool IsFixed = true; + printFrameIndex(OS, FrameIndex, IsFixed, MFI); + break; + } + case PseudoSourceValue::GlobalValueCallEntry: + OS << "call-entry "; + cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand( + OS, /*PrintType=*/false, MST); + break; + case PseudoSourceValue::ExternalSymbolCallEntry: + OS << "call-entry &"; + printLLVMNameWithoutPrefix( + OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol()); + break; + case PseudoSourceValue::TargetCustom: + llvm_unreachable("TargetCustom pseudo source values are not supported"); + break; + } } - - // Print AA noalias scope info. - if (const MDNode *NoAliasInfo = getAAInfo().NoAlias) { - OS << "(noalias="; - if (NoAliasInfo->getNumOperands() > 0) - for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) { - NoAliasInfo->getOperand(i)->printAsOperand(OS, MST); - if (i != ie - 1) - OS << ","; - } - else - OS << "<unknown>"; - OS << ")"; + MachineOperand::printOperandOffset(OS, getOffset()); + if (getBaseAlignment() != getSize()) + OS << ", align " << getBaseAlignment(); + auto AAInfo = getAAInfo(); + if (AAInfo.TBAA) { + OS << ", !tbaa "; + AAInfo.TBAA->printAsOperand(OS, MST); } - - if (const MDNode *Ranges = getRanges()) { - unsigned NumRanges = Ranges->getNumOperands(); - if (NumRanges != 0) { - OS << "(ranges="; - - for (unsigned I = 0; I != NumRanges; ++I) { - Ranges->getOperand(I)->printAsOperand(OS, MST); - if (I != NumRanges - 1) - OS << ','; - } - - OS << ')'; - } + if (AAInfo.Scope) { + OS << ", !alias.scope "; + AAInfo.Scope->printAsOperand(OS, MST); + } + if (AAInfo.NoAlias) { + OS << ", !noalias "; + AAInfo.NoAlias->printAsOperand(OS, MST); } + if (getRanges()) { + OS << ", !range "; + getRanges()->printAsOperand(OS, MST); + } + // FIXME: Implement addrspace printing/parsing in MIR. + // For now, print this even though parsing it is not available in MIR. + if (unsigned AS = getAddrSpace()) + OS << ", addrspace " << AS; - if (isNonTemporal()) - OS << "(nontemporal)"; - if (isDereferenceable()) - OS << "(dereferenceable)"; - if (isInvariant()) - OS << "(invariant)"; - if (getFlags() & MOTargetFlag1) - OS << "(flag1)"; - if (getFlags() & MOTargetFlag2) - OS << "(flag2)"; - if (getFlags() & MOTargetFlag3) - OS << "(flag3)"; + OS << ')'; } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp index 4c58fb17ac1..2810090d067 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp @@ -34,6 +34,7 @@ #include "llvm/IR/DebugLoc.h" #include "llvm/IR/Function.h" #include "llvm/IR/Intrinsics.h" +#include "llvm/IR/ModuleSlotTracker.h" #include "llvm/IR/Value.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" @@ -422,6 +423,19 @@ static Printable PrintNodeId(const SDNode &Node) { }); } +// Print the MMO with more information from the SelectionDAG. +static void printMemOperand(raw_ostream &OS, const MachineMemOperand &MMO, + const SelectionDAG *G) { + const MachineFunction &MF = G->getMachineFunction(); + const Function &F = MF.getFunction(); + const MachineFrameInfo &MFI = MF.getFrameInfo(); + const TargetInstrInfo *TII = G->getSubtarget().getInstrInfo(); + ModuleSlotTracker MST(F.getParent()); + MST.incorporateFunction(F); + SmallVector<StringRef, 0> SSNs; + MMO.print(OS, MST, SSNs, *G->getContext(), &MFI, TII); +} + #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) LLVM_DUMP_METHOD void SDNode::dump() const { dump(nullptr); } @@ -478,7 +492,7 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const { OS << "Mem:"; for (MachineSDNode::mmo_iterator i = MN->memoperands_begin(), e = MN->memoperands_end(); i != e; ++i) { - OS << **i; + printMemOperand(OS, **i, G); if (std::next(i) != e) OS << " "; } @@ -570,7 +584,9 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const { OS << ":" << N->getVT().getEVTString(); } else if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(this)) { - OS << "<" << *LD->getMemOperand(); + OS << "<"; + + printMemOperand(OS, *LD->getMemOperand(), G); bool doExt = true; switch (LD->getExtensionType()) { @@ -588,7 +604,8 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const { OS << ">"; } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(this)) { - OS << "<" << *ST->getMemOperand(); + OS << "<"; + printMemOperand(OS, *ST->getMemOperand(), G); if (ST->isTruncatingStore()) OS << ", trunc to " << ST->getMemoryVT().getEVTString(); @@ -599,7 +616,9 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const { OS << ">"; } else if (const MemSDNode* M = dyn_cast<MemSDNode>(this)) { - OS << "<" << *M->getMemOperand() << ">"; + OS << "<"; + printMemOperand(OS, *M->getMemOperand(), G); + OS << ">"; } else if (const BlockAddressSDNode *BA = dyn_cast<BlockAddressSDNode>(this)) { int64_t offset = BA->getOffset(); |