1234285Sdim//===-- SelectionDAGDumper.cpp - Implement SelectionDAG::dump() -----------===// 2234285Sdim// 3234285Sdim// The LLVM Compiler Infrastructure 4234285Sdim// 5234285Sdim// This file is distributed under the University of Illinois Open Source 6234285Sdim// License. See LICENSE.TXT for details. 7234285Sdim// 8234285Sdim//===----------------------------------------------------------------------===// 9234285Sdim// 10234285Sdim// This implements the SelectionDAG::dump method and friends. 11234285Sdim// 12234285Sdim//===----------------------------------------------------------------------===// 13234285Sdim 14249423Sdim#include "llvm/CodeGen/SelectionDAG.h" 15234285Sdim#include "ScheduleDAGSDNodes.h" 16249423Sdim#include "llvm/ADT/StringExtras.h" 17234285Sdim#include "llvm/Assembly/Writer.h" 18234285Sdim#include "llvm/CodeGen/MachineConstantPool.h" 19234285Sdim#include "llvm/CodeGen/MachineFunction.h" 20234285Sdim#include "llvm/CodeGen/MachineModuleInfo.h" 21249423Sdim#include "llvm/DebugInfo.h" 22249423Sdim#include "llvm/IR/Function.h" 23249423Sdim#include "llvm/IR/Intrinsics.h" 24249423Sdim#include "llvm/Support/Debug.h" 25249423Sdim#include "llvm/Support/GraphWriter.h" 26249423Sdim#include "llvm/Support/raw_ostream.h" 27234285Sdim#include "llvm/Target/TargetInstrInfo.h" 28234285Sdim#include "llvm/Target/TargetIntrinsicInfo.h" 29234285Sdim#include "llvm/Target/TargetMachine.h" 30234285Sdim#include "llvm/Target/TargetRegisterInfo.h" 31234285Sdimusing namespace llvm; 32234285Sdim 33234285Sdimstd::string SDNode::getOperationName(const SelectionDAG *G) const { 34234285Sdim switch (getOpcode()) { 35234285Sdim default: 36234285Sdim if (getOpcode() < ISD::BUILTIN_OP_END) 37234285Sdim return "<<Unknown DAG Node>>"; 38234285Sdim if (isMachineOpcode()) { 39234285Sdim if (G) 40234285Sdim if (const TargetInstrInfo *TII = G->getTarget().getInstrInfo()) 41234285Sdim if (getMachineOpcode() < TII->getNumOpcodes()) 42234285Sdim return TII->getName(getMachineOpcode()); 43234285Sdim return "<<Unknown Machine Node #" + utostr(getOpcode()) + ">>"; 44234285Sdim } 45234285Sdim if (G) { 46234285Sdim const TargetLowering &TLI = G->getTargetLoweringInfo(); 47234285Sdim const char *Name = TLI.getTargetNodeName(getOpcode()); 48234285Sdim if (Name) return Name; 49234285Sdim return "<<Unknown Target Node #" + utostr(getOpcode()) + ">>"; 50234285Sdim } 51234285Sdim return "<<Unknown Node #" + utostr(getOpcode()) + ">>"; 52234285Sdim 53234285Sdim#ifndef NDEBUG 54234285Sdim case ISD::DELETED_NODE: return "<<Deleted Node!>>"; 55234285Sdim#endif 56234285Sdim case ISD::PREFETCH: return "Prefetch"; 57234285Sdim case ISD::ATOMIC_FENCE: return "AtomicFence"; 58234285Sdim case ISD::ATOMIC_CMP_SWAP: return "AtomicCmpSwap"; 59234285Sdim case ISD::ATOMIC_SWAP: return "AtomicSwap"; 60234285Sdim case ISD::ATOMIC_LOAD_ADD: return "AtomicLoadAdd"; 61234285Sdim case ISD::ATOMIC_LOAD_SUB: return "AtomicLoadSub"; 62234285Sdim case ISD::ATOMIC_LOAD_AND: return "AtomicLoadAnd"; 63234285Sdim case ISD::ATOMIC_LOAD_OR: return "AtomicLoadOr"; 64234285Sdim case ISD::ATOMIC_LOAD_XOR: return "AtomicLoadXor"; 65234285Sdim case ISD::ATOMIC_LOAD_NAND: return "AtomicLoadNand"; 66234285Sdim case ISD::ATOMIC_LOAD_MIN: return "AtomicLoadMin"; 67234285Sdim case ISD::ATOMIC_LOAD_MAX: return "AtomicLoadMax"; 68234285Sdim case ISD::ATOMIC_LOAD_UMIN: return "AtomicLoadUMin"; 69234285Sdim case ISD::ATOMIC_LOAD_UMAX: return "AtomicLoadUMax"; 70234285Sdim case ISD::ATOMIC_LOAD: return "AtomicLoad"; 71234285Sdim case ISD::ATOMIC_STORE: return "AtomicStore"; 72234285Sdim case ISD::PCMARKER: return "PCMarker"; 73234285Sdim case ISD::READCYCLECOUNTER: return "ReadCycleCounter"; 74234285Sdim case ISD::SRCVALUE: return "SrcValue"; 75234285Sdim case ISD::MDNODE_SDNODE: return "MDNode"; 76234285Sdim case ISD::EntryToken: return "EntryToken"; 77234285Sdim case ISD::TokenFactor: return "TokenFactor"; 78234285Sdim case ISD::AssertSext: return "AssertSext"; 79234285Sdim case ISD::AssertZext: return "AssertZext"; 80234285Sdim 81234285Sdim case ISD::BasicBlock: return "BasicBlock"; 82234285Sdim case ISD::VALUETYPE: return "ValueType"; 83234285Sdim case ISD::Register: return "Register"; 84234285Sdim case ISD::RegisterMask: return "RegisterMask"; 85234285Sdim case ISD::Constant: return "Constant"; 86234285Sdim case ISD::ConstantFP: return "ConstantFP"; 87234285Sdim case ISD::GlobalAddress: return "GlobalAddress"; 88234285Sdim case ISD::GlobalTLSAddress: return "GlobalTLSAddress"; 89234285Sdim case ISD::FrameIndex: return "FrameIndex"; 90234285Sdim case ISD::JumpTable: return "JumpTable"; 91234285Sdim case ISD::GLOBAL_OFFSET_TABLE: return "GLOBAL_OFFSET_TABLE"; 92234285Sdim case ISD::RETURNADDR: return "RETURNADDR"; 93234285Sdim case ISD::FRAMEADDR: return "FRAMEADDR"; 94234285Sdim case ISD::FRAME_TO_ARGS_OFFSET: return "FRAME_TO_ARGS_OFFSET"; 95234285Sdim case ISD::EH_RETURN: return "EH_RETURN"; 96234285Sdim case ISD::EH_SJLJ_SETJMP: return "EH_SJLJ_SETJMP"; 97234285Sdim case ISD::EH_SJLJ_LONGJMP: return "EH_SJLJ_LONGJMP"; 98234285Sdim case ISD::ConstantPool: return "ConstantPool"; 99239462Sdim case ISD::TargetIndex: return "TargetIndex"; 100234285Sdim case ISD::ExternalSymbol: return "ExternalSymbol"; 101234285Sdim case ISD::BlockAddress: return "BlockAddress"; 102234285Sdim case ISD::INTRINSIC_WO_CHAIN: 103234285Sdim case ISD::INTRINSIC_VOID: 104234285Sdim case ISD::INTRINSIC_W_CHAIN: { 105234285Sdim unsigned OpNo = getOpcode() == ISD::INTRINSIC_WO_CHAIN ? 0 : 1; 106234285Sdim unsigned IID = cast<ConstantSDNode>(getOperand(OpNo))->getZExtValue(); 107234285Sdim if (IID < Intrinsic::num_intrinsics) 108234285Sdim return Intrinsic::getName((Intrinsic::ID)IID); 109234285Sdim else if (const TargetIntrinsicInfo *TII = G->getTarget().getIntrinsicInfo()) 110234285Sdim return TII->getName(IID); 111234285Sdim llvm_unreachable("Invalid intrinsic ID"); 112234285Sdim } 113234285Sdim 114234285Sdim case ISD::BUILD_VECTOR: return "BUILD_VECTOR"; 115234285Sdim case ISD::TargetConstant: return "TargetConstant"; 116234285Sdim case ISD::TargetConstantFP: return "TargetConstantFP"; 117234285Sdim case ISD::TargetGlobalAddress: return "TargetGlobalAddress"; 118234285Sdim case ISD::TargetGlobalTLSAddress: return "TargetGlobalTLSAddress"; 119234285Sdim case ISD::TargetFrameIndex: return "TargetFrameIndex"; 120234285Sdim case ISD::TargetJumpTable: return "TargetJumpTable"; 121234285Sdim case ISD::TargetConstantPool: return "TargetConstantPool"; 122234285Sdim case ISD::TargetExternalSymbol: return "TargetExternalSymbol"; 123234285Sdim case ISD::TargetBlockAddress: return "TargetBlockAddress"; 124234285Sdim 125234285Sdim case ISD::CopyToReg: return "CopyToReg"; 126234285Sdim case ISD::CopyFromReg: return "CopyFromReg"; 127234285Sdim case ISD::UNDEF: return "undef"; 128234285Sdim case ISD::MERGE_VALUES: return "merge_values"; 129234285Sdim case ISD::INLINEASM: return "inlineasm"; 130234285Sdim case ISD::EH_LABEL: return "eh_label"; 131234285Sdim case ISD::HANDLENODE: return "handlenode"; 132234285Sdim 133234285Sdim // Unary operators 134234285Sdim case ISD::FABS: return "fabs"; 135234285Sdim case ISD::FNEG: return "fneg"; 136234285Sdim case ISD::FSQRT: return "fsqrt"; 137234285Sdim case ISD::FSIN: return "fsin"; 138234285Sdim case ISD::FCOS: return "fcos"; 139249423Sdim case ISD::FSINCOS: return "fsincos"; 140234285Sdim case ISD::FTRUNC: return "ftrunc"; 141234285Sdim case ISD::FFLOOR: return "ffloor"; 142234285Sdim case ISD::FCEIL: return "fceil"; 143234285Sdim case ISD::FRINT: return "frint"; 144234285Sdim case ISD::FNEARBYINT: return "fnearbyint"; 145263508Sdim case ISD::FROUND: return "fround"; 146234285Sdim case ISD::FEXP: return "fexp"; 147234285Sdim case ISD::FEXP2: return "fexp2"; 148234285Sdim case ISD::FLOG: return "flog"; 149234285Sdim case ISD::FLOG2: return "flog2"; 150234285Sdim case ISD::FLOG10: return "flog10"; 151234285Sdim 152234285Sdim // Binary operators 153234285Sdim case ISD::ADD: return "add"; 154234285Sdim case ISD::SUB: return "sub"; 155234285Sdim case ISD::MUL: return "mul"; 156234285Sdim case ISD::MULHU: return "mulhu"; 157234285Sdim case ISD::MULHS: return "mulhs"; 158234285Sdim case ISD::SDIV: return "sdiv"; 159234285Sdim case ISD::UDIV: return "udiv"; 160234285Sdim case ISD::SREM: return "srem"; 161234285Sdim case ISD::UREM: return "urem"; 162234285Sdim case ISD::SMUL_LOHI: return "smul_lohi"; 163234285Sdim case ISD::UMUL_LOHI: return "umul_lohi"; 164234285Sdim case ISD::SDIVREM: return "sdivrem"; 165234285Sdim case ISD::UDIVREM: return "udivrem"; 166234285Sdim case ISD::AND: return "and"; 167234285Sdim case ISD::OR: return "or"; 168234285Sdim case ISD::XOR: return "xor"; 169234285Sdim case ISD::SHL: return "shl"; 170234285Sdim case ISD::SRA: return "sra"; 171234285Sdim case ISD::SRL: return "srl"; 172234285Sdim case ISD::ROTL: return "rotl"; 173234285Sdim case ISD::ROTR: return "rotr"; 174234285Sdim case ISD::FADD: return "fadd"; 175234285Sdim case ISD::FSUB: return "fsub"; 176234285Sdim case ISD::FMUL: return "fmul"; 177234285Sdim case ISD::FDIV: return "fdiv"; 178234285Sdim case ISD::FMA: return "fma"; 179234285Sdim case ISD::FREM: return "frem"; 180234285Sdim case ISD::FCOPYSIGN: return "fcopysign"; 181234285Sdim case ISD::FGETSIGN: return "fgetsign"; 182234285Sdim case ISD::FPOW: return "fpow"; 183234285Sdim 184234285Sdim case ISD::FPOWI: return "fpowi"; 185234285Sdim case ISD::SETCC: return "setcc"; 186234285Sdim case ISD::SELECT: return "select"; 187234285Sdim case ISD::VSELECT: return "vselect"; 188234285Sdim case ISD::SELECT_CC: return "select_cc"; 189234285Sdim case ISD::INSERT_VECTOR_ELT: return "insert_vector_elt"; 190234285Sdim case ISD::EXTRACT_VECTOR_ELT: return "extract_vector_elt"; 191234285Sdim case ISD::CONCAT_VECTORS: return "concat_vectors"; 192234285Sdim case ISD::INSERT_SUBVECTOR: return "insert_subvector"; 193234285Sdim case ISD::EXTRACT_SUBVECTOR: return "extract_subvector"; 194234285Sdim case ISD::SCALAR_TO_VECTOR: return "scalar_to_vector"; 195234285Sdim case ISD::VECTOR_SHUFFLE: return "vector_shuffle"; 196234285Sdim case ISD::CARRY_FALSE: return "carry_false"; 197234285Sdim case ISD::ADDC: return "addc"; 198234285Sdim case ISD::ADDE: return "adde"; 199234285Sdim case ISD::SADDO: return "saddo"; 200234285Sdim case ISD::UADDO: return "uaddo"; 201234285Sdim case ISD::SSUBO: return "ssubo"; 202234285Sdim case ISD::USUBO: return "usubo"; 203234285Sdim case ISD::SMULO: return "smulo"; 204234285Sdim case ISD::UMULO: return "umulo"; 205234285Sdim case ISD::SUBC: return "subc"; 206234285Sdim case ISD::SUBE: return "sube"; 207234285Sdim case ISD::SHL_PARTS: return "shl_parts"; 208234285Sdim case ISD::SRA_PARTS: return "sra_parts"; 209234285Sdim case ISD::SRL_PARTS: return "srl_parts"; 210234285Sdim 211234285Sdim // Conversion operators. 212234285Sdim case ISD::SIGN_EXTEND: return "sign_extend"; 213234285Sdim case ISD::ZERO_EXTEND: return "zero_extend"; 214234285Sdim case ISD::ANY_EXTEND: return "any_extend"; 215234285Sdim case ISD::SIGN_EXTEND_INREG: return "sign_extend_inreg"; 216234285Sdim case ISD::TRUNCATE: return "truncate"; 217234285Sdim case ISD::FP_ROUND: return "fp_round"; 218234285Sdim case ISD::FLT_ROUNDS_: return "flt_rounds"; 219234285Sdim case ISD::FP_ROUND_INREG: return "fp_round_inreg"; 220234285Sdim case ISD::FP_EXTEND: return "fp_extend"; 221234285Sdim 222234285Sdim case ISD::SINT_TO_FP: return "sint_to_fp"; 223234285Sdim case ISD::UINT_TO_FP: return "uint_to_fp"; 224234285Sdim case ISD::FP_TO_SINT: return "fp_to_sint"; 225234285Sdim case ISD::FP_TO_UINT: return "fp_to_uint"; 226234285Sdim case ISD::BITCAST: return "bitcast"; 227263508Sdim case ISD::ADDRSPACECAST: return "addrspacecast"; 228234285Sdim case ISD::FP16_TO_FP32: return "fp16_to_fp32"; 229234285Sdim case ISD::FP32_TO_FP16: return "fp32_to_fp16"; 230234285Sdim 231234285Sdim case ISD::CONVERT_RNDSAT: { 232234285Sdim switch (cast<CvtRndSatSDNode>(this)->getCvtCode()) { 233234285Sdim default: llvm_unreachable("Unknown cvt code!"); 234234285Sdim case ISD::CVT_FF: return "cvt_ff"; 235234285Sdim case ISD::CVT_FS: return "cvt_fs"; 236234285Sdim case ISD::CVT_FU: return "cvt_fu"; 237234285Sdim case ISD::CVT_SF: return "cvt_sf"; 238234285Sdim case ISD::CVT_UF: return "cvt_uf"; 239234285Sdim case ISD::CVT_SS: return "cvt_ss"; 240234285Sdim case ISD::CVT_SU: return "cvt_su"; 241234285Sdim case ISD::CVT_US: return "cvt_us"; 242234285Sdim case ISD::CVT_UU: return "cvt_uu"; 243234285Sdim } 244234285Sdim } 245234285Sdim 246234285Sdim // Control flow instructions 247234285Sdim case ISD::BR: return "br"; 248234285Sdim case ISD::BRIND: return "brind"; 249234285Sdim case ISD::BR_JT: return "br_jt"; 250234285Sdim case ISD::BRCOND: return "brcond"; 251234285Sdim case ISD::BR_CC: return "br_cc"; 252234285Sdim case ISD::CALLSEQ_START: return "callseq_start"; 253234285Sdim case ISD::CALLSEQ_END: return "callseq_end"; 254234285Sdim 255234285Sdim // Other operators 256234285Sdim case ISD::LOAD: return "load"; 257234285Sdim case ISD::STORE: return "store"; 258234285Sdim case ISD::VAARG: return "vaarg"; 259234285Sdim case ISD::VACOPY: return "vacopy"; 260234285Sdim case ISD::VAEND: return "vaend"; 261234285Sdim case ISD::VASTART: return "vastart"; 262234285Sdim case ISD::DYNAMIC_STACKALLOC: return "dynamic_stackalloc"; 263234285Sdim case ISD::EXTRACT_ELEMENT: return "extract_element"; 264234285Sdim case ISD::BUILD_PAIR: return "build_pair"; 265234285Sdim case ISD::STACKSAVE: return "stacksave"; 266234285Sdim case ISD::STACKRESTORE: return "stackrestore"; 267234285Sdim case ISD::TRAP: return "trap"; 268239462Sdim case ISD::DEBUGTRAP: return "debugtrap"; 269243830Sdim case ISD::LIFETIME_START: return "lifetime.start"; 270243830Sdim case ISD::LIFETIME_END: return "lifetime.end"; 271234285Sdim 272234285Sdim // Bit manipulation 273234285Sdim case ISD::BSWAP: return "bswap"; 274234285Sdim case ISD::CTPOP: return "ctpop"; 275234285Sdim case ISD::CTTZ: return "cttz"; 276234285Sdim case ISD::CTTZ_ZERO_UNDEF: return "cttz_zero_undef"; 277234285Sdim case ISD::CTLZ: return "ctlz"; 278234285Sdim case ISD::CTLZ_ZERO_UNDEF: return "ctlz_zero_undef"; 279234285Sdim 280234285Sdim // Trampolines 281234285Sdim case ISD::INIT_TRAMPOLINE: return "init_trampoline"; 282234285Sdim case ISD::ADJUST_TRAMPOLINE: return "adjust_trampoline"; 283234285Sdim 284234285Sdim case ISD::CONDCODE: 285234285Sdim switch (cast<CondCodeSDNode>(this)->get()) { 286234285Sdim default: llvm_unreachable("Unknown setcc condition!"); 287234285Sdim case ISD::SETOEQ: return "setoeq"; 288234285Sdim case ISD::SETOGT: return "setogt"; 289234285Sdim case ISD::SETOGE: return "setoge"; 290234285Sdim case ISD::SETOLT: return "setolt"; 291234285Sdim case ISD::SETOLE: return "setole"; 292234285Sdim case ISD::SETONE: return "setone"; 293234285Sdim 294234285Sdim case ISD::SETO: return "seto"; 295234285Sdim case ISD::SETUO: return "setuo"; 296234285Sdim case ISD::SETUEQ: return "setue"; 297234285Sdim case ISD::SETUGT: return "setugt"; 298234285Sdim case ISD::SETUGE: return "setuge"; 299234285Sdim case ISD::SETULT: return "setult"; 300234285Sdim case ISD::SETULE: return "setule"; 301234285Sdim case ISD::SETUNE: return "setune"; 302234285Sdim 303234285Sdim case ISD::SETEQ: return "seteq"; 304234285Sdim case ISD::SETGT: return "setgt"; 305234285Sdim case ISD::SETGE: return "setge"; 306234285Sdim case ISD::SETLT: return "setlt"; 307234285Sdim case ISD::SETLE: return "setle"; 308234285Sdim case ISD::SETNE: return "setne"; 309234285Sdim 310234285Sdim case ISD::SETTRUE: return "settrue"; 311234285Sdim case ISD::SETTRUE2: return "settrue2"; 312234285Sdim case ISD::SETFALSE: return "setfalse"; 313234285Sdim case ISD::SETFALSE2: return "setfalse2"; 314234285Sdim } 315234285Sdim } 316234285Sdim} 317234285Sdim 318234285Sdimconst char *SDNode::getIndexedModeName(ISD::MemIndexedMode AM) { 319234285Sdim switch (AM) { 320234285Sdim default: return ""; 321234285Sdim case ISD::PRE_INC: return "<pre-inc>"; 322234285Sdim case ISD::PRE_DEC: return "<pre-dec>"; 323234285Sdim case ISD::POST_INC: return "<post-inc>"; 324234285Sdim case ISD::POST_DEC: return "<post-dec>"; 325234285Sdim } 326234285Sdim} 327234285Sdim 328234285Sdimvoid SDNode::dump() const { dump(0); } 329234285Sdimvoid SDNode::dump(const SelectionDAG *G) const { 330234285Sdim print(dbgs(), G); 331234285Sdim dbgs() << '\n'; 332234285Sdim} 333234285Sdim 334234285Sdimvoid SDNode::print_types(raw_ostream &OS, const SelectionDAG *G) const { 335243830Sdim OS << (const void*)this << ": "; 336234285Sdim 337234285Sdim for (unsigned i = 0, e = getNumValues(); i != e; ++i) { 338234285Sdim if (i) OS << ","; 339234285Sdim if (getValueType(i) == MVT::Other) 340234285Sdim OS << "ch"; 341234285Sdim else 342234285Sdim OS << getValueType(i).getEVTString(); 343234285Sdim } 344234285Sdim OS << " = " << getOperationName(G); 345234285Sdim} 346234285Sdim 347234285Sdimvoid SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const { 348234285Sdim if (const MachineSDNode *MN = dyn_cast<MachineSDNode>(this)) { 349234285Sdim if (!MN->memoperands_empty()) { 350234285Sdim OS << "<"; 351234285Sdim OS << "Mem:"; 352234285Sdim for (MachineSDNode::mmo_iterator i = MN->memoperands_begin(), 353234285Sdim e = MN->memoperands_end(); i != e; ++i) { 354234285Sdim OS << **i; 355234285Sdim if (llvm::next(i) != e) 356234285Sdim OS << " "; 357234285Sdim } 358234285Sdim OS << ">"; 359234285Sdim } 360234285Sdim } else if (const ShuffleVectorSDNode *SVN = 361234285Sdim dyn_cast<ShuffleVectorSDNode>(this)) { 362234285Sdim OS << "<"; 363234285Sdim for (unsigned i = 0, e = ValueList[0].getVectorNumElements(); i != e; ++i) { 364234285Sdim int Idx = SVN->getMaskElt(i); 365234285Sdim if (i) OS << ","; 366234285Sdim if (Idx < 0) 367234285Sdim OS << "u"; 368234285Sdim else 369234285Sdim OS << Idx; 370234285Sdim } 371234285Sdim OS << ">"; 372234285Sdim } else if (const ConstantSDNode *CSDN = dyn_cast<ConstantSDNode>(this)) { 373234285Sdim OS << '<' << CSDN->getAPIntValue() << '>'; 374234285Sdim } else if (const ConstantFPSDNode *CSDN = dyn_cast<ConstantFPSDNode>(this)) { 375234285Sdim if (&CSDN->getValueAPF().getSemantics()==&APFloat::IEEEsingle) 376234285Sdim OS << '<' << CSDN->getValueAPF().convertToFloat() << '>'; 377234285Sdim else if (&CSDN->getValueAPF().getSemantics()==&APFloat::IEEEdouble) 378234285Sdim OS << '<' << CSDN->getValueAPF().convertToDouble() << '>'; 379234285Sdim else { 380234285Sdim OS << "<APFloat("; 381234285Sdim CSDN->getValueAPF().bitcastToAPInt().dump(); 382234285Sdim OS << ")>"; 383234285Sdim } 384234285Sdim } else if (const GlobalAddressSDNode *GADN = 385234285Sdim dyn_cast<GlobalAddressSDNode>(this)) { 386234285Sdim int64_t offset = GADN->getOffset(); 387234285Sdim OS << '<'; 388234285Sdim WriteAsOperand(OS, GADN->getGlobal()); 389234285Sdim OS << '>'; 390234285Sdim if (offset > 0) 391234285Sdim OS << " + " << offset; 392234285Sdim else 393234285Sdim OS << " " << offset; 394234285Sdim if (unsigned int TF = GADN->getTargetFlags()) 395234285Sdim OS << " [TF=" << TF << ']'; 396234285Sdim } else if (const FrameIndexSDNode *FIDN = dyn_cast<FrameIndexSDNode>(this)) { 397234285Sdim OS << "<" << FIDN->getIndex() << ">"; 398234285Sdim } else if (const JumpTableSDNode *JTDN = dyn_cast<JumpTableSDNode>(this)) { 399234285Sdim OS << "<" << JTDN->getIndex() << ">"; 400234285Sdim if (unsigned int TF = JTDN->getTargetFlags()) 401234285Sdim OS << " [TF=" << TF << ']'; 402234285Sdim } else if (const ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(this)){ 403234285Sdim int offset = CP->getOffset(); 404234285Sdim if (CP->isMachineConstantPoolEntry()) 405234285Sdim OS << "<" << *CP->getMachineCPVal() << ">"; 406234285Sdim else 407234285Sdim OS << "<" << *CP->getConstVal() << ">"; 408234285Sdim if (offset > 0) 409234285Sdim OS << " + " << offset; 410234285Sdim else 411234285Sdim OS << " " << offset; 412234285Sdim if (unsigned int TF = CP->getTargetFlags()) 413234285Sdim OS << " [TF=" << TF << ']'; 414239462Sdim } else if (const TargetIndexSDNode *TI = dyn_cast<TargetIndexSDNode>(this)) { 415239462Sdim OS << "<" << TI->getIndex() << '+' << TI->getOffset() << ">"; 416239462Sdim if (unsigned TF = TI->getTargetFlags()) 417239462Sdim OS << " [TF=" << TF << ']'; 418234285Sdim } else if (const BasicBlockSDNode *BBDN = dyn_cast<BasicBlockSDNode>(this)) { 419234285Sdim OS << "<"; 420234285Sdim const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock(); 421234285Sdim if (LBB) 422234285Sdim OS << LBB->getName() << " "; 423234285Sdim OS << (const void*)BBDN->getBasicBlock() << ">"; 424234285Sdim } else if (const RegisterSDNode *R = dyn_cast<RegisterSDNode>(this)) { 425234285Sdim OS << ' ' << PrintReg(R->getReg(), G ? G->getTarget().getRegisterInfo() :0); 426234285Sdim } else if (const ExternalSymbolSDNode *ES = 427234285Sdim dyn_cast<ExternalSymbolSDNode>(this)) { 428234285Sdim OS << "'" << ES->getSymbol() << "'"; 429234285Sdim if (unsigned int TF = ES->getTargetFlags()) 430234285Sdim OS << " [TF=" << TF << ']'; 431234285Sdim } else if (const SrcValueSDNode *M = dyn_cast<SrcValueSDNode>(this)) { 432234285Sdim if (M->getValue()) 433234285Sdim OS << "<" << M->getValue() << ">"; 434234285Sdim else 435234285Sdim OS << "<null>"; 436234285Sdim } else if (const MDNodeSDNode *MD = dyn_cast<MDNodeSDNode>(this)) { 437234285Sdim if (MD->getMD()) 438234285Sdim OS << "<" << MD->getMD() << ">"; 439234285Sdim else 440234285Sdim OS << "<null>"; 441234285Sdim } else if (const VTSDNode *N = dyn_cast<VTSDNode>(this)) { 442234285Sdim OS << ":" << N->getVT().getEVTString(); 443234285Sdim } 444234285Sdim else if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(this)) { 445234285Sdim OS << "<" << *LD->getMemOperand(); 446234285Sdim 447234285Sdim bool doExt = true; 448234285Sdim switch (LD->getExtensionType()) { 449234285Sdim default: doExt = false; break; 450234285Sdim case ISD::EXTLOAD: OS << ", anyext"; break; 451234285Sdim case ISD::SEXTLOAD: OS << ", sext"; break; 452234285Sdim case ISD::ZEXTLOAD: OS << ", zext"; break; 453234285Sdim } 454234285Sdim if (doExt) 455234285Sdim OS << " from " << LD->getMemoryVT().getEVTString(); 456234285Sdim 457234285Sdim const char *AM = getIndexedModeName(LD->getAddressingMode()); 458234285Sdim if (*AM) 459234285Sdim OS << ", " << AM; 460234285Sdim 461234285Sdim OS << ">"; 462234285Sdim } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(this)) { 463234285Sdim OS << "<" << *ST->getMemOperand(); 464234285Sdim 465234285Sdim if (ST->isTruncatingStore()) 466234285Sdim OS << ", trunc to " << ST->getMemoryVT().getEVTString(); 467234285Sdim 468234285Sdim const char *AM = getIndexedModeName(ST->getAddressingMode()); 469234285Sdim if (*AM) 470234285Sdim OS << ", " << AM; 471234285Sdim 472234285Sdim OS << ">"; 473234285Sdim } else if (const MemSDNode* M = dyn_cast<MemSDNode>(this)) { 474234285Sdim OS << "<" << *M->getMemOperand() << ">"; 475234285Sdim } else if (const BlockAddressSDNode *BA = 476234285Sdim dyn_cast<BlockAddressSDNode>(this)) { 477243830Sdim int64_t offset = BA->getOffset(); 478234285Sdim OS << "<"; 479234285Sdim WriteAsOperand(OS, BA->getBlockAddress()->getFunction(), false); 480234285Sdim OS << ", "; 481234285Sdim WriteAsOperand(OS, BA->getBlockAddress()->getBasicBlock(), false); 482234285Sdim OS << ">"; 483243830Sdim if (offset > 0) 484243830Sdim OS << " + " << offset; 485243830Sdim else 486243830Sdim OS << " " << offset; 487234285Sdim if (unsigned int TF = BA->getTargetFlags()) 488234285Sdim OS << " [TF=" << TF << ']'; 489263508Sdim } else if (const AddrSpaceCastSDNode *ASC = 490263508Sdim dyn_cast<AddrSpaceCastSDNode>(this)) { 491263508Sdim OS << '[' 492263508Sdim << ASC->getSrcAddressSpace() 493263508Sdim << " -> " 494263508Sdim << ASC->getDestAddressSpace() 495263508Sdim << ']'; 496234285Sdim } 497234285Sdim 498263508Sdim if (unsigned Order = getIROrder()) 499234285Sdim OS << " [ORD=" << Order << ']'; 500234285Sdim 501234285Sdim if (getNodeId() != -1) 502234285Sdim OS << " [ID=" << getNodeId() << ']'; 503234285Sdim 504234285Sdim DebugLoc dl = getDebugLoc(); 505234285Sdim if (G && !dl.isUnknown()) { 506234285Sdim DIScope 507234285Sdim Scope(dl.getScope(G->getMachineFunction().getFunction()->getContext())); 508234285Sdim OS << " dbg:"; 509263508Sdim assert((!Scope || Scope.isScope()) && 510263508Sdim "Scope of a DebugLoc should be null or a DIScope."); 511234285Sdim // Omit the directory, since it's usually long and uninteresting. 512263508Sdim if (Scope) 513234285Sdim OS << Scope.getFilename(); 514234285Sdim else 515234285Sdim OS << "<unknown>"; 516234285Sdim OS << ':' << dl.getLine(); 517234285Sdim if (dl.getCol() != 0) 518234285Sdim OS << ':' << dl.getCol(); 519234285Sdim } 520234285Sdim} 521234285Sdim 522234285Sdimstatic void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) { 523234285Sdim for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) 524234285Sdim if (N->getOperand(i).getNode()->hasOneUse()) 525234285Sdim DumpNodes(N->getOperand(i).getNode(), indent+2, G); 526234285Sdim else 527234285Sdim dbgs() << "\n" << std::string(indent+2, ' ') 528234285Sdim << (void*)N->getOperand(i).getNode() << ": <multiple use>"; 529234285Sdim 530234285Sdim dbgs() << '\n'; 531234285Sdim dbgs().indent(indent); 532234285Sdim N->dump(G); 533234285Sdim} 534234285Sdim 535234285Sdimvoid SelectionDAG::dump() const { 536234285Sdim dbgs() << "SelectionDAG has " << AllNodes.size() << " nodes:"; 537234285Sdim 538234285Sdim for (allnodes_const_iterator I = allnodes_begin(), E = allnodes_end(); 539234285Sdim I != E; ++I) { 540234285Sdim const SDNode *N = I; 541234285Sdim if (!N->hasOneUse() && N != getRoot().getNode()) 542234285Sdim DumpNodes(N, 2, this); 543234285Sdim } 544234285Sdim 545234285Sdim if (getRoot().getNode()) DumpNodes(getRoot().getNode(), 2, this); 546234285Sdim dbgs() << "\n\n"; 547234285Sdim} 548234285Sdim 549234285Sdimvoid SDNode::printr(raw_ostream &OS, const SelectionDAG *G) const { 550234285Sdim print_types(OS, G); 551234285Sdim print_details(OS, G); 552234285Sdim} 553234285Sdim 554234285Sdimtypedef SmallPtrSet<const SDNode *, 128> VisitedSDNodeSet; 555234285Sdimstatic void DumpNodesr(raw_ostream &OS, const SDNode *N, unsigned indent, 556234285Sdim const SelectionDAG *G, VisitedSDNodeSet &once) { 557234285Sdim if (!once.insert(N)) // If we've been here before, return now. 558234285Sdim return; 559234285Sdim 560234285Sdim // Dump the current SDNode, but don't end the line yet. 561234285Sdim OS.indent(indent); 562234285Sdim N->printr(OS, G); 563234285Sdim 564234285Sdim // Having printed this SDNode, walk the children: 565234285Sdim for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 566234285Sdim const SDNode *child = N->getOperand(i).getNode(); 567234285Sdim 568234285Sdim if (i) OS << ","; 569234285Sdim OS << " "; 570234285Sdim 571234285Sdim if (child->getNumOperands() == 0) { 572234285Sdim // This child has no grandchildren; print it inline right here. 573234285Sdim child->printr(OS, G); 574234285Sdim once.insert(child); 575234285Sdim } else { // Just the address. FIXME: also print the child's opcode. 576243830Sdim OS << (const void*)child; 577234285Sdim if (unsigned RN = N->getOperand(i).getResNo()) 578234285Sdim OS << ":" << RN; 579234285Sdim } 580234285Sdim } 581234285Sdim 582234285Sdim OS << "\n"; 583234285Sdim 584234285Sdim // Dump children that have grandchildren on their own line(s). 585234285Sdim for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 586234285Sdim const SDNode *child = N->getOperand(i).getNode(); 587234285Sdim DumpNodesr(OS, child, indent+2, G, once); 588234285Sdim } 589234285Sdim} 590234285Sdim 591234285Sdimvoid SDNode::dumpr() const { 592234285Sdim VisitedSDNodeSet once; 593234285Sdim DumpNodesr(dbgs(), this, 0, 0, once); 594234285Sdim} 595234285Sdim 596234285Sdimvoid SDNode::dumpr(const SelectionDAG *G) const { 597234285Sdim VisitedSDNodeSet once; 598234285Sdim DumpNodesr(dbgs(), this, 0, G, once); 599234285Sdim} 600234285Sdim 601234285Sdimstatic void printrWithDepthHelper(raw_ostream &OS, const SDNode *N, 602234285Sdim const SelectionDAG *G, unsigned depth, 603234285Sdim unsigned indent) { 604234285Sdim if (depth == 0) 605234285Sdim return; 606234285Sdim 607234285Sdim OS.indent(indent); 608234285Sdim 609234285Sdim N->print(OS, G); 610234285Sdim 611234285Sdim if (depth < 1) 612234285Sdim return; 613234285Sdim 614234285Sdim for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 615234285Sdim // Don't follow chain operands. 616234285Sdim if (N->getOperand(i).getValueType() == MVT::Other) 617234285Sdim continue; 618234285Sdim OS << '\n'; 619234285Sdim printrWithDepthHelper(OS, N->getOperand(i).getNode(), G, depth-1, indent+2); 620234285Sdim } 621234285Sdim} 622234285Sdim 623234285Sdimvoid SDNode::printrWithDepth(raw_ostream &OS, const SelectionDAG *G, 624234285Sdim unsigned depth) const { 625234285Sdim printrWithDepthHelper(OS, this, G, depth, 0); 626234285Sdim} 627234285Sdim 628234285Sdimvoid SDNode::printrFull(raw_ostream &OS, const SelectionDAG *G) const { 629234285Sdim // Don't print impossibly deep things. 630234285Sdim printrWithDepth(OS, G, 10); 631234285Sdim} 632234285Sdim 633234285Sdimvoid SDNode::dumprWithDepth(const SelectionDAG *G, unsigned depth) const { 634234285Sdim printrWithDepth(dbgs(), G, depth); 635234285Sdim} 636234285Sdim 637234285Sdimvoid SDNode::dumprFull(const SelectionDAG *G) const { 638234285Sdim // Don't print impossibly deep things. 639234285Sdim dumprWithDepth(G, 10); 640234285Sdim} 641234285Sdim 642234285Sdimvoid SDNode::print(raw_ostream &OS, const SelectionDAG *G) const { 643234285Sdim print_types(OS, G); 644234285Sdim for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 645234285Sdim if (i) OS << ", "; else OS << " "; 646234285Sdim OS << (void*)getOperand(i).getNode(); 647234285Sdim if (unsigned RN = getOperand(i).getResNo()) 648234285Sdim OS << ":" << RN; 649234285Sdim } 650234285Sdim print_details(OS, G); 651234285Sdim} 652