From daniel at zuster.org Mon Jul 19 00:44:09 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 05:44:09 -0000 Subject: [llvm-commits] [llvm] r108677 - in /llvm/trunk: include/llvm/Target/TargetAsmParser.h lib/MC/MCParser/TargetAsmParser.cpp lib/Target/X86/AsmParser/X86AsmParser.cpp utils/TableGen/AsmMatcherEmitter.cpp Message-ID: <20100719054409.761392A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 00:44:09 2010 New Revision: 108677 URL: http://llvm.org/viewvc/llvm-project?rev=108677&view=rev Log: TblGen/AsmMatcher: Add support for honoring instruction Requires<[]> attributes as part of the matcher. - Currently includes a hack to limit ourselves to "In32BitMode" and "In64BitMode", because we don't have the other infrastructure to properly deal with setting SSE, etc. features on X86. Modified: llvm/trunk/include/llvm/Target/TargetAsmParser.h llvm/trunk/lib/MC/MCParser/TargetAsmParser.cpp llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Modified: llvm/trunk/include/llvm/Target/TargetAsmParser.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetAsmParser.h?rev=108677&r1=108676&r2=108677&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetAsmParser.h (original) +++ llvm/trunk/include/llvm/Target/TargetAsmParser.h Mon Jul 19 00:44:09 2010 @@ -28,14 +28,20 @@ protected: // Can only create subclasses. TargetAsmParser(const Target &); - /// TheTarget - The Target that this machine was created for. + /// The Target that this machine was created for. const Target &TheTarget; + /// The current set of available features. + unsigned AvailableFeatures; + public: virtual ~TargetAsmParser(); const Target &getTarget() const { return TheTarget; } + unsigned getAvailableFeatures() const { return AvailableFeatures; } + void setAvailableFeatures(unsigned Value) { AvailableFeatures = Value; } + /// ParseInstruction - Parse one assembly instruction. /// /// The parser is positioned following the instruction name. The target Modified: llvm/trunk/lib/MC/MCParser/TargetAsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/TargetAsmParser.cpp?rev=108677&r1=108676&r2=108677&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCParser/TargetAsmParser.cpp (original) +++ llvm/trunk/lib/MC/MCParser/TargetAsmParser.cpp Mon Jul 19 00:44:09 2010 @@ -11,7 +11,7 @@ using namespace llvm; TargetAsmParser::TargetAsmParser(const Target &T) - : TheTarget(T) + : TheTarget(T), AvailableFeatures(0) { } Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=108677&r1=108676&r2=108677&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original) +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Jul 19 00:44:09 2010 @@ -9,6 +9,7 @@ #include "llvm/Target/TargetAsmParser.h" #include "X86.h" +#include "X86Subtarget.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Twine.h" @@ -51,12 +52,14 @@ void InstructionCleanup(MCInst &Inst); - /// @name Auto-generated Match Functions - /// { - bool MatchInstruction(const SmallVectorImpl &Operands, MCInst &Inst); + /// @name Auto-generated Matcher Functions + /// { + + unsigned ComputeAvailableFeatures(const X86Subtarget *Subtarget) const; + bool MatchInstructionImpl( const SmallVectorImpl &Operands, MCInst &Inst); @@ -64,7 +67,12 @@ public: X86ATTAsmParser(const Target &T, MCAsmParser &_Parser, TargetMachine &TM) - : TargetAsmParser(T), Parser(_Parser), TM(TM) {} + : TargetAsmParser(T), Parser(_Parser), TM(TM) { + + // Initialize the set of available features. + setAvailableFeatures(ComputeAvailableFeatures( + &TM.getSubtarget())); + } virtual bool ParseInstruction(StringRef Name, SMLoc NameLoc, SmallVectorImpl &Operands); Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=108677&r1=108676&r2=108677&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Mon Jul 19 00:44:09 2010 @@ -271,6 +271,8 @@ namespace { +struct SubtargetFeatureInfo; + /// ClassInfo - Helper class for storing the information about a particular /// class of operands which can be matched. struct ClassInfo { @@ -444,6 +446,9 @@ /// Operands - The operands that this instruction matches. SmallVector Operands; + /// Predicates - The required subtarget features to match this instruction. + SmallVector RequiredFeatures; + /// ConversionFnKind - The enum value which is passed to the generated /// ConvertToMCInst to convert parsed operands into an MCInst for this /// function. @@ -505,6 +510,19 @@ void dump(); }; +/// SubtargetFeatureInfo - Helper class for storing information on a subtarget +/// feature which participates in instruction matching. +struct SubtargetFeatureInfo { + /// \brief The predicate record for this feature. + Record *TheDef; + + /// \brief An unique index assigned to represent this feature. + unsigned Index; + + /// \brief The name of the enumerated constant identifying this feature. + std::string EnumName; +}; + class AsmMatcherInfo { public: /// The tablegen AsmParser record. @@ -525,6 +543,9 @@ /// Map of Register records to their class information. std::map RegisterClasses; + /// Map of Predicate records to their subtarget information. + std::map SubtargetFeatures; + private: /// Map of token to class information which has already been constructed. std::map TokenClasses; @@ -543,6 +564,23 @@ ClassInfo *getOperandClass(StringRef Token, const CodeGenInstruction::OperandInfo &OI); + /// getSubtargetFeature - Lookup or create the subtarget feature info for the + /// given operand. + SubtargetFeatureInfo *getSubtargetFeature(Record *Def) { + assert(Def->isSubClassOf("Predicate") && "Invalid predicate type!"); + + SubtargetFeatureInfo *&Entry = SubtargetFeatures[Def]; + if (!Entry) { + Entry = new SubtargetFeatureInfo; + Entry->TheDef = Def; + Entry->Index = SubtargetFeatures.size() - 1; + Entry->EnumName = "Feature_" + Def->getName(); + assert(Entry->Index < 32 && "Too many subtarget features!"); + } + + return Entry; + } + /// BuildRegisterClasses - Build the ClassInfo* instances for register /// classes. void BuildRegisterClasses(CodeGenTarget &Target, @@ -903,7 +941,31 @@ } } } - + + // Compute the require features. + ListInit *Predicates = CGI.TheDef->getValueAsListInit("Predicates"); + for (unsigned i = 0, e = Predicates->getSize(); i != e; ++i) { + if (DefInit *Pred = dynamic_cast(Predicates->getElement(i))) { + // Ignore OptForSize and OptForSpeed, they aren't really requirements, + // rather they are hints to isel. + // + // FIXME: Find better way to model this. + if (Pred->getDef()->getName() == "OptForSize" || + Pred->getDef()->getName() == "OptForSpeed") + continue; + + // FIXME: Total hack; for now, we just limit ourselves to In32BitMode + // and In64BitMode, because we aren't going to have the right feature + // masks for SSE and friends. We need to decide what we are going to do + // about CPU subtypes to implement this the right way. + if (Pred->getDef()->getName() != "In32BitMode" && + Pred->getDef()->getName() != "In64BitMode") + continue; + + II->RequiredFeatures.push_back(getSubtargetFeature(Pred->getDef())); + } + } + Instructions.push_back(II.take()); } @@ -1499,6 +1561,48 @@ OS << "}\n\n"; } +/// EmitSubtargetFeatureFlagEnumeration - Emit the subtarget feature flag +/// definitions. +static void EmitSubtargetFeatureFlagEnumeration(CodeGenTarget &Target, + AsmMatcherInfo &Info, + raw_ostream &OS) { + OS << "// Flags for subtarget features that participate in " + << "instruction matching.\n"; + OS << "enum SubtargetFeatureFlag {\n"; + for (std::map::const_iterator + it = Info.SubtargetFeatures.begin(), + ie = Info.SubtargetFeatures.end(); it != ie; ++it) { + SubtargetFeatureInfo &SFI = *it->second; + OS << " " << SFI.EnumName << " = (1 << " << SFI.Index << "),\n"; + } + OS << " Feature_None = 0\n"; + OS << "};\n\n"; +} + +/// EmitComputeAvailableFeatures - Emit the function to compute the list of +/// available features given a subtarget. +static void EmitComputeAvailableFeatures(CodeGenTarget &Target, + AsmMatcherInfo &Info, + raw_ostream &OS) { + std::string ClassName = + Info.AsmParser->getValueAsString("AsmParserClassName"); + + OS << "unsigned " << Target.getName() << ClassName << "::\n" + << "ComputeAvailableFeatures(const " << Target.getName() + << "Subtarget *Subtarget) const {\n"; + OS << " unsigned Features = 0;\n"; + for (std::map::const_iterator + it = Info.SubtargetFeatures.begin(), + ie = Info.SubtargetFeatures.end(); it != ie; ++it) { + SubtargetFeatureInfo &SFI = *it->second; + OS << " if (" << SFI.TheDef->getValueAsString("CondString") + << ")\n"; + OS << " Features |= " << SFI.EnumName << ";\n"; + } + OS << " return Features;\n"; + OS << "}\n\n"; +} + void AsmMatcherEmitter::run(raw_ostream &OS) { CodeGenTarget Target; Record *AsmParser = Target.getAsmParser(); @@ -1550,6 +1654,9 @@ EmitSourceFileHeader("Assembly Matcher Source Fragment", OS); + // Emit the subtarget feature enumeration. + EmitSubtargetFeatureFlagEnumeration(Target, Info, OS); + // Emit the function to match a register name to number. EmitMatchRegisterName(Target, AsmParser, OS); @@ -1570,6 +1677,9 @@ // Emit the subclass predicate routine. EmitIsSubclass(Target, Info.Classes, OS); + // Emit the available features compute function. + EmitComputeAvailableFeatures(Target, Info, OS); + // Finally, build the match function. size_t MaxNumOperands = 0; @@ -1600,6 +1710,7 @@ OS << " unsigned Opcode;\n"; OS << " ConversionKind ConvertFn;\n"; OS << " MatchClassKind Classes[" << MaxNumOperands << "];\n"; + OS << " unsigned RequiredFeatures;\n"; OS << " } MatchTable[" << Info.Instructions.size() << "] = {\n"; for (std::vector::const_iterator it = @@ -1615,11 +1726,27 @@ if (i) OS << ", "; OS << Op.Class->Name; } - OS << " } },\n"; + OS << " }, "; + + // Write the required features mask. + if (!II.RequiredFeatures.empty()) { + for (unsigned i = 0, e = II.RequiredFeatures.size(); i != e; ++i) { + if (i) OS << "|"; + OS << II.RequiredFeatures[i]->EnumName; + } + } else + OS << "0"; + + OS << "},\n"; } OS << " };\n\n"; + + // Emit code to get the available features. + OS << " // Get the current feature set.\n"; + OS << " unsigned AvailableFeatures = getAvailableFeatures();\n\n"; + // Emit code to compute the class list for this operand vector. OS << " // Eliminate obvious mismatches.\n"; OS << " if (Operands.size() > " << MaxNumOperands << ")\n"; @@ -1645,6 +1772,13 @@ OS << " for (const MatchEntry *it = MatchTable, " << "*ie = MatchTable + " << Info.Instructions.size() << "; it != ie; ++it) {\n"; + + // Emit check that the required features are available. + OS << " if ((AvailableFeatures & it->RequiredFeatures) " + << "!= it->RequiredFeatures)\n"; + OS << " continue;\n"; + + // Emit check that the subclasses match. for (unsigned i = 0; i != MaxNumOperands; ++i) { OS << " if (!IsSubclass(Classes[" << i << "], it->Classes[" << i << "]))\n"; From bigcheesegs at gmail.com Mon Jul 19 01:13:10 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 19 Jul 2010 06:13:10 -0000 Subject: [llvm-commits] [llvm] r108678 - in /llvm/trunk: include/llvm/MC/MCObjectStreamer.h lib/MC/MCMachOStreamer.cpp lib/MC/MCObjectStreamer.cpp lib/MC/WinCOFFStreamer.cpp Message-ID: <20100719061310.ED8512A6C12C@llvm.org> Author: mspencer Date: Mon Jul 19 01:13:10 2010 New Revision: 108678 URL: http://llvm.org/viewvc/llvm-project?rev=108678&view=rev Log: MC: Add WinCOFFStreamer implementation and merge common code from MachO into MCObjectStreamer. Origonal Windows COFF implementation by Nathan Jedffords. Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h llvm/trunk/lib/MC/MCMachOStreamer.cpp llvm/trunk/lib/MC/MCObjectStreamer.cpp llvm/trunk/lib/MC/WinCOFFStreamer.cpp Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=108678&r1=108677&r2=108678&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original) +++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Mon Jul 19 01:13:10 2010 @@ -16,6 +16,9 @@ class MCAssembler; class MCCodeEmitter; class MCSectionData; +class MCExpr; +class MCFragment; +class MCDataFragment; class TargetAsmBackend; class raw_ostream; @@ -39,6 +42,14 @@ return CurSectionData; } + MCFragment *getCurrentFragment() const; + + /// Get a data fragment to write into, creating a new one if the current + /// fragment is not a data fragment. + MCDataFragment *getOrCreateDataFragment() const; + + const MCExpr *AddValueSymbols(const MCExpr *Value); + public: MCAssembler &getAssembler() { return *Assembler; } Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=108678&r1=108677&r2=108678&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original) +++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Mon Jul 19 01:13:10 2010 @@ -28,24 +28,6 @@ class MCMachOStreamer : public MCObjectStreamer { private: - MCFragment *getCurrentFragment() const { - assert(getCurrentSectionData() && "No current section!"); - - if (!getCurrentSectionData()->empty()) - return &getCurrentSectionData()->getFragmentList().back(); - - return 0; - } - - /// Get a data fragment to write into, creating a new one if the current - /// fragment is not a data fragment. - MCDataFragment *getOrCreateDataFragment() const { - MCDataFragment *F = dyn_cast_or_null(getCurrentFragment()); - if (!F) - F = new MCDataFragment(getCurrentSectionData()); - return F; - } - void EmitInstToFragment(const MCInst &Inst); void EmitInstToData(const MCInst &Inst); @@ -54,32 +36,6 @@ raw_ostream &OS, MCCodeEmitter *Emitter) : MCObjectStreamer(Context, TAB, OS, Emitter) {} - const MCExpr *AddValueSymbols(const MCExpr *Value) { - switch (Value->getKind()) { - case MCExpr::Target: assert(0 && "Can't handle target exprs yet!"); - case MCExpr::Constant: - break; - - case MCExpr::Binary: { - const MCBinaryExpr *BE = cast(Value); - AddValueSymbols(BE->getLHS()); - AddValueSymbols(BE->getRHS()); - break; - } - - case MCExpr::SymbolRef: - getAssembler().getOrCreateSymbolData( - cast(Value)->getSymbol()); - break; - - case MCExpr::Unary: - AddValueSymbols(cast(Value)->getSubExpr()); - break; - } - - return Value; - } - /// @name MCStreamer Interface /// @{ @@ -142,6 +98,8 @@ } // end anonymous namespace. void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) { + // TODO: This is almost exactly the same as WinCOFFStreamer. Consider merging + // into MCObjectStreamer. assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); assert(!Symbol->isVariable() && "Cannot emit a variable symbol!"); assert(CurSection && "Cannot emit before setting section!"); @@ -185,6 +143,8 @@ } void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { + // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into + // MCObjectStreamer. // FIXME: Lift context changes into super class. getAssembler().getOrCreateSymbolData(*Symbol); Symbol->setVariableValue(AddValueSymbols(Value)); @@ -335,11 +295,15 @@ } void MCMachOStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { + // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into + // MCObjectStreamer. getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end()); } void MCMachOStreamer::EmitValue(const MCExpr *Value, unsigned Size, unsigned AddrSpace) { + // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into + // MCObjectStreamer. MCDataFragment *DF = getOrCreateDataFragment(); // Avoid fixups when possible. @@ -359,6 +323,8 @@ void MCMachOStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value, unsigned ValueSize, unsigned MaxBytesToEmit) { + // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into + // MCObjectStreamer. if (MaxBytesToEmit == 0) MaxBytesToEmit = ByteAlignment; new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit, @@ -371,6 +337,8 @@ void MCMachOStreamer::EmitCodeAlignment(unsigned ByteAlignment, unsigned MaxBytesToEmit) { + // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into + // MCObjectStreamer. if (MaxBytesToEmit == 0) MaxBytesToEmit = ByteAlignment; MCAlignFragment *F = new MCAlignFragment(ByteAlignment, 0, 1, MaxBytesToEmit, Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=108678&r1=108677&r2=108678&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original) +++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Mon Jul 19 01:13:10 2010 @@ -9,7 +9,9 @@ #include "llvm/MC/MCObjectStreamer.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/MC/MCAssembler.h" +#include "llvm/MC/MCExpr.h" using namespace llvm; MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB, @@ -24,6 +26,47 @@ delete Assembler; } +MCFragment *MCObjectStreamer::getCurrentFragment() const { + assert(getCurrentSectionData() && "No current section!"); + + if (!getCurrentSectionData()->empty()) + return &getCurrentSectionData()->getFragmentList().back(); + + return 0; +} + +MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const { + MCDataFragment *F = dyn_cast_or_null(getCurrentFragment()); + if (!F) + F = new MCDataFragment(getCurrentSectionData()); + return F; +} + +const MCExpr *MCObjectStreamer::AddValueSymbols(const MCExpr *Value) { + switch (Value->getKind()) { + case MCExpr::Target: llvm_unreachable("Can't handle target exprs yet!"); + case MCExpr::Constant: + break; + + case MCExpr::Binary: { + const MCBinaryExpr *BE = cast(Value); + AddValueSymbols(BE->getLHS()); + AddValueSymbols(BE->getRHS()); + break; + } + + case MCExpr::SymbolRef: + Assembler->getOrCreateSymbolData(cast(Value)->getSymbol()); + break; + + case MCExpr::Unary: + AddValueSymbols(cast(Value)->getSubExpr()); + break; + } + + return Value; +} + void MCObjectStreamer::SwitchSection(const MCSection *Section) { assert(Section && "Cannot switch to a null section!"); Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=108678&r1=108677&r2=108678&view=diff ============================================================================== --- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original) +++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Mon Jul 19 01:13:10 2010 @@ -18,27 +18,34 @@ #include "llvm/MC/MCSection.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCValue.h" +#include "llvm/MC/MCAssembler.h" +#include "llvm/MC/MCAsmLayout.h" #include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCSectionCOFF.h" +#include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetAsmBackend.h" +#include "llvm/ADT/StringMap.h" + #include "llvm/Support/COFF.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; -#define dbg_notimpl(x) \ - do { dbgs() << "not implemented, " << __FUNCTION__ << " (" << x << ")"; \ - abort(); } while (false); - namespace { class WinCOFFStreamer : public MCObjectStreamer { public: + MCSymbol const *CurSymbol; + WinCOFFStreamer(MCContext &Context, TargetAsmBackend &TAB, MCCodeEmitter &CE, raw_ostream &OS); + void AddCommonSymbol(MCSymbol *Symbol, uint64_t Size, + unsigned ByteAlignment, bool External); + // MCStreamer interface virtual void EmitLabel(MCSymbol *Symbol); @@ -52,18 +59,18 @@ virtual void EndCOFFSymbolDef(); virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, - unsigned ByteAlignment); + unsigned ByteAlignment); virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size); virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol, - unsigned Size,unsigned ByteAlignment); + unsigned Size,unsigned ByteAlignment); virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, - uint64_t Size, unsigned ByteAlignment); + uint64_t Size, unsigned ByteAlignment); virtual void EmitBytes(StringRef Data, unsigned AddrSpace); - virtual void EmitValue(const MCExpr *Value, unsigned Size, + virtual void EmitValue(const MCExpr *Value, unsigned Size, unsigned AddrSpace); virtual void EmitGPRel32Value(const MCExpr *Value); virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value, - unsigned ValueSize, unsigned MaxBytesToEmit); + unsigned ValueSize, unsigned MaxBytesToEmit); virtual void EmitCodeAlignment(unsigned ByteAlignment, unsigned MaxBytesToEmit); virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value); @@ -78,96 +85,223 @@ TargetAsmBackend &TAB, MCCodeEmitter &CE, raw_ostream &OS) - : MCObjectStreamer(Context, TAB, OS, &CE) { + : MCObjectStreamer(Context, TAB, OS, &CE) + , CurSymbol(NULL) { +} + +void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size, + unsigned ByteAlignment, bool External) { + assert(!Symbol->isInSection() && "Symbol must not already have a section!"); + + std::string SectionName(".bss$linkonce"); + SectionName.append(Symbol->getName().begin(), Symbol->getName().end()); + + MCSymbolData &SymbolData = getAssembler().getOrCreateSymbolData(*Symbol); + + unsigned Characteristics = + COFF::IMAGE_SCN_LNK_COMDAT | + COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | + COFF::IMAGE_SCN_MEM_READ | + COFF::IMAGE_SCN_MEM_WRITE; + + int Selection = COFF::IMAGE_COMDAT_SELECT_LARGEST; + + const MCSection *Section = MCStreamer::getContext().getCOFFSection( + SectionName, Characteristics, Selection, SectionKind::getBSS()); + + MCSectionData &SectionData = getAssembler().getOrCreateSectionData(*Section); + + if (SectionData.getAlignment() < ByteAlignment) + SectionData.setAlignment(ByteAlignment); + + SymbolData.setExternal(External); + + Symbol->setSection(*Section); + + if (ByteAlignment != 1) + new MCAlignFragment(ByteAlignment, 0, 0, ByteAlignment, &SectionData); + + SymbolData.setFragment(new MCFillFragment(0, 0, Size, &SectionData)); } // MCStreamer interface void WinCOFFStreamer::EmitLabel(MCSymbol *Symbol) { + // TODO: This is copied almost exactly from the MachOStreamer. Consider + // merging into MCObjectStreamer? + assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); + assert(!Symbol->isVariable() && "Cannot emit a variable symbol!"); + assert(CurSection && "Cannot emit before setting section!"); + + Symbol->setSection(*CurSection); + + MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); + + // FIXME: This is wasteful, we don't necessarily need to create a data + // fragment. Instead, we should mark the symbol as pointing into the data + // fragment if it exists, otherwise we should just queue the label and set its + // fragment pointer when we emit the next fragment. + MCDataFragment *F = getOrCreateDataFragment(); + assert(!SD.getFragment() && "Unexpected fragment on symbol data!"); + SD.setFragment(F); + SD.setOffset(F->getContents().size()); } void WinCOFFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { - dbg_notimpl("Flag = " << Flag); + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { + // TODO: This is exactly the same as MachOStreamer. Consider merging into + // MCObjectStreamer. + getAssembler().getOrCreateSymbolData(*Symbol); + AddValueSymbols(Value); + Symbol->setVariableValue(Value); } void WinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) { + switch (Attribute) { + case MCSA_WeakReference: + getAssembler().getOrCreateSymbolData(*Symbol).modifyFlags( + COFF::SF_WeakReference, + COFF::SF_WeakReference); + break; + + case MCSA_Global: + getAssembler().getOrCreateSymbolData(*Symbol).setExternal(true); + break; + + default: + llvm_unreachable("unsupported attribute"); + break; + } } void WinCOFFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { - dbg_notimpl("Symbol = " << Symbol->getName() << ", DescValue = "<< DescValue); + llvm_unreachable("not implemented"); } void WinCOFFStreamer::BeginCOFFSymbolDef(MCSymbol const *Symbol) { + assert(CurSymbol == NULL && "EndCOFFSymbolDef must be called between calls " + "to BeginCOFFSymbolDef!"); + CurSymbol = Symbol; } void WinCOFFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) { + assert(CurSymbol != NULL && "BeginCOFFSymbolDef must be called first!"); + assert((StorageClass & ~0xFF) == 0 && "StorageClass must only have data in " + "the first byte!"); + + getAssembler().getOrCreateSymbolData(*CurSymbol).modifyFlags( + StorageClass << COFF::SF_ClassShift, + COFF::SF_ClassMask); } void WinCOFFStreamer::EmitCOFFSymbolType(int Type) { + assert(CurSymbol != NULL && "BeginCOFFSymbolDef must be called first!"); + assert((Type & ~0xFFFF) == 0 && "Type must only have data in the first 2 " + "bytes"); + + getAssembler().getOrCreateSymbolData(*CurSymbol).modifyFlags( + Type << COFF::SF_TypeShift, + COFF::SF_TypeMask); } void WinCOFFStreamer::EndCOFFSymbolDef() { + assert(CurSymbol != NULL && "BeginCOFFSymbolDef must be called first!"); + CurSymbol = NULL; } void WinCOFFStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) { - dbg_notimpl("Symbol = " << Symbol->getName() << ", Value = " << *Value); + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, - unsigned ByteAlignment) { + unsigned ByteAlignment) { + AddCommonSymbol(Symbol, Size, ByteAlignment, true); } void WinCOFFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size) { + AddCommonSymbol(Symbol, Size, 1, false); } void WinCOFFStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, - unsigned Size,unsigned ByteAlignment) { - MCSectionCOFF const *SectionCOFF = - static_cast(Section); - - dbg_notimpl("Section = " << SectionCOFF->getSectionName() << ", Symbol = " << - Symbol->getName() << ", Size = " << Size << ", ByteAlignment = " - << ByteAlignment); + unsigned Size,unsigned ByteAlignment) { + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) { - MCSectionCOFF const *SectionCOFF = - static_cast(Section); - - dbg_notimpl("Section = " << SectionCOFF->getSectionName() << ", Symbol = " << - Symbol->getName() << ", Size = " << Size << ", ByteAlignment = " - << ByteAlignment); + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { + // TODO: This is copied exactly from the MachOStreamer. Consider merging into + // MCObjectStreamer? + getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end()); } void WinCOFFStreamer::EmitValue(const MCExpr *Value, unsigned Size, - unsigned AddrSpace) { + unsigned AddrSpace) { + assert(AddrSpace == 0 && "Address space must be 0!"); + + // TODO: This is copied exactly from the MachOStreamer. Consider merging into + // MCObjectStreamer? + MCDataFragment *DF = getOrCreateDataFragment(); + + // Avoid fixups when possible. + int64_t AbsValue; + if (AddValueSymbols(Value)->EvaluateAsAbsolute(AbsValue)) { + // FIXME: Endianness assumption. + for (unsigned i = 0; i != Size; ++i) + DF->getContents().push_back(uint8_t(AbsValue >> (i * 8))); + } else { + DF->addFixup(MCFixup::Create(DF->getContents().size(), + AddValueSymbols(Value), + MCFixup::getKindForSize(Size))); + DF->getContents().resize(DF->getContents().size() + Size, 0); + } } void WinCOFFStreamer::EmitGPRel32Value(const MCExpr *Value) { - dbg_notimpl("Value = '" << *Value); + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitValueToAlignment(unsigned ByteAlignment, - int64_t Value, - unsigned ValueSize, - unsigned MaxBytesToEmit) { + int64_t Value, + unsigned ValueSize, + unsigned MaxBytesToEmit) { + // TODO: This is copied exactly from the MachOStreamer. Consider merging into + // MCObjectStreamer? + if (MaxBytesToEmit == 0) + MaxBytesToEmit = ByteAlignment; + new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit, + getCurrentSectionData()); + + // Update the maximum alignment on the current section if necessary. + if (ByteAlignment > getCurrentSectionData()->getAlignment()) + getCurrentSectionData()->setAlignment(ByteAlignment); } void WinCOFFStreamer::EmitCodeAlignment(unsigned ByteAlignment, - unsigned MaxBytesToEmit = 0) { + unsigned MaxBytesToEmit) { + // TODO: This is copied exactly from the MachOStreamer. Consider merging into + // MCObjectStreamer? + if (MaxBytesToEmit == 0) + MaxBytesToEmit = ByteAlignment; + MCAlignFragment *F = new MCAlignFragment(ByteAlignment, 0, 1, MaxBytesToEmit, + getCurrentSectionData()); + F->setEmitNops(true); + + // Update the maximum alignment on the current section if necessary. + if (ByteAlignment > getCurrentSectionData()->getAlignment()) + getCurrentSectionData()->setAlignment(ByteAlignment); } void WinCOFFStreamer::EmitValueToOffset(const MCExpr *Offset, - unsigned char Value = 0) { - dbg_notimpl("Offset = '" << *Offset << "', Value = " << Value); + unsigned char Value) { + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitFileDirective(StringRef Filename) { @@ -176,11 +310,24 @@ } void WinCOFFStreamer::EmitDwarfFileDirective(unsigned FileNo, - StringRef Filename) { - dbg_notimpl("FileNo = " << FileNo << ", Filename = '" << Filename << "'"); + StringRef Filename) { + llvm_unreachable("not implemented"); } void WinCOFFStreamer::EmitInstruction(const MCInst &Instruction) { + for (unsigned i = 0, e = Instruction.getNumOperands(); i != e; ++i) + if (Instruction.getOperand(i).isExpr()) + AddValueSymbols(Instruction.getOperand(i).getExpr()); + + getCurrentSectionData()->setHasInstructions(true); + + MCInstFragment *Fragment = + new MCInstFragment(Instruction, getCurrentSectionData()); + + raw_svector_ostream VecOS(Fragment->getCode()); + + getAssembler().getEmitter().EncodeInstruction(Instruction, VecOS, + Fragment->getFixups()); } void WinCOFFStreamer::Finish() { From daniel at zuster.org Mon Jul 19 01:14:44 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 06:14:44 -0000 Subject: [llvm-commits] [llvm] r108679 - /llvm/trunk/lib/Target/X86/X86InstrInfo.td Message-ID: <20100719061444.C5E042A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 01:14:44 2010 New Revision: 108679 URL: http://llvm.org/viewvc/llvm-project?rev=108679&view=rev Log: X86: MOV8o8a, MOV8ao8, etc. are only valid in 32-bit mode. Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=108679&r1=108678&r2=108679&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Jul 19 01:14:44 2010 @@ -1025,17 +1025,23 @@ /// moffs8, moffs16 and moffs32 versions of moves. The immediate is a /// 32-bit offset from the PC. These are only valid in x86-32 mode. def MOV8o8a : Ii32 <0xA0, RawFrm, (outs), (ins offset8:$src), - "mov{b}\t{$src, %al|%al, $src}", []>; + "mov{b}\t{$src, %al|%al, $src}", []>, + Requires<[In32BitMode]>; def MOV16o16a : Ii32 <0xA1, RawFrm, (outs), (ins offset16:$src), - "mov{w}\t{$src, %ax|%ax, $src}", []>, OpSize; + "mov{w}\t{$src, %ax|%ax, $src}", []>, OpSize, + Requires<[In32BitMode]>; def MOV32o32a : Ii32 <0xA1, RawFrm, (outs), (ins offset32:$src), - "mov{l}\t{$src, %eax|%eax, $src}", []>; + "mov{l}\t{$src, %eax|%eax, $src}", []>, + Requires<[In32BitMode]>; def MOV8ao8 : Ii32 <0xA2, RawFrm, (outs offset8:$dst), (ins), - "mov{b}\t{%al, $dst|$dst, %al}", []>; + "mov{b}\t{%al, $dst|$dst, %al}", []>, + Requires<[In32BitMode]>; def MOV16ao16 : Ii32 <0xA3, RawFrm, (outs offset16:$dst), (ins), - "mov{w}\t{%ax, $dst|$dst, %ax}", []>, OpSize; + "mov{w}\t{%ax, $dst|$dst, %ax}", []>, OpSize, + Requires<[In32BitMode]>; def MOV32ao32 : Ii32 <0xA3, RawFrm, (outs offset32:$dst), (ins), - "mov{l}\t{%eax, $dst|$dst, %eax}", []>; + "mov{l}\t{%eax, $dst|$dst, %eax}", []>, + Requires<[In32BitMode]>; // Moves to and from segment registers def MOV16rs : I<0x8C, MRMDestReg, (outs GR16:$dst), (ins SEGMENT_REG:$src), From daniel at zuster.org Mon Jul 19 01:14:49 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 06:14:49 -0000 Subject: [llvm-commits] [llvm] r108680 - in /llvm/trunk/lib/Target/X86: X86Instr64bit.td X86InstrInfo.td Message-ID: <20100719061449.79EF12A6C12D@llvm.org> Author: ddunbar Date: Mon Jul 19 01:14:49 2010 New Revision: 108680 URL: http://llvm.org/viewvc/llvm-project?rev=108680&view=rev Log: X86: Mark MOV.*_{TC,NOREX} instruction as code gen only, they aren't real. Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td llvm/trunk/lib/Target/X86/X86InstrInfo.td Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Instr64bit.td?rev=108680&r1=108679&r2=108680&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Instr64bit.td (original) +++ llvm/trunk/lib/Target/X86/X86Instr64bit.td Mon Jul 19 01:14:49 2010 @@ -374,6 +374,7 @@ [(store i64immSExt32:$src, addr:$dst)]>; /// Versions of MOV64rr, MOV64rm, and MOV64mr for i64mem_TC and GR64_TC. +let isCodeGenOnly = 1 in { let neverHasSideEffects = 1 in def MOV64rr_TC : RI<0x89, MRMDestReg, (outs GR64_TC:$dst), (ins GR64_TC:$src), "mov{q}\t{$src, $dst|$dst, $src}", []>; @@ -388,6 +389,7 @@ def MOV64mr_TC : RI<0x89, MRMDestMem, (outs), (ins i64mem_TC:$dst, GR64_TC:$src), "mov{q}\t{$src, $dst|$dst, $src}", []>; +} def MOV64o8a : RIi8<0xA0, RawFrm, (outs), (ins offset8:$src), "mov{q}\t{$src, %rax|%rax, $src}", []>; Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=108680&r1=108679&r2=108680&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Jul 19 01:14:49 2010 @@ -1093,6 +1093,7 @@ [(store GR32:$src, addr:$dst)]>; /// Versions of MOV32rr, MOV32rm, and MOV32mr for i32mem_TC and GR32_TC. +let isCodeGenOnly = 1 in { let neverHasSideEffects = 1 in def MOV32rr_TC : I<0x89, MRMDestReg, (outs GR32_TC:$dst), (ins GR32_TC:$src), "mov{l}\t{$src, $dst|$dst, $src}", []>; @@ -1107,10 +1108,12 @@ def MOV32mr_TC : I<0x89, MRMDestMem, (outs), (ins i32mem_TC:$dst, GR32_TC:$src), "mov{l}\t{$src, $dst|$dst, $src}", []>; +} // Versions of MOV8rr, MOV8mr, and MOV8rm that use i8mem_NOREX and GR8_NOREX so // that they can be used for copying and storing h registers, which can't be // encoded when a REX prefix is present. +let isCodeGenOnly = 1 in { let neverHasSideEffects = 1 in def MOV8rr_NOREX : I<0x88, MRMDestReg, (outs GR8_NOREX:$dst), (ins GR8_NOREX:$src), @@ -1124,6 +1127,7 @@ def MOV8rm_NOREX : I<0x8A, MRMSrcMem, (outs GR8_NOREX:$dst), (ins i8mem_NOREX:$src), "mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>; +} // Moves to and from debug registers def MOV32rd : I<0x21, MRMDestReg, (outs GR32:$dst), (ins DEBUG_REG:$src), From daniel at zuster.org Mon Jul 19 01:14:54 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 06:14:54 -0000 Subject: [llvm-commits] [llvm] r108681 - in /llvm/trunk: lib/Target/X86/AsmParser/X86AsmParser.cpp lib/Target/X86/X86.td test/MC/AsmParser/X86/x86_64-new-encoder.s Message-ID: <20100719061454.3853E2A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 01:14:54 2010 New Revision: 108681 URL: http://llvm.org/viewvc/llvm-project?rev=108681&view=rev Log: MC/X86: We now match instructions like "incl %eax" correctly for the arch we are assembling; remove crufty custom cleanup code. Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp llvm/trunk/lib/Target/X86/X86.td llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=108681&r1=108680&r2=108681&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original) +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Jul 19 01:14:54 2010 @@ -50,8 +50,6 @@ bool ParseDirectiveWord(unsigned Size, SMLoc L); - void InstructionCleanup(MCInst &Inst); - bool MatchInstruction(const SmallVectorImpl &Operands, MCInst &Inst); @@ -840,57 +838,6 @@ return false; } -/// LowerMOffset - Lower an 'moffset' form of an instruction, which just has a -/// imm operand, to having "rm" or "mr" operands with the offset in the disp -/// field. -static void LowerMOffset(MCInst &Inst, unsigned Opc, unsigned RegNo, - bool isMR) { - MCOperand Disp = Inst.getOperand(0); - - // Start over with an empty instruction. - Inst = MCInst(); - Inst.setOpcode(Opc); - - if (!isMR) - Inst.addOperand(MCOperand::CreateReg(RegNo)); - - // Add the mem operand. - Inst.addOperand(MCOperand::CreateReg(0)); // Segment - Inst.addOperand(MCOperand::CreateImm(1)); // Scale - Inst.addOperand(MCOperand::CreateReg(0)); // IndexReg - Inst.addOperand(Disp); // Displacement - Inst.addOperand(MCOperand::CreateReg(0)); // BaseReg - - if (isMR) - Inst.addOperand(MCOperand::CreateReg(RegNo)); -} - -// FIXME: Custom X86 cleanup function to implement a temporary hack to handle -// matching INCL/DECL correctly for x86_64. This needs to be replaced by a -// proper mechanism for supporting (ambiguous) feature dependent instructions. -void X86ATTAsmParser::InstructionCleanup(MCInst &Inst) { - if (!Is64Bit) return; - - switch (Inst.getOpcode()) { - case X86::DEC16r: Inst.setOpcode(X86::DEC64_16r); break; - case X86::DEC16m: Inst.setOpcode(X86::DEC64_16m); break; - case X86::DEC32r: Inst.setOpcode(X86::DEC64_32r); break; - case X86::DEC32m: Inst.setOpcode(X86::DEC64_32m); break; - case X86::INC16r: Inst.setOpcode(X86::INC64_16r); break; - case X86::INC16m: Inst.setOpcode(X86::INC64_16m); break; - case X86::INC32r: Inst.setOpcode(X86::INC64_32r); break; - case X86::INC32m: Inst.setOpcode(X86::INC64_32m); break; - - // moffset instructions are x86-32 only. - case X86::MOV8o8a: LowerMOffset(Inst, X86::MOV8rm , X86::AL , false); break; - case X86::MOV16o16a: LowerMOffset(Inst, X86::MOV16rm, X86::AX , false); break; - case X86::MOV32o32a: LowerMOffset(Inst, X86::MOV32rm, X86::EAX, false); break; - case X86::MOV8ao8: LowerMOffset(Inst, X86::MOV8mr , X86::AL , true); break; - case X86::MOV16ao16: LowerMOffset(Inst, X86::MOV16mr, X86::AX , true); break; - case X86::MOV32ao32: LowerMOffset(Inst, X86::MOV32mr, X86::EAX, true); break; - } -} - bool X86ATTAsmParser::MatchInstruction(const SmallVectorImpl &Operands, Modified: llvm/trunk/lib/Target/X86/X86.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.td?rev=108681&r1=108680&r2=108681&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86.td (original) +++ llvm/trunk/lib/Target/X86/X86.td Mon Jul 19 01:14:54 2010 @@ -180,7 +180,6 @@ // Currently the X86 assembly parser only supports ATT syntax. def ATTAsmParser : AsmParser { string AsmParserClassName = "ATTAsmParser"; - string AsmParserInstCleanup = "InstructionCleanup"; string MatchInstructionName = "MatchInstructionImpl"; int Variant = 0; Modified: llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s?rev=108681&r1=108680&r2=108681&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s Mon Jul 19 01:14:54 2010 @@ -72,9 +72,9 @@ // Not moffset forms of moves, they are x86-32 only! rdar://7947184 -movb 0, %al // CHECK: movb 0, %al # encoding: [0x8a,0x04,0x25,A,A,A,A] -movw 0, %ax // CHECK: movw 0, %ax # encoding: [0x66,0x8b,0x04,0x25,A,A,A,A] -movl 0, %eax // CHECK: movl 0, %eax # encoding: [0x8b,0x04,0x25,A,A,A,A] +movb 0, %al // CHECK: movb 0, %al # encoding: [0x8a,0x04,0x25,0x00,0x00,0x00,0x00] +movw 0, %ax // CHECK: movw 0, %ax # encoding: [0x66,0x8b,0x04,0x25,0x00,0x00,0x00,0x00] +movl 0, %eax // CHECK: movl 0, %eax # encoding: [0x8b,0x04,0x25,0x00,0x00,0x00,0x00] // CHECK: pushfq # encoding: [0x9c] pushf From bigcheesegs at gmail.com Mon Jul 19 01:26:19 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 19 Jul 2010 06:26:19 -0000 Subject: [llvm-commits] [llvm] r108682 - /llvm/trunk/lib/MC/MCStreamer.cpp Message-ID: <20100719062619.997C72A6C12C@llvm.org> Author: mspencer Date: Mon Jul 19 01:26:19 2010 New Revision: 108682 URL: http://llvm.org/viewvc/llvm-project?rev=108682&view=rev Log: _[A-Z] identifiers are reserved for the implementation. Modified: llvm/trunk/lib/MC/MCStreamer.cpp Modified: llvm/trunk/lib/MC/MCStreamer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=108682&r1=108681&r2=108682&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCStreamer.cpp (original) +++ llvm/trunk/lib/MC/MCStreamer.cpp Mon Jul 19 01:26:19 2010 @@ -15,7 +15,7 @@ #include using namespace llvm; -MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) { +MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), CurSection(0) { } MCStreamer::~MCStreamer() { From daniel at zuster.org Mon Jul 19 02:21:01 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 07:21:01 -0000 Subject: [llvm-commits] [llvm] r108683 - in /llvm/trunk/lib/Target/X86: X86Instr64bit.td X86InstrInfo.td Message-ID: <20100719072101.ABC9F2A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 02:21:01 2010 New Revision: 108683 URL: http://llvm.org/viewvc/llvm-project?rev=108683&view=rev Log: X86: Mark In32/64BitMode on LEAVE[64] and SYSEXIT[64]. Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td llvm/trunk/lib/Target/X86/X86InstrInfo.td Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Instr64bit.td?rev=108683&r1=108682&r2=108683&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Instr64bit.td (original) +++ llvm/trunk/lib/Target/X86/X86Instr64bit.td Mon Jul 19 02:21:01 2010 @@ -246,7 +246,7 @@ let Defs = [RBP,RSP], Uses = [RBP,RSP], mayLoad = 1, neverHasSideEffects = 1 in def LEAVE64 : I<0xC9, RawFrm, - (outs), (ins), "leave", []>; + (outs), (ins), "leave", []>, Requires<[In64BitMode]>; let Defs = [RSP], Uses = [RSP], neverHasSideEffects=1 in { let mayLoad = 1 in { def POP64r : I<0x58, AddRegFrm, @@ -330,7 +330,7 @@ // Fast system-call instructions def SYSEXIT64 : RI<0x35, RawFrm, - (outs), (ins), "sysexit", []>, TB; + (outs), (ins), "sysexit", []>, TB, Requires<[In64BitMode]>; //===----------------------------------------------------------------------===// // Move Instructions... Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=108683&r1=108682&r2=108683&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Jul 19 02:21:01 2010 @@ -756,7 +756,7 @@ // let Defs = [EBP, ESP], Uses = [EBP, ESP], mayLoad = 1, neverHasSideEffects=1 in def LEAVE : I<0xC9, RawFrm, - (outs), (ins), "leave", []>; + (outs), (ins), "leave", []>, Requires<[In32BitMode]>; def POPCNT16rr : I<0xB8, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src), "popcnt{w}\t{$src, $dst|$dst, $src}", []>, OpSize, XS; @@ -934,7 +934,7 @@ def SYSENTER : I<0x34, RawFrm, (outs), (ins), "sysenter", []>, TB; def SYSEXIT : I<0x35, RawFrm, - (outs), (ins), "sysexit", []>, TB; + (outs), (ins), "sysexit", []>, TB, Requires<[In32BitMode]>; def WAIT : I<0x9B, RawFrm, (outs), (ins), "wait", []>; From daniel at zuster.org Mon Jul 19 02:21:08 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 07:21:08 -0000 Subject: [llvm-commits] [llvm] r108685 - in /llvm/trunk: lib/Target/X86/X86Instr64bit.td test/MC/AsmParser/X86/x86_instructions.s Message-ID: <20100719072108.253742A6C12E@llvm.org> Author: ddunbar Date: Mon Jul 19 02:21:07 2010 New Revision: 108685 URL: http://llvm.org/viewvc/llvm-project?rev=108685&view=rev Log: X86-64: Mark WINCALL and more tail call instructions as code gen only. Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td llvm/trunk/test/MC/AsmParser/X86/x86_instructions.s Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Instr64bit.td?rev=108685&r1=108684&r2=108685&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Instr64bit.td (original) +++ llvm/trunk/lib/Target/X86/X86Instr64bit.td Mon Jul 19 02:21:07 2010 @@ -158,7 +158,7 @@ // FIXME: We need to teach codegen about single list of call-clobbered // registers. -let isCall = 1 in +let isCall = 1, isCodeGenOnly = 1 in // All calls clobber the non-callee saved registers. RSP is marked as // a use to prevent stack-pointer assignments that appear immediately // before calls from potentially appearing dead. Uses for argument @@ -182,7 +182,8 @@ } -let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in +let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, + isCodeGenOnly = 1 in let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, ST1, MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, Modified: llvm/trunk/test/MC/AsmParser/X86/x86_instructions.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_instructions.s?rev=108685&r1=108684&r2=108685&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_instructions.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_instructions.s Mon Jul 19 02:21:07 2010 @@ -56,7 +56,7 @@ subl %eax, %ebx // FIXME: Check that this matches the correct instruction. -// CHECK: call *%rax +// CHECK: callq *%rax call *%rax // FIXME: Check that this matches the correct instruction. From daniel at zuster.org Mon Jul 19 02:21:04 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 07:21:04 -0000 Subject: [llvm-commits] [llvm] r108684 - /llvm/trunk/lib/Target/X86/X86InstrInfo.td Message-ID: <20100719072104.8426E2A6C12D@llvm.org> Author: ddunbar Date: Mon Jul 19 02:21:04 2010 New Revision: 108684 URL: http://llvm.org/viewvc/llvm-project?rev=108684&view=rev Log: X86: Mark some tail call pseduo instruction as code gen only. Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=108684&r1=108683&r2=108684&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Jul 19 02:21:04 2010 @@ -721,7 +721,8 @@ // Tail call stuff. -let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in +let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, + isCodeGenOnly = 1 in let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, From resistor at mac.com Mon Jul 19 03:09:34 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 08:09:34 -0000 Subject: [llvm-commits] [llvm] r108687 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Message-ID: <20100719080934.7BDF42A6C12D@llvm.org> Author: resistor Date: Mon Jul 19 03:09:34 2010 New Revision: 108687 URL: http://llvm.org/viewvc/llvm-project?rev=108687&view=rev Log: Reimplement r108639 in InstCombine rather than DAGCombine. Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=108687&r1=108686&r2=108687&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Mon Jul 19 03:09:34 2010 @@ -1097,6 +1097,32 @@ break; } } + + // Fold (fptrunc (sqrt (fpext x))) -> (sqrtf x) + // NOTE: This should be disabled by -fno-builtin-sqrt if we ever support it. + CallInst *Call = dyn_cast(CI.getOperand(0)); + if (Call && Call->getCalledFunction() && + Call->getCalledFunction()->getName() == "sqrt" && + Call->getNumArgOperands() == 1) { + CastInst *Arg = dyn_cast(Call->getArgOperand(0)); + if (Arg && Arg->getOpcode() == Instruction::FPExt && + CI.getType() == Builder->getFloatTy() && + Call->getType() == Builder->getDoubleTy() && + Arg->getType() == Builder->getDoubleTy() && + Arg->getOperand(0)->getType() == Builder->getFloatTy()) { + Module* M = CI.getParent()->getParent()->getParent(); + Constant* SqrtfFunc = M->getOrInsertFunction("sqrtf", + Call->getAttributes(), + Builder->getFloatTy(), + Builder->getFloatTy(), + NULL); + CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0), + "sqrtfcall"); + ret->setAttributes(Call->getAttributes()); + return ret; + } + } + return 0; } From resistor at mac.com Mon Jul 19 03:10:24 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 08:10:24 -0000 Subject: [llvm-commits] [llvm] r108688 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/2010-07-18-sqrt.ll Message-ID: <20100719081024.56DF92A6C12D@llvm.org> Author: resistor Date: Mon Jul 19 03:10:24 2010 New Revision: 108688 URL: http://llvm.org/viewvc/llvm-project?rev=108688&view=rev Log: Remove r108639 now that it is handled by InstCombine instead. Removed: llvm/trunk/test/CodeGen/X86/2010-07-18-sqrt.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=108688&r1=108687&r2=108688&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Jul 19 03:10:24 2010 @@ -4926,19 +4926,6 @@ return DAG.getNode(ISD::FCOPYSIGN, N->getDebugLoc(), VT, Tmp, N0.getOperand(1)); } - - // (f32 fp_round (f64 sqrt (f64 fp_extend (f32)))) -> (f32 sqrt) - EVT VT0 = N0.getValueType(); - if (VT == MVT::f32 && - N0.getOpcode() == ISD::FSQRT && VT0 == MVT::f64) { - SDValue N1 = N0.getOperand(0); - EVT VT1 = N1.getValueType(); - if (N1.getOpcode() == ISD::FP_EXTEND && VT1 == MVT::f64 && - N1.getOperand(0).getValueType() == MVT::f32) { - return DAG.getNode(ISD::FSQRT, N->getDebugLoc(), MVT::f32, - N1.getOperand(0), N->getOperand(1)); - } - } return SDValue(); } Removed: llvm/trunk/test/CodeGen/X86/2010-07-18-sqrt.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-07-18-sqrt.ll?rev=108687&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/2010-07-18-sqrt.ll (original) +++ llvm/trunk/test/CodeGen/X86/2010-07-18-sqrt.ll (removed) @@ -1,17 +0,0 @@ -; RUN: llc < %s -march=x86 -mattr=+sse2 | FileCheck %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -target triple = "x86_64-apple-darwin10.0.0" - -define float @foo(float %x) nounwind readnone ssp { -entry: -; CHECK-NOT: cvtss2sd -; CHECK-NOT: sqrtsd -; CHECK-NOT: cvtsd2ss -; CHECK: sqrtss - %conv = fpext float %x to double ; [#uses=1] - %call = tail call double @sqrt(double %conv) nounwind ; [#uses=1] - %conv1 = fptrunc double %call to float ; [#uses=1] - ret float %conv1 -} - -declare double @sqrt(double) readnone From resistor at mac.com Mon Jul 19 03:14:26 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 08:14:26 -0000 Subject: [llvm-commits] [llvm] r108689 - /llvm/trunk/test/Transforms/InstCombine/2010-07-19-sqrt.ll Message-ID: <20100719081426.D8CA62A6C12D@llvm.org> Author: resistor Date: Mon Jul 19 03:14:26 2010 New Revision: 108689 URL: http://llvm.org/viewvc/llvm-project?rev=108689&view=rev Log: Testcase for r108687. Added: llvm/trunk/test/Transforms/InstCombine/2010-07-19-sqrt.ll Added: llvm/trunk/test/Transforms/InstCombine/2010-07-19-sqrt.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2010-07-19-sqrt.ll?rev=108689&view=auto ============================================================================== --- llvm/trunk/test/Transforms/InstCombine/2010-07-19-sqrt.ll (added) +++ llvm/trunk/test/Transforms/InstCombine/2010-07-19-sqrt.ll Mon Jul 19 03:14:26 2010 @@ -0,0 +1,16 @@ +; RUN: opt -S -instcombine %s | FileCheck %s + +define float @foo(float %x) nounwind readnone ssp { +entry: +; CHECK-NOT: fpext +; CHECK-NOT: sqrt( +; CHECK: sqrtf( +; CHECK-NOT: fptrunc + %conv = fpext float %x to double ; [#uses=1] + %call = tail call double @sqrt(double %conv) nounwind ; [#uses=1] + %conv1 = fptrunc double %call to float ; [#uses=1] +; CHECK: ret float + ret float %conv1 +} + +declare double @sqrt(double) readnone From baldrick at free.fr Mon Jul 19 04:33:14 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Jul 2010 09:33:14 -0000 Subject: [llvm-commits] [llvm] r108690 - in /llvm/trunk: include/llvm-c/ExecutionEngine.h lib/ExecutionEngine/ExecutionEngineBindings.cpp Message-ID: <20100719093314.1860D2A6C12C@llvm.org> Author: baldrick Date: Mon Jul 19 04:33:13 2010 New Revision: 108690 URL: http://llvm.org/viewvc/llvm-project?rev=108690&view=rev Log: Expose JIT::recompileAndRelinkFunction for use through the C API. Patch by Benjamin Saunders. Modified: llvm/trunk/include/llvm-c/ExecutionEngine.h llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Modified: llvm/trunk/include/llvm-c/ExecutionEngine.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ExecutionEngine.h?rev=108690&r1=108689&r2=108690&view=diff ============================================================================== --- llvm/trunk/include/llvm-c/ExecutionEngine.h (original) +++ llvm/trunk/include/llvm-c/ExecutionEngine.h Mon Jul 19 04:33:13 2010 @@ -116,6 +116,8 @@ LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, LLVMValueRef *OutFn); +void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn); + LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE); void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp?rev=108690&r1=108689&r2=108690&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Mon Jul 19 04:33:13 2010 @@ -236,6 +236,10 @@ return 1; } +void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn) { + return unwrap(EE)->recompileAndRelinkFunction(unwrap(Fn)); +} + LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { return wrap(unwrap(EE)->getTargetData()); } From baldrick at free.fr Mon Jul 19 04:36:45 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Jul 2010 09:36:45 -0000 Subject: [llvm-commits] [llvm] r108691 - /llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Message-ID: <20100719093645.78A0B2A6C12C@llvm.org> Author: baldrick Date: Mon Jul 19 04:36:45 2010 New Revision: 108691 URL: http://llvm.org/viewvc/llvm-project?rev=108691&view=rev Log: Fix indentation. Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp?rev=108691&r1=108690&r2=108691&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Mon Jul 19 04:36:45 2010 @@ -237,7 +237,7 @@ } void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn) { - return unwrap(EE)->recompileAndRelinkFunction(unwrap(Fn)); + return unwrap(EE)->recompileAndRelinkFunction(unwrap(Fn)); } LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { From ggreif at gmail.com Mon Jul 19 09:48:15 2010 From: ggreif at gmail.com (Gabor Greif) Date: Mon, 19 Jul 2010 14:48:15 -0000 Subject: [llvm-commits] [llvm] r108695 - /llvm/trunk/lib/VMCore/Use.cpp Message-ID: <20100719144815.307D52A6C12C@llvm.org> Author: ggreif Date: Mon Jul 19 09:48:15 2010 New Revision: 108695 URL: http://llvm.org/viewvc/llvm-project?rev=108695&view=rev Log: precompute 20 tags Modified: llvm/trunk/lib/VMCore/Use.cpp Modified: llvm/trunk/lib/VMCore/Use.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Use.cpp?rev=108695&r1=108694&r2=108695&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Use.cpp (original) +++ llvm/trunk/lib/VMCore/Use.cpp Mon Jul 19 09:48:15 2010 @@ -86,11 +86,17 @@ //===----------------------------------------------------------------------===// Use *Use::initTags(Use * const Start, Use *Stop, ptrdiff_t Done) { - while (Done < 6) { + while (Done < 20) { if (Start == Stop--) return Start; - static const PrevPtrTag tags[6] = { fullStopTag, oneDigitTag, stopTag, - oneDigitTag, oneDigitTag, stopTag }; + static const PrevPtrTag tags[20] = { fullStopTag, oneDigitTag, stopTag, + oneDigitTag, oneDigitTag, stopTag, + zeroDigitTag, oneDigitTag, oneDigitTag, + stopTag, zeroDigitTag, oneDigitTag, + zeroDigitTag, oneDigitTag, stopTag, + oneDigitTag, oneDigitTag, oneDigitTag, + oneDigitTag, stopTag + }; Stop->Prev.setFromOpaqueValue(reinterpret_cast(tags[Done++])); Stop->Val = 0; } From daniel at zuster.org Mon Jul 19 09:53:46 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 14:53:46 -0000 Subject: [llvm-commits] [zorg] r108696 - /zorg/trunk/buildbot/osuosl/master/master.cfg Message-ID: <20100719145346.C6CF32A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 09:53:46 2010 New Revision: 108696 URL: http://llvm.org/viewvc/llvm-project?rev=108696&view=rev Log: buildbot: Use gzip instead of bzip2 for log compression. Modified: zorg/trunk/buildbot/osuosl/master/master.cfg Modified: zorg/trunk/buildbot/osuosl/master/master.cfg URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/buildbot/osuosl/master/master.cfg?rev=108696&r1=108695&r2=108696&view=diff ============================================================================== --- zorg/trunk/buildbot/osuosl/master/master.cfg (original) +++ zorg/trunk/buildbot/osuosl/master/master.cfg Mon Jul 19 09:53:46 2010 @@ -79,6 +79,9 @@ # Number of builds to cache in memory. c['buildCacheSize'] = 1000 +# Use gzip instead of bz2, to reduce server load. +c['logCompressionMethod'] = 'gz' + ####### SCHEDULERS from buildbot.scheduler import Scheduler From lhames at gmail.com Mon Jul 19 10:22:28 2010 From: lhames at gmail.com (Lang Hames) Date: Mon, 19 Jul 2010 15:22:28 -0000 Subject: [llvm-commits] [llvm] r108698 - in /llvm/trunk: include/llvm/CodeGen/SlotIndexes.h lib/CodeGen/RegAllocPBQP.cpp lib/CodeGen/RenderMachineFunction.cpp lib/CodeGen/RenderMachineFunction.h Message-ID: <20100719152229.036432A6C12C@llvm.org> Author: lhames Date: Mon Jul 19 10:22:28 2010 New Revision: 108698 URL: http://llvm.org/viewvc/llvm-project?rev=108698&view=rev Log: Render MachineFunctions to HTML pages, with options to render register pressure estimates and liveness alongside. Still experimental. Added: llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp llvm/trunk/lib/CodeGen/RenderMachineFunction.h Modified: llvm/trunk/include/llvm/CodeGen/SlotIndexes.h llvm/trunk/lib/CodeGen/RegAllocPBQP.cpp Modified: llvm/trunk/include/llvm/CodeGen/SlotIndexes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SlotIndexes.h?rev=108698&r1=108697&r2=108698&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SlotIndexes.h (original) +++ llvm/trunk/include/llvm/CodeGen/SlotIndexes.h Mon Jul 19 10:22:28 2010 @@ -494,6 +494,11 @@ return SlotIndex(front(), 0); } + /// Returns the base index of the last slot in this analysis. + SlotIndex getLastIndex() { + return SlotIndex(back(), 0); + } + /// Returns the invalid index marker for this analysis. SlotIndex getInvalidIndex() { return getZeroIndex(); Modified: llvm/trunk/lib/CodeGen/RegAllocPBQP.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocPBQP.cpp?rev=108698&r1=108697&r2=108698&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/RegAllocPBQP.cpp (original) +++ llvm/trunk/lib/CodeGen/RegAllocPBQP.cpp Mon Jul 19 10:22:28 2010 @@ -34,6 +34,7 @@ #include "PBQP/HeuristicSolver.h" #include "PBQP/Graph.h" #include "PBQP/Heuristics/Briggs.h" +#include "RenderMachineFunction.h" #include "Splitter.h" #include "VirtRegMap.h" #include "VirtRegRewriter.h" @@ -105,6 +106,7 @@ if (pbqpPreSplitting) au.addRequired(); au.addRequired(); + au.addRequired(); MachineFunctionPass::getAnalysisUsage(au); } @@ -866,6 +868,9 @@ vrm = &getAnalysis(); + RenderMachineFunction *rmf = &getAnalysis(); + rmf->renderMachineFunction("Prior to PBQP register allocation."); + DEBUG(dbgs() << "PBQP Register Allocating for " << mf->getFunction()->getName() << "\n"); // Allocator main loop: Added: llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp?rev=108698&view=auto ============================================================================== --- llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp (added) +++ llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp Mon Jul 19 10:22:28 2010 @@ -0,0 +1,834 @@ +//===-- llvm/CodeGen/RenderMachineFunction.cpp - MF->HTML -----s-----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "rendermf" + +#include "RenderMachineFunction.h" + +#include "llvm/Function.h" +#include "llvm/Module.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/CodeGen/LiveIntervalAnalysis.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Target/TargetMachine.h" + +#include + +using namespace llvm; + +char RenderMachineFunction::ID = 0; +static RegisterPass +X("rendermf", "Render machine functions (and related info) to HTML pages"); + +static cl::opt +outputFileSuffix("rmf-file-suffix", + cl::desc("Appended to function name to get output file name " + "(default: \".html\")"), + cl::init(".html"), cl::Hidden); + +static cl::opt +machineFuncsToRender("rmf-funcs", + cl::desc("Coma seperated list of functions to render" + ", or \"*\"."), + cl::init(""), cl::Hidden); + +static cl::opt +pressureClasses("rmf-classes", + cl::desc("Register classes to render pressure for."), + cl::init(""), cl::Hidden); + +static cl::opt +showIntervals("rmf-intervals", + cl::desc("Live intervals to show alongside code."), + cl::init(""), cl::Hidden); + +static cl::opt +showEmptyIndexes("rmf-empty-indexes", + cl::desc("Render indexes not associated with instructions or " + "MBB starts."), + cl::init(false), cl::Hidden); + +static cl::opt +useFancyVerticals("rmf-fancy-verts", + cl::desc("Use SVG for vertical text."), + cl::init(true), cl::Hidden); + +namespace llvm { + + bool MFRenderingOptions::renderingOptionsProcessed; + std::set MFRenderingOptions::mfNamesToRender; + bool MFRenderingOptions::renderAllMFs = false; + + std::set MFRenderingOptions::classNamesToRender; + bool MFRenderingOptions::renderAllClasses = false; + + std::set > + MFRenderingOptions::intervalNumsToRender; + unsigned MFRenderingOptions::intervalTypesToRender = ExplicitOnly; + + template + void MFRenderingOptions::splitComaSeperatedList(const std::string &s, + OutputItr outItr) { + std::string::const_iterator curPos = s.begin(); + std::string::const_iterator nextComa = std::find(curPos, s.end(), ','); + while (nextComa != s.end()) { + std::string elem; + std::copy(curPos, nextComa, std::back_inserter(elem)); + *outItr = elem; + ++outItr; + curPos = llvm::next(nextComa); + nextComa = std::find(curPos, s.end(), ','); + } + + if (curPos != s.end()) { + std::string elem; + std::copy(curPos, s.end(), std::back_inserter(elem)); + *outItr = elem; + ++outItr; + } + } + + void MFRenderingOptions::processOptions() { + if (!renderingOptionsProcessed) { + processFuncNames(); + processRegClassNames(); + processIntervalNumbers(); + renderingOptionsProcessed = true; + } + } + + void MFRenderingOptions::processFuncNames() { + if (machineFuncsToRender == "*") { + renderAllMFs = true; + } else { + splitComaSeperatedList(machineFuncsToRender, + std::inserter(mfNamesToRender, + mfNamesToRender.begin())); + } + } + + void MFRenderingOptions::processRegClassNames() { + if (pressureClasses == "*") { + renderAllClasses = true; + } else { + splitComaSeperatedList(pressureClasses, + std::inserter(classNamesToRender, + classNamesToRender.begin())); + } + } + + void MFRenderingOptions::processIntervalNumbers() { + std::set intervalRanges; + splitComaSeperatedList(showIntervals, + std::inserter(intervalRanges, + intervalRanges.begin())); + std::for_each(intervalRanges.begin(), intervalRanges.end(), + processIntervalRange); + } + + void MFRenderingOptions::processIntervalRange( + const std::string &intervalRangeStr) { + if (intervalRangeStr == "*") { + intervalTypesToRender |= All; + } else if (intervalRangeStr == "virt*") { + intervalTypesToRender |= VirtPlusExplicit; + } else if (intervalRangeStr == "phys*") { + intervalTypesToRender |= PhysPlusExplicit; + } else { + std::istringstream iss(intervalRangeStr); + unsigned reg1, reg2; + if ((iss >> reg1 >> std::ws)) { + if (iss.eof()) { + intervalNumsToRender.insert(std::make_pair(reg1, reg1 + 1)); + } else { + char c; + iss >> c; + if (c == '-' && (iss >> reg2)) { + intervalNumsToRender.insert(std::make_pair(reg1, reg2 + 1)); + } else { + dbgs() << "Warning: Invalid interval range \"" + << intervalRangeStr << "\" in -rmf-intervals. Skipping.\n"; + } + } + } else { + dbgs() << "Warning: Invalid interval number \"" + << intervalRangeStr << "\" in -rmf-intervals. Skipping.\n"; + } + } + } + + void MFRenderingOptions::setup(MachineFunction *mf, + const TargetRegisterInfo *tri, + LiveIntervals *lis) { + this->mf = mf; + this->tri = tri; + this->lis = lis; + + clear(); + } + + void MFRenderingOptions::clear() { + regClassesTranslatedToCurrentFunction = false; + regClassSet.clear(); + + intervalsTranslatedToCurrentFunction = false; + intervalSet.clear(); + } + + void MFRenderingOptions::resetRenderSpecificOptions() { + intervalSet.clear(); + intervalsTranslatedToCurrentFunction = false; + } + + bool MFRenderingOptions::shouldRenderCurrentMachineFunction() const { + processOptions(); + + return (renderAllMFs || + mfNamesToRender.find(mf->getFunction()->getName()) != + mfNamesToRender.end()); + } + + const MFRenderingOptions::RegClassSet& MFRenderingOptions::regClasses() const{ + translateRegClassNamesToCurrentFunction(); + return regClassSet; + } + + const MFRenderingOptions::IntervalSet& MFRenderingOptions::intervals() const { + translateIntervalNumbersToCurrentFunction(); + return intervalSet; + } + + bool MFRenderingOptions::renderEmptyIndexes() const { + return showEmptyIndexes; + } + + bool MFRenderingOptions::fancyVerticals() const { + return useFancyVerticals; + } + + void MFRenderingOptions::translateRegClassNamesToCurrentFunction() const { + if (!regClassesTranslatedToCurrentFunction) { + processOptions(); + for (TargetRegisterInfo::regclass_iterator rcItr = tri->regclass_begin(), + rcEnd = tri->regclass_end(); + rcItr != rcEnd; ++rcItr) { + const TargetRegisterClass *trc = *rcItr; + if (renderAllClasses || + classNamesToRender.find(trc->getName()) != + classNamesToRender.end()) { + regClassSet.insert(trc); + } + } + regClassesTranslatedToCurrentFunction = true; + } + } + + void MFRenderingOptions::translateIntervalNumbersToCurrentFunction() const { + if (!intervalsTranslatedToCurrentFunction) { + processOptions(); + + // If we're not just doing explicit then do a copy over all matching + // types. + if (intervalTypesToRender != ExplicitOnly) { + for (LiveIntervals::iterator liItr = lis->begin(), liEnd = lis->end(); + liItr != liEnd; ++liItr) { + + if ((TargetRegisterInfo::isPhysicalRegister(liItr->first) && + (intervalTypesToRender & PhysPlusExplicit)) || + (TargetRegisterInfo::isVirtualRegister(liItr->first) && + (intervalTypesToRender & VirtPlusExplicit))) { + intervalSet.insert(liItr->second); + } + } + } + + // If we need to process the explicit list... + if (intervalTypesToRender != All) { + for (std::set >::const_iterator + regRangeItr = intervalNumsToRender.begin(), + regRangeEnd = intervalNumsToRender.end(); + regRangeItr != regRangeEnd; ++regRangeItr) { + const std::pair &range = *regRangeItr; + for (unsigned reg = range.first; reg != range.second; ++reg) { + if (lis->hasInterval(reg)) { + intervalSet.insert(&lis->getInterval(reg)); + } + } + } + } + + intervalsTranslatedToCurrentFunction = true; + } + } + + // ---------- TargetRegisterExtraInformation implementation ---------- + + TargetRegisterExtraInfo::TargetRegisterExtraInfo() + : mapsPopulated(false) { + } + + void TargetRegisterExtraInfo::setup(MachineFunction *mf, + MachineRegisterInfo *mri, + const TargetRegisterInfo *tri, + LiveIntervals *lis) { + this->mf = mf; + this->mri = mri; + this->tri = tri; + this->lis = lis; + } + + void TargetRegisterExtraInfo::reset() { + if (!mapsPopulated) { + initWorst(); + //initBounds(); + initCapacity(); + mapsPopulated = true; + } + + resetPressureAndLiveStates(); + } + + void TargetRegisterExtraInfo::clear() { + prWorst.clear(); + vrWorst.clear(); + capacityMap.clear(); + pressureMap.clear(); + //liveStatesMap.clear(); + mapsPopulated = false; + } + + void TargetRegisterExtraInfo::initWorst() { + assert(!mapsPopulated && prWorst.empty() && vrWorst.empty() && + "Worst map already initialised?"); + + // Start with the physical registers. + for (unsigned preg = 1; preg < tri->getNumRegs(); ++preg) { + WorstMapLine &pregLine = prWorst[preg]; + + for (TargetRegisterInfo::regclass_iterator rcItr = tri->regclass_begin(), + rcEnd = tri->regclass_end(); + rcItr != rcEnd; ++rcItr) { + const TargetRegisterClass *trc = *rcItr; + + unsigned numOverlaps = 0; + for (TargetRegisterClass::iterator rItr = trc->begin(), + rEnd = trc->end(); + rItr != rEnd; ++rItr) { + unsigned trcPReg = *rItr; + if (tri->regsOverlap(preg, trcPReg)) + ++numOverlaps; + } + + pregLine[trc] = numOverlaps; + } + } + + // Now the register classes. + for (TargetRegisterInfo::regclass_iterator rc1Itr = tri->regclass_begin(), + rcEnd = tri->regclass_end(); + rc1Itr != rcEnd; ++rc1Itr) { + const TargetRegisterClass *trc1 = *rc1Itr; + WorstMapLine &classLine = vrWorst[trc1]; + + for (TargetRegisterInfo::regclass_iterator rc2Itr = tri->regclass_begin(); + rc2Itr != rcEnd; ++rc2Itr) { + const TargetRegisterClass *trc2 = *rc2Itr; + + unsigned worst = 0; + + for (TargetRegisterClass::iterator trc1Itr = trc1->begin(), + trc1End = trc1->end(); + trc1Itr != trc1End; ++trc1Itr) { + unsigned trc1Reg = *trc1Itr; + unsigned trc1RegWorst = 0; + + for (TargetRegisterClass::iterator trc2Itr = trc2->begin(), + trc2End = trc2->end(); + trc2Itr != trc2End; ++trc2Itr) { + unsigned trc2Reg = *trc2Itr; + if (tri->regsOverlap(trc1Reg, trc2Reg)) + ++trc1RegWorst; + } + if (trc1RegWorst > worst) { + worst = trc1RegWorst; + } + } + + if (worst != 0) { + classLine[trc2] = worst; + } + } + } + } + + unsigned TargetRegisterExtraInfo::getWorst( + unsigned reg, + const TargetRegisterClass *trc) const { + const WorstMapLine *wml = 0; + if (TargetRegisterInfo::isPhysicalRegister(reg)) { + PRWorstMap::const_iterator prwItr = prWorst.find(reg); + assert(prwItr != prWorst.end() && "Missing prWorst entry."); + wml = &prwItr->second; + } else { + const TargetRegisterClass *regTRC = mri->getRegClass(reg); + VRWorstMap::const_iterator vrwItr = vrWorst.find(regTRC); + assert(vrwItr != vrWorst.end() && "Missing vrWorst entry."); + wml = &vrwItr->second; + } + + WorstMapLine::const_iterator wmlItr = wml->find(trc); + if (wmlItr == wml->end()) + return 0; + + return wmlItr->second; + } + + void TargetRegisterExtraInfo::initCapacity() { + assert(!mapsPopulated && capacityMap.empty() && + "Capacity map already initialised?"); + + for (TargetRegisterInfo::regclass_iterator rcItr = tri->regclass_begin(), + rcEnd = tri->regclass_end(); + rcItr != rcEnd; ++rcItr) { + const TargetRegisterClass *trc = *rcItr; + unsigned capacity = std::distance(trc->allocation_order_begin(*mf), + trc->allocation_order_end(*mf)); + + if (capacity != 0) + capacityMap[trc] = capacity; + } + } + + unsigned TargetRegisterExtraInfo::getCapacity( + const TargetRegisterClass *trc) const { + CapacityMap::const_iterator cmItr = capacityMap.find(trc); + assert(cmItr != capacityMap.end() && + "vreg with unallocable register class"); + return cmItr->second; + } + + void TargetRegisterExtraInfo::resetPressureAndLiveStates() { + pressureMap.clear(); + //liveStatesMap.clear(); + + // Iterate over all slots. + + + // Iterate over all live intervals. + for (LiveIntervals::iterator liItr = lis->begin(), + liEnd = lis->end(); + liItr != liEnd; ++liItr) { + LiveInterval *li = liItr->second; + + const TargetRegisterClass *liTRC; + + if (TargetRegisterInfo::isPhysicalRegister(li->reg)) + continue; + + liTRC = mri->getRegClass(li->reg); + + + // For all ranges in the current interal. + for (LiveInterval::iterator lrItr = li->begin(), + lrEnd = li->end(); + lrItr != lrEnd; ++lrItr) { + LiveRange *lr = &*lrItr; + + // For all slots in the current range. + for (SlotIndex i = lr->start; i != lr->end; i = i.getNextSlot()) { + + // Record increased pressure at index for all overlapping classes. + for (TargetRegisterInfo::regclass_iterator + rcItr = tri->regclass_begin(), + rcEnd = tri->regclass_end(); + rcItr != rcEnd; ++rcItr) { + const TargetRegisterClass *trc = *rcItr; + + if (trc->allocation_order_begin(*mf) == + trc->allocation_order_end(*mf)) + continue; + + unsigned worstAtI = getWorst(li->reg, trc); + + if (worstAtI != 0) { + pressureMap[i][trc] += worstAtI; + } + } + } + } + } + } + + unsigned TargetRegisterExtraInfo::getPressureAtSlot( + const TargetRegisterClass *trc, + SlotIndex i) const { + PressureMap::const_iterator pmItr = pressureMap.find(i); + if (pmItr == pressureMap.end()) + return 0; + const PressureMapLine &pmLine = pmItr->second; + PressureMapLine::const_iterator pmlItr = pmLine.find(trc); + if (pmlItr == pmLine.end()) + return 0; + return pmlItr->second; + } + + bool TargetRegisterExtraInfo::classOverCapacityAtSlot( + const TargetRegisterClass *trc, + SlotIndex i) const { + return (getPressureAtSlot(trc, i) > getCapacity(trc)); + } + + // ---------- MachineFunctionRenderer implementation ---------- + + template + std::string RenderMachineFunction::escapeChars(Iterator sBegin, Iterator sEnd) const { + std::string r; + + for (Iterator sItr = sBegin; sItr != sEnd; ++sItr) { + char c = *sItr; + + switch (c) { + case '<': r.append("<"); break; + case '>': r.append(">"); break; + case '&': r.append("&"); break; + case ' ': r.append(" "); break; + case '\"': r.append("""); break; + default: r.push_back(c); break; + } + } + + return r; + } + + template + void RenderMachineFunction::renderVertical(const std::string &indent, + OStream &os, + const T &t) const { + if (ro.fancyVerticals()) { + os << indent << "\n" + << indent << " " << t << "\n" + << indent << " \">\n" + << indent << "\n"; + } else { + std::ostringstream oss; + oss << t; + std::string tStr(oss.str()); + + os << indent; + for (std::string::iterator tStrItr = tStr.begin(), tStrEnd = tStr.end(); + tStrItr != tStrEnd; ++tStrItr) { + os << *tStrItr << "
"; + } + os << "\n"; + } + } + + template + void RenderMachineFunction::insertCSS(const std::string &indent, + OStream &os) const { + os << indent << "\n"; + } + + template + void RenderMachineFunction::renderFunctionSummary( + const std::string &indent, OStream &os, + const char * const renderContextStr) const { + os << indent << "

Function: " << mf->getFunction()->getName() + << "

\n" + << indent << "

Rendering context: " << renderContextStr << "

\n"; + } + + + template + void RenderMachineFunction::renderPressureTableLegend( + const std::string &indent, + OStream &os) const { + os << indent << "

Rendering Pressure Legend:

\n" + << indent << "\n" + << indent << " \n" + << indent << " " + "\n" + << indent << " \n" + << indent << " \n" + << indent << " " + " " + " \n" + << indent << " \n" + << indent << " \n" + << indent << " " + " " + " \n" + << indent << " \n" + << indent << " \n" + << indent << " " + " " + " \n" + << indent << " \n" + << indent << "
PressureDescriptionAppearance
No PressureNo physical registers of this class requested.  
Low PressureSufficient physical registers to meet demand.  
High PressurePotentially insufficient physical registers to meet demand.  
\n"; + } + + template + void RenderMachineFunction::renderCodeTablePlusPI(const std::string & indent, + OStream &os) const { + + os << indent << "\n" + << indent << " \n" + << indent << " \n" + << indent << " \n"; + + // Header row: + + if (!ro.regClasses().empty()) { + for (MFRenderingOptions::RegClassSet::const_iterator + rcItr = ro.regClasses().begin(), + rcEnd = ro.regClasses().end(); + rcItr != rcEnd; ++rcItr) { + const TargetRegisterClass *trc = *rcItr; + os << indent << " \n"; + } + } + + // FIXME: Is there a nicer way to insert space between columns in HTML? + if (!ro.regClasses().empty() && !ro.intervals().empty()) + os << indent << " \n"; + + if (!ro.intervals().empty()) { + for (MFRenderingOptions::IntervalSet::const_iterator + liItr = ro.intervals().begin(), + liEnd = ro.intervals().end(); + liItr != liEnd; ++liItr) { + + const LiveInterval *li = *liItr; + os << indent << " \n"; + } + } + + os << indent << " \n"; + + MachineInstr *mi = 0; + + // Data rows: + for (SlotIndex i = sis->getZeroIndex(); i != sis->getLastIndex(); + i = i.getNextSlot()) { + + os << indent << " \n"; + + if (i.getSlot() == SlotIndex::LOAD) { + MachineBasicBlock *mbb = sis->getMBBFromIndex(i); + mi = sis->getInstructionFromIndex(i); + + if (i == sis->getMBBStartIdx(mbb) || mi != 0 || + ro.renderEmptyIndexes()) { + os << indent << " \n" + << indent << " \n"; + } else { + i = i.getStoreIndex(); // <- Will be incremented to the next index. + continue; + } + } + + if (!ro.regClasses().empty()) { + for (MFRenderingOptions::RegClassSet::const_iterator + rcItr = ro.regClasses().begin(), + rcEnd = ro.regClasses().end(); + rcItr != rcEnd; ++rcItr) { + const TargetRegisterClass *trc = *rcItr; + + os << indent << " \n"; + } + } + + // FIXME: Is there a nicer way to insert space between columns in HTML? + if (!ro.regClasses().empty() && !ro.intervals().empty()) + os << indent << " \n"; + + if (!ro.intervals().empty()) { + for (MFRenderingOptions::IntervalSet::const_iterator + liItr = ro.intervals().begin(), + liEnd = ro.intervals().end(); + liItr != liEnd; ++liItr) { + const LiveInterval *li = *liItr; + os << indent << " \n"; + } + } + os << indent << " \n"; + } + + os << indent << "
indexinstr\n"; + renderVertical(indent + " ", os, trc->getName()); + os << indent << "   \n"; + renderVertical(indent + " ", os, li->reg); + os << indent << "
" << i << " \n"; + + if (i == sis->getMBBStartIdx(mbb)) { + os << indent << " BB#" << mbb->getNumber() << ": \n"; + } else if (mi != 0) { + os << indent << "   " << escapeChars(mi) << "\n"; + } else { + os << indent << "  \n"; + } + os << indent << " liveAt(i)) { + if (mi == 0) { + os << "l-sa"; + } else { + if (i.getSlot() == SlotIndex::DEF && + mi->definesRegister(li->reg, tri)) { + os << "l-def"; + } else if (i.getSlot() == SlotIndex::USE && + mi->readsRegister(li->reg)) { + os << "l-use"; + } else { + os << "l-sa"; + } + } + } else { + os << "l-na"; + } + os << "\">
\n"; + + if (!ro.regClasses().empty()) + renderPressureTableLegend(indent, os); + } + + template + void RenderMachineFunction::renderWarnings(const std::string &indent, + OStream &os) const { + } + + template + void RenderMachineFunction::renderFunctionPage( + OStream &os, + const char * const renderContextStr) const { + os << "\n" + << " \n" + << " " << fqn << "\n"; + + insertCSS(" ", os); + + os << " \n" + << " \n"; + + renderFunctionSummary(" ", os, renderContextStr); + + os << "


\n"; + + //renderLiveIntervalInfoTable(" ", os); + + os << "


\n"; + + renderCodeTablePlusPI(" ", os); + + os << " \n" + << "\n"; + } + + void RenderMachineFunction::getAnalysisUsage(AnalysisUsage &au) const { + au.addRequired(); + au.addRequired(); + au.setPreservesAll(); + MachineFunctionPass::getAnalysisUsage(au); + } + + bool RenderMachineFunction::runOnMachineFunction(MachineFunction &fn) { + mf = &fn; + mri = &mf->getRegInfo(); + tri = mf->getTarget().getRegisterInfo(); + lis = &getAnalysis(); + sis = &getAnalysis(); + + trei.setup(mf, mri, tri, lis); + ro.setup(mf, tri, lis); + + fqn = mf->getFunction()->getParent()->getModuleIdentifier() + "." + + mf->getFunction()->getName().str(); + + return false; + } + + void RenderMachineFunction::releaseMemory() { + trei.clear(); + ro.clear(); + } + + void RenderMachineFunction::renderMachineFunction( + const char *renderContextStr, + const char *renderSuffix) { + if (!ro.shouldRenderCurrentMachineFunction()) + return; + + trei.reset(); + + std::string rpFileName(mf->getFunction()->getName().str() + + (renderSuffix ? renderSuffix : "") + + outputFileSuffix); + + std::string errMsg; + raw_fd_ostream outFile(rpFileName.c_str(), errMsg, raw_fd_ostream::F_Binary); + + renderFunctionPage(outFile, renderContextStr); + + ro.resetRenderSpecificOptions(); + } + + void RenderMachineFunction::setupRenderingOptions() { + + } + + std::string RenderMachineFunction::escapeChars(const std::string &s) const { + return escapeChars(s.begin(), s.end()); + } + + std::string RenderMachineFunction::escapeChars(const MachineInstr *mi) const { + std::string s; + raw_string_ostream os(s); + os << *mi; + std::string s2 = os.str(); + return escapeChars(s2); + } + +} Added: llvm/trunk/lib/CodeGen/RenderMachineFunction.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RenderMachineFunction.h?rev=108698&view=auto ============================================================================== --- llvm/trunk/lib/CodeGen/RenderMachineFunction.h (added) +++ llvm/trunk/lib/CodeGen/RenderMachineFunction.h Mon Jul 19 10:22:28 2010 @@ -0,0 +1,291 @@ +//===-- llvm/CodeGen/RenderMachineFunction.h - MF->HTML -*- C++ -*---------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_RENDERMACHINEFUNCTION_H +#define LLVM_CODEGEN_RENDERMACHINEFUNCTION_H + +#include "llvm/CodeGen/LiveInterval.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/SlotIndexes.h" +#include "llvm/Target/TargetRegisterInfo.h" + +#include +#include +#include +#include + +namespace llvm { + + class LiveInterval; + class LiveIntervals; + class MachineInstr; + class MachineRegisterInfo; + class TargetRegisterClass; + class TargetRegisterInfo; + + + /// \brief Provide extra information about the physical and virtual registers + /// in the function being compiled. + class TargetRegisterExtraInfo { + public: + TargetRegisterExtraInfo(); + + /// \brief Set up TargetRegisterExtraInfo with pointers to necessary + /// sources of information. + void setup(MachineFunction *mf, MachineRegisterInfo *mri, + const TargetRegisterInfo *tri, LiveIntervals *lis); + + /// \brief Recompute tables for changed function. + void reset(); + + /// \brief Free all tables in TargetRegisterExtraInfo. + void clear(); + + /// \brief Maximum number of registers from trc which alias reg. + unsigned getWorst(unsigned reg, const TargetRegisterClass *trc) const; + + /// \brief Returns the number of allocable registers in trc. + unsigned getCapacity(const TargetRegisterClass *trc) const; + + /// \brief Return the number of registers of class trc that may be + /// needed at slot i. + unsigned getPressureAtSlot(const TargetRegisterClass *trc, + SlotIndex i) const; + + /// \brief Return true if the number of registers of type trc that may be + /// needed at slot i is greater than the capacity of trc. + bool classOverCapacityAtSlot(const TargetRegisterClass *trc, + SlotIndex i) const; + + private: + + MachineFunction *mf; + MachineRegisterInfo *mri; + const TargetRegisterInfo *tri; + LiveIntervals *lis; + + typedef std::map WorstMapLine; + typedef std::map VRWorstMap; + VRWorstMap vrWorst; + + typedef std::map PRWorstMap; + PRWorstMap prWorst; + + typedef std::map CapacityMap; + CapacityMap capacityMap; + + typedef std::map PressureMapLine; + typedef std::map PressureMap; + PressureMap pressureMap; + + bool mapsPopulated; + + /// \brief Initialise the 'worst' table. + void initWorst(); + + /// \brief Initialise the 'capacity' table. + void initCapacity(); + + /// \brief Initialise/Reset the 'pressure' and live states tables. + void resetPressureAndLiveStates(); + }; + + /// \brief Helper class to process rendering options. Tries to be as lazy as + /// possible. + class MFRenderingOptions { + public: + + struct RegClassComp { + bool operator()(const TargetRegisterClass *trc1, + const TargetRegisterClass *trc2) const { + std::string trc1Name(trc1->getName()), trc2Name(trc2->getName()); + return std::lexicographical_compare(trc1Name.begin(), trc1Name.end(), + trc2Name.begin(), trc2Name.end()); + } + }; + + typedef std::set RegClassSet; + + struct IntervalComp { + bool operator()(const LiveInterval *li1, const LiveInterval *li2) const { + return li1->reg < li2->reg; + } + }; + + typedef std::set IntervalSet; + + /// Initialise the rendering options. + void setup(MachineFunction *mf, const TargetRegisterInfo *tri, + LiveIntervals *lis); + + /// Clear translations of options to the current function. + void clear(); + + /// Reset any options computed for this specific rendering. + void resetRenderSpecificOptions(); + + /// Should we render the current function. + bool shouldRenderCurrentMachineFunction() const; + + /// Return the set of register classes to render pressure for. + const RegClassSet& regClasses() const; + + /// Return the set of live intervals to render liveness for. + const IntervalSet& intervals() const; + + /// Render indexes which are not associated with instructions / MBB starts. + bool renderEmptyIndexes() const; + + /// Return whether or not to render using SVG for fancy vertical text. + bool fancyVerticals() const; + + private: + + static bool renderingOptionsProcessed; + static std::set mfNamesToRender; + static bool renderAllMFs; + + static std::set classNamesToRender; + static bool renderAllClasses; + + + static std::set > intervalNumsToRender; + typedef enum { ExplicitOnly = 0, + VirtPlusExplicit = 1, + PhysPlusExplicit = 2, + All = 3 } + IntervalTypesToRender; + static unsigned intervalTypesToRender; + + template + static void splitComaSeperatedList(const std::string &s, OutputItr outItr); + + static void processOptions(); + + static void processFuncNames(); + static void processRegClassNames(); + static void processIntervalNumbers(); + + static void processIntervalRange(const std::string &intervalRangeStr); + + MachineFunction *mf; + const TargetRegisterInfo *tri; + LiveIntervals *lis; + + mutable bool regClassesTranslatedToCurrentFunction; + mutable RegClassSet regClassSet; + + mutable bool intervalsTranslatedToCurrentFunction; + mutable IntervalSet intervalSet; + + void translateRegClassNamesToCurrentFunction() const; + + void translateIntervalNumbersToCurrentFunction() const; + }; + + /// \brief Render MachineFunction objects and related information to a HTML + /// page. + class RenderMachineFunction : public MachineFunctionPass { + public: + static char ID; + + RenderMachineFunction() : MachineFunctionPass(&ID) {} + + virtual void getAnalysisUsage(AnalysisUsage &au) const; + + virtual bool runOnMachineFunction(MachineFunction &fn); + + virtual void releaseMemory(); + + /// \brief Render this machine function to HTML. + /// + /// @param renderContextStr This parameter will be included in the top of + /// the html file to explain where (in the + /// codegen pipeline) this function was rendered + /// from. Set it to something like + /// "Pre-register-allocation". + /// @param renderFilePrefix This string will be appended to the function + /// name (before the output file suffix) to enable + /// multiple renderings from the same function. + void renderMachineFunction(const char *renderContextStr, + const char *renderSuffix = 0); + + private: + + std::string fqn; + + MachineFunction *mf; + MachineRegisterInfo *mri; + const TargetRegisterInfo *tri; + LiveIntervals *lis; + SlotIndexes *sis; + + TargetRegisterExtraInfo trei; + MFRenderingOptions ro; + + // ---------- Utility functions ---------- + + void setupRenderingOptions(); + + // ---------- Rendering methods ---------- + + template + std::string escapeChars(Iterator sBegin, Iterator sEnd) const; + + /// \brief Render vertical text. + template + void renderVertical(const std::string &indent, + OStream &os, + const T &t) const; + + /// \brief Insert CSS layout info. + template + void insertCSS(const std::string &indent, + OStream &os) const; + + /// \brief Render a brief summary of the function (including rendering + /// context). + template + void renderFunctionSummary(const std::string &indent, + OStream &os, + const char * const renderContextStr) const; + + /// \brief Render a legend for the pressure table. + template + void renderPressureTableLegend(const std::string &indent, + OStream &os) const; + + /// \brief Render code listing, potentially with register pressure + /// and live intervals shown alongside. + template + void renderCodeTablePlusPI(const std::string &indent, + OStream &os) const; + + /// \brief Render warnings about the machine function, or weird rendering + /// parameter combinations (e.g. rendering specified live intervals + /// over more than one machine function). + template + void renderWarnings(const std::string &indent, + OStream &os) const; + + /// \brief Render the HTML page representing the MachineFunction. + template + void renderFunctionPage(OStream &os, + const char * const renderContextStr) const; + + std::string escapeChars(const std::string &s) const; + + std::string escapeChars(const MachineInstr *mi) const; + + }; +} + +#endif /* LLVM_CODEGEN_RENDERMACHINEFUNCTION_H */ From baldrick at free.fr Mon Jul 19 10:31:08 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Jul 2010 15:31:08 -0000 Subject: [llvm-commits] [llvm] r108699 - in /llvm/trunk: include/llvm-c/Core.h lib/VMCore/Core.cpp Message-ID: <20100719153108.19D742A6C12C@llvm.org> Author: baldrick Date: Mon Jul 19 10:31:07 2010 New Revision: 108699 URL: http://llvm.org/viewvc/llvm-project?rev=108699&view=rev Log: Expose BasicBlock::moveBefore and moveAfter in C API, patch by Benjamin Saunders. Modified: llvm/trunk/include/llvm-c/Core.h llvm/trunk/lib/VMCore/Core.cpp Modified: llvm/trunk/include/llvm-c/Core.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=108699&r1=108698&r2=108699&view=diff ============================================================================== --- llvm/trunk/include/llvm-c/Core.h (original) +++ llvm/trunk/include/llvm-c/Core.h Mon Jul 19 10:31:07 2010 @@ -750,6 +750,9 @@ const char *Name); void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB); +void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos); +void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos); + /* Operations on instructions */ LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst); LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB); Modified: llvm/trunk/lib/VMCore/Core.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Core.cpp?rev=108699&r1=108698&r2=108699&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Core.cpp (original) +++ llvm/trunk/lib/VMCore/Core.cpp Mon Jul 19 10:31:07 2010 @@ -1515,6 +1515,14 @@ unwrap(BBRef)->eraseFromParent(); } +void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) { + unwrap(BB)->moveBefore(unwrap(MovePos)); +} + +void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) { + unwrap(BB)->moveAfter(unwrap(MovePos)); +} + /*--.. Operations on instructions ..........................................--*/ LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) { From benny.kra at googlemail.com Mon Jul 19 10:37:03 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Mon, 19 Jul 2010 15:37:03 -0000 Subject: [llvm-commits] [llvm] r108700 - /llvm/trunk/lib/CodeGen/CMakeLists.txt Message-ID: <20100719153703.E36912A6C12C@llvm.org> Author: d0k Date: Mon Jul 19 10:37:03 2010 New Revision: 108700 URL: http://llvm.org/viewvc/llvm-project?rev=108700&view=rev Log: Update CMake build. Modified: llvm/trunk/lib/CodeGen/CMakeLists.txt Modified: llvm/trunk/lib/CodeGen/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CMakeLists.txt?rev=108700&r1=108699&r2=108700&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/CMakeLists.txt (original) +++ llvm/trunk/lib/CodeGen/CMakeLists.txt Mon Jul 19 10:37:03 2010 @@ -57,6 +57,7 @@ RegAllocPBQP.cpp RegisterCoalescer.cpp RegisterScavenging.cpp + RenderMachineFunction.cpp ScheduleDAG.cpp ScheduleDAGEmit.cpp ScheduleDAGInstrs.cpp From criswell at uiuc.edu Mon Jul 19 10:53:19 2010 From: criswell at uiuc.edu (John Criswell) Date: Mon, 19 Jul 2010 15:53:19 -0000 Subject: [llvm-commits] [poolalloc] r108701 - /poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Message-ID: <20100719155319.EEAC82A6C12C@llvm.org> Author: criswell Date: Mon Jul 19 10:53:19 2010 New Revision: 108701 URL: http://llvm.org/viewvc/llvm-project?rev=108701&view=rev Log: Added comments. No functionality changes. Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/BottomUpClosure.cpp?rev=108701&r1=108700&r2=108701&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/BottomUpClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Mon Jul 19 10:53:19 2010 @@ -63,12 +63,12 @@ << "It is probably broken right now\n"; #endif - //Find SCCs and make SCC call graph + // + // Put the callgraph into canonical form by finding SCCs. + // callgraph.buildSCCs(); callgraph.buildRoots(); - // callgraph.dump(); - // // Merge the DSGraphs of functions belonging to an SCC. // @@ -189,18 +189,25 @@ // Method: postOrder() // // Description: -// I have no idea. +// Process the SCCs of the callgraph in post order. When we process a +// function, we inline the DSGraphs of its callees into the function's own +// DSGraph, thereby doing the "bottom-up" pass that makes BU so famous. // // Inputs: -// F - The function on which to do whatever. +// F - The function in the SCC to process. Note that its children in the +// callgraph will be processed first through a recursive call. // marked - A reference to a set containing all values processed by // previous invocations (this method is recursive). // // Outputs: -// marked - Updated to contain function F. +// marked - A set containing pointers to functions that have already been +// processed. // -DSGraph* BUDataStructures::postOrder(const Function* F, - svset& marked) { +// Return value: +// The DSGraph of the function after it has been processed is returned. +// +DSGraph* +BUDataStructures::postOrder(const Function* F, svset& marked) { // // If we have already processed this function before, do not process it // again. @@ -209,6 +216,15 @@ DSGraph* G = getDSGraph(*F); if (marked.count(F)) return G; + // + // Find the set of callees to process. + // + // For this operation, we do not want to use the call graph. Instead, we + // want to consult the DSGraph and see which call sites have not yet been + // resolved. This is because we may learn about more call sites after doing + // one pass of bottom-up inlining, and so we don't want to reprocess the + // callees that were previously processed in an earlier BU phase. + // for (DSCallGraph::flat_iterator ii = callgraph.flat_callee_begin(F), ee = callgraph.flat_callee_end(F); ii != ee; ++ii) { callgraph.assertSCCRoot(*ii); @@ -232,6 +248,10 @@ // update the call graph using this new information. // G->buildCallGraph(callgraph); + + // + // Return the DSGraph associated with this function. + // return G; } @@ -417,6 +437,9 @@ // TODO: // Why are the strip alloca bit and don't clone call nodes bit set? // + // I believe the answer is on page 6 of the PLDI paper on DSA. The + // idea is that stack objects are invalid if they escape. + // Graph->mergeInGraph(CS, *Callee, *GI, DSGraph::StripAllocaBit|DSGraph::DontCloneCallNodes); ++NumInlines; From bob.wilson at apple.com Mon Jul 19 11:20:16 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 09:20:16 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r108554 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp In-Reply-To: <20100716210032.1BE872A6C12C@llvm.org> References: <20100716210032.1BE872A6C12C@llvm.org> Message-ID: <0AD86F36-DA36-43F9-84EF-FB2DD517C18D@apple.com> Dale, I don't think this is correct, at least for ARM. The 'p' constraint is for a memory address, not the actual memory reference. If I remember correctly, the use of this reported in pr4521 was kind of questionable, and I haven't yet looked in any detail at pr5314 and pr5533. Maybe we can talk about this in person sometime today. On Jul 16, 2010, at 2:00 PM, Dale Johannesen wrote: > Author: johannes > Date: Fri Jul 16 16:00:31 2010 > New Revision: 108554 > > URL: http://llvm.org/viewvc/llvm-project?rev=108554&view=rev > Log: > "p" constraint is a form of "m", not "r". PR 5314. > > > Modified: > llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp > > Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=108554&r1=108553&r2=108554&view=diff > ============================================================================== > --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) > +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Jul 16 16:00:31 2010 > @@ -4429,12 +4429,11 @@ > continue; > } > > - // Translate 'p' to 'r'. This is supposed to check for a valid memory > + // Translate 'p' to 'm'. This is supposed to check for a valid memory > // address, but for inline assembly there is no way to know the mode of > - // the data being addressed. Assume that a general register is always > - // a valid address. > + // the data being addressed. > if (ConstraintChar == 'p') > - ConstraintChar = 'r'; > + ConstraintChar = 'm'; > > // See if this is a regclass constraint. > unsigned RegClass; > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Jul 19 11:27:21 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Jul 2010 09:27:21 -0700 Subject: [llvm-commits] [llvm] r108695 - /llvm/trunk/lib/VMCore/Use.cpp In-Reply-To: <20100719144815.307D52A6C12C@llvm.org> References: <20100719144815.307D52A6C12C@llvm.org> Message-ID: <8DD1B3F5-6B80-497B-8035-3F68583DE082@apple.com> On Jul 19, 2010, at 7:48 AM, Gabor Greif wrote: > Author: ggreif > Date: Mon Jul 19 09:48:15 2010 > New Revision: 108695 > > URL: http://llvm.org/viewvc/llvm-project?rev=108695&view=rev > Log: > precompute 20 tags Hi Gabor, What does this do? -Chris > > Modified: > llvm/trunk/lib/VMCore/Use.cpp > > Modified: llvm/trunk/lib/VMCore/Use.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Use.cpp?rev=108695&r1=108694&r2=108695&view=diff > ============================================================================== > --- llvm/trunk/lib/VMCore/Use.cpp (original) > +++ llvm/trunk/lib/VMCore/Use.cpp Mon Jul 19 09:48:15 2010 > @@ -86,11 +86,17 @@ > //===----------------------------------------------------------------------===// > > Use *Use::initTags(Use * const Start, Use *Stop, ptrdiff_t Done) { > - while (Done < 6) { > + while (Done < 20) { > if (Start == Stop--) > return Start; > - static const PrevPtrTag tags[6] = { fullStopTag, oneDigitTag, stopTag, > - oneDigitTag, oneDigitTag, stopTag }; > + static const PrevPtrTag tags[20] = { fullStopTag, oneDigitTag, stopTag, > + oneDigitTag, oneDigitTag, stopTag, > + zeroDigitTag, oneDigitTag, oneDigitTag, > + stopTag, zeroDigitTag, oneDigitTag, > + zeroDigitTag, oneDigitTag, stopTag, > + oneDigitTag, oneDigitTag, oneDigitTag, > + oneDigitTag, stopTag > + }; > Stop->Prev.setFromOpaqueValue(reinterpret_cast(tags[Done++])); > Stop->Val = 0; > } > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Jul 19 11:31:00 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Jul 2010 09:31:00 -0700 Subject: [llvm-commits] [llvm] r108687 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp In-Reply-To: <20100719080934.7BDF42A6C12D@llvm.org> References: <20100719080934.7BDF42A6C12D@llvm.org> Message-ID: On Jul 19, 2010, at 1:09 AM, Owen Anderson wrote: > Author: resistor > Date: Mon Jul 19 03:09:34 2010 > New Revision: 108687 > > URL: http://llvm.org/viewvc/llvm-project?rev=108687&view=rev > Log: > Reimplement r108639 in InstCombine rather than DAGCombine. Thanks Owen! Please use ->isDoubleTy() instead of comparing to Builder->getDoubleTy(), also you're trying to do "Module* M" stuff again, please use "Module *M". One minor pedantic point is that it might not be safe to propagate the attributes from the call to sqrt to the sqrtf function declaration... you should propagate the attributes from the sqrt function declaration instead. -Chris > > Modified: > llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp > > Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=108687&r1=108686&r2=108687&view=diff > ============================================================================== > --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original) > +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Mon Jul 19 03:09:34 2010 > @@ -1097,6 +1097,32 @@ > break; > } > } > + > + // Fold (fptrunc (sqrt (fpext x))) -> (sqrtf x) > + // NOTE: This should be disabled by -fno-builtin-sqrt if we ever support it. > + CallInst *Call = dyn_cast(CI.getOperand(0)); > + if (Call && Call->getCalledFunction() && > + Call->getCalledFunction()->getName() == "sqrt" && > + Call->getNumArgOperands() == 1) { > + CastInst *Arg = dyn_cast(Call->getArgOperand(0)); > + if (Arg && Arg->getOpcode() == Instruction::FPExt && > + CI.getType() == Builder->getFloatTy() && > + Call->getType() == Builder->getDoubleTy() && > + Arg->getType() == Builder->getDoubleTy() && > + Arg->getOperand(0)->getType() == Builder->getFloatTy()) { > + Module* M = CI.getParent()->getParent()->getParent(); > + Constant* SqrtfFunc = M->getOrInsertFunction("sqrtf", > + Call->getAttributes(), > + Builder->getFloatTy(), > + Builder->getFloatTy(), > + NULL); > + CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0), > + "sqrtfcall"); > + ret->setAttributes(Call->getAttributes()); > + return ret; > + } > + } > + > return 0; > } > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Jul 19 11:31:59 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Jul 2010 09:31:59 -0700 Subject: [llvm-commits] [llvm] r108681 - in /llvm/trunk: lib/Target/X86/AsmParser/X86AsmParser.cpp lib/Target/X86/X86.td test/MC/AsmParser/X86/x86_64-new-encoder.s In-Reply-To: <20100719061454.3853E2A6C12C@llvm.org> References: <20100719061454.3853E2A6C12C@llvm.org> Message-ID: <7F284E51-E4D3-49EC-86E6-1D15CF53CEBD@apple.com> On Jul 18, 2010, at 11:14 PM, Daniel Dunbar wrote: > Author: ddunbar > Date: Mon Jul 19 01:14:54 2010 > New Revision: 108681 > > URL: http://llvm.org/viewvc/llvm-project?rev=108681&view=rev > Log: > MC/X86: We now match instructions like "incl %eax" correctly for the arch we are > assembling; remove crufty custom cleanup code. Woot, awesome! -Chris From stoklund at 2pi.dk Mon Jul 19 11:43:51 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 09:43:51 -0700 Subject: [llvm-commits] [llvm] r108680 - in /llvm/trunk/lib/Target/X86: X86Instr64bit.td X86InstrInfo.td In-Reply-To: <20100719061449.79EF12A6C12D@llvm.org> References: <20100719061449.79EF12A6C12D@llvm.org> Message-ID: On Jul 18, 2010, at 11:14 PM, Daniel Dunbar wrote: > Author: ddunbar > Date: Mon Jul 19 01:14:49 2010 > New Revision: 108680 > > URL: http://llvm.org/viewvc/llvm-project?rev=108680&view=rev > Log: > X86: Mark MOV.*_{TC,NOREX} instruction as code gen only, they aren't real. I don't think the MOV*_TC instructions are used for anything. Evan? The MOV8rr_NOREX instruction is actually emitted when copying 8-bit H registers, so it is not really CodeGenOnly. Do we need a new hack? Or maybe no hack at all? From ggreif at gmail.com Mon Jul 19 11:47:07 2010 From: ggreif at gmail.com (Gabor Greif) Date: Mon, 19 Jul 2010 09:47:07 -0700 (PDT) Subject: [llvm-commits] [llvm] r108695 - /llvm/trunk/lib/VMCore/Use.cpp In-Reply-To: <8DD1B3F5-6B80-497B-8035-3F68583DE082@apple.com> References: <20100719144815.307D52A6C12C@llvm.org> <8DD1B3F5-6B80-497B-8035-3F68583DE082@apple.com> Message-ID: <8372a6af-ab91-4037-b824-6557837ade96@w30g2000yqw.googlegroups.com> On Jul 19, 6:27?pm, Chris Lattner wrote: > On Jul 19, 2010, at 7:48 AM, Gabor Greif wrote: > > > Author: ggreif > > Date: Mon Jul 19 09:48:15 2010 > > New Revision: 108695 > > > URL:http://llvm.org/viewvc/llvm-project?rev=108695&view=rev > > Log: > > precompute 20 tags > > Hi Gabor, > > What does this do? It does fill the "waymarks" into the Use array according to this description: . These are needed to find the User's 'this' pointer. Previously we have dynamically computed the waymarks for all Use objects, now we quickly fetch the marks for up to 20 Use objects, and then we fall back to the old algo to fill in the rest (by computing the marks dynamically). My benchmarks show a 0.5% speedup on "opt 403.gcc.bc -std-compile-opts -disable-output" when going to 0 -> 20 precomputed tags. I did not measure pure .bc- loading where the effect is probably much more prominent. Cheers, Gabor > > -Chris > > > > > > > Modified: > > ? ?llvm/trunk/lib/VMCore/Use.cpp > > > Modified: llvm/trunk/lib/VMCore/Use.cpp > > URL:http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Use.cpp?rev... > > ============================================================================== > > --- llvm/trunk/lib/VMCore/Use.cpp (original) > > +++ llvm/trunk/lib/VMCore/Use.cpp Mon Jul 19 09:48:15 2010 > > @@ -86,11 +86,17 @@ > > //===----------------------------------------------------------------------===// > > > Use *Use::initTags(Use * const Start, Use *Stop, ptrdiff_t Done) { > > - ?while (Done < 6) { > > + ?while (Done < 20) { > > ? ? if (Start == Stop--) > > ? ? ? return Start; > > - ? ?static const PrevPtrTag tags[6] = { fullStopTag, oneDigitTag, stopTag, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?oneDigitTag, oneDigitTag, stopTag }; > > + ? ?static const PrevPtrTag tags[20] = { fullStopTag, oneDigitTag, stopTag, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? oneDigitTag, oneDigitTag, stopTag, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? zeroDigitTag, oneDigitTag, oneDigitTag, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? stopTag, zeroDigitTag, oneDigitTag, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? zeroDigitTag, oneDigitTag, stopTag, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? oneDigitTag, oneDigitTag, oneDigitTag, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? oneDigitTag, stopTag > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }; > > ? ? Stop->Prev.setFromOpaqueValue(reinterpret_cast(tags[Done++])); > > ? ? Stop->Val = 0; > > ? } > > > _______________________________________________ > > llvm-commits mailing list > > llvm-comm... at cs.uiuc.edu > >http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-comm... at cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From bob.wilson at apple.com Mon Jul 19 12:01:57 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 17:01:57 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108709 - /llvm-gcc-4.2/trunk/GNUmakefile Message-ID: <20100719170157.F1AB02A6C12C@llvm.org> Author: bwilson Date: Mon Jul 19 12:01:57 2010 New Revision: 108709 URL: http://llvm.org/viewvc/llvm-project?rev=108709&view=rev Log: Update llvm-gcc's build to match llvm svn r108382. Modified: llvm-gcc-4.2/trunk/GNUmakefile Modified: llvm-gcc-4.2/trunk/GNUmakefile URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/GNUmakefile?rev=108709&r1=108708&r2=108709&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/GNUmakefile (original) +++ llvm-gcc-4.2/trunk/GNUmakefile Mon Jul 19 12:01:57 2010 @@ -101,9 +101,8 @@ exit 1; \ fi cd $(OBJROOT) && \ - DEVELOPER_DIR=Developer \ $(SRC)/llvmCore/utils/buildit/build_llvm "$(RC_ARCHS)" "$(TARGETS)" \ - $(SRC)/llvmCore /usr/local $(DSTROOT) $(SYMROOT) \ + $(SRC)/llvmCore /Developer/usr/local $(DSTROOT) $(SYMROOT) \ $(ENABLE_ASSERTIONS) $(LLVM_OPTIMIZED) $(INSTALL_LIBLTO) \ $(ARM_HOSTED_BUILD) \ $(RC_ProjectSourceVersion) $(RC_ProjectSourceSubversion) From wdietz2 at illinois.edu Mon Jul 19 12:05:12 2010 From: wdietz2 at illinois.edu (Will Dietz) Date: Mon, 19 Jul 2010 17:05:12 -0000 Subject: [llvm-commits] [poolalloc] r108710 - /poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Message-ID: <20100719170512.AAE1A2A6C12C@llvm.org> Author: wdietz2 Date: Mon Jul 19 12:05:12 2010 New Revision: 108710 URL: http://llvm.org/viewvc/llvm-project?rev=108710&view=rev Log: Added test that triggers the SCC Leader failing assertion. This is bug #7630. Added: poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Added: poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll?rev=108710&view=auto ============================================================================== --- poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll (added) +++ poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Mon Jul 19 12:05:12 2010 @@ -0,0 +1,3553 @@ +;RUN: dsaopt %s -dsa-eq -disable-output +; ModuleID = 'bugpoint-reduced-simplified.bc' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-unknown-linux-gnu" + +%0 = type { %struct._IO_FILE*, %struct._IO_FILE*, [8192 x i8] } +%struct.TypCollectors = type { i8*, void (%struct.TypHeader*, i64)*, i32 (i64*, %struct.TypHeader*)* } +%struct.TypHeader = type { i64, %struct.TypHeader**, [3 x i8], i8 } +%struct.TypInputFile = type { i64, [64 x i8], [256 x i8], i8*, i64 } +%struct.TypOutputFile = type { i64, [256 x i8], i64, i64, i64, i64 } +%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] } +%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } +%struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } +%struct.__sigset_t = type { [16 x i64] } +%struct.anon = type { i64, i64, [4 x i8] } +%struct.termio = type { i16, i16, i16, i16, i8, [8 x i8] } +%struct.tms = type { i64, i64, i64, i64 } + + at Collectors = external constant [6 x %struct.TypCollectors], align 32 ; <[6 x %struct.TypCollectors]*> [#uses=0] + at CSeries = external global i64* ; [#uses=0] + at Class = external global i16 ; [#uses=0] + at CWeights = external global i64* ; [#uses=0] + at ug = external global i16 ; [#uses=0] + at cg = external global i16 ; [#uses=0] + at g = external global i64* ; [#uses=0] + at ce = external global i64 ; [#uses=0] + at Commutators = external global %struct.TypHeader** ; <%struct.TypHeader***> [#uses=0] + at GenStk = external global i16* ; [#uses=0] + at ExpStk = external global i64* ; [#uses=0] + at StrStk = external global i16** ; [#uses=0] + at Sp = external global i64 ; [#uses=0] + at StkDim = external global i64 ; [#uses=0] + at ue = external global i64 ; [#uses=0] + at LastClass = external global i16 ; [#uses=0] + at Powers = external global %struct.TypHeader** ; <%struct.TypHeader***> [#uses=0] + at NrGens = external global i64 ; [#uses=0] + at Prime = external global i64 ; [#uses=0] + at HdRnAvec = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str1 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str2 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str3 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str4 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str5 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str6 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str7 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str8 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str9 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str10 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str11 = external constant [62 x i8], align 8 ; <[62 x i8]*> [#uses=0] + at .str12 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at HdCallOop2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallOop1 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str13 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str14 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str15 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str16 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str17 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str18 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str19 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str20 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str21 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str22 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str23 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str24 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str25 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str26 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str27 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str28 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str29 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str30 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str31 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str32 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str33 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str34 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str35 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str36 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str37 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str38 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str39 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str40 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str41 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str42 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str43 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str44 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str45 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str46 = external constant [53 x i8], align 8 ; <[53 x i8]*> [#uses=0] + at .str47 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str48 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str49 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str50 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str51 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str52 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str53 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str54 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str55 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str56 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str57 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] + at .str58 = external constant [60 x i8], align 8 ; <[60 x i8]*> [#uses=0] + at .str59 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str60 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str61 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str62 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str63 = external constant [57 x i8], align 8 ; <[57 x i8]*> [#uses=0] + at .str64 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str65 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str166 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at HdRnSumAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str267 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at HdRnDifferenceAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str368 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at HdRnDepth = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str469 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at HdRnTailDepth = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str570 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at HdRnCentralWeight = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str671 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdRnLeadingExponent = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str772 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at HdRnReducedAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str873 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at HdRnRelativeOrder = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str974 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at HdRnExponentAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str1075 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdRnExponentsAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str1176 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at HdRnInformationAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str1277 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at HdRnIsCompatibleAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str1378 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at HdRnNormalizeIgs = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str1479 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at HdRnIsAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str1580 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str1681 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str1782 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str1883 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str1984 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str2085 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str2186 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str2287 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str2388 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str2489 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str2590 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str2691 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at HdCPL = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCPC = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCPS = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str2794 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str2895 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str2996 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str3097 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str3198 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str3299 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str33100 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str34101 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str35102 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str36103 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str37104 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str38105 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str39106 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str40107 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str41108 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at RepTimes = external global i64 ; [#uses=0] + at .str42109 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str43110 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str44111 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str45112 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at CallsProdAg = external global i64 ; [#uses=0] + at TimeProdAg = external global i64 ; [#uses=0] + at .str46113 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str47114 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at CallsQuoAg = external global i64 ; [#uses=0] + at TimeQuoAg = external global i64 ; [#uses=0] + at .str48115 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsPowAgI = external global i64 ; [#uses=0] + at TimePowAgI = external global i64 ; [#uses=0] + at .str49116 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsPowAgAg = external global i64 ; [#uses=0] + at TimePowAgAg = external global i64 ; [#uses=0] + at .str50117 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsModAg = external global i64 ; [#uses=0] + at TimeModAg = external global i64 ; [#uses=0] + at .str51118 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsCommAg = external global i64 ; [#uses=0] + at TimeCommAg = external global i64 ; [#uses=0] + at .str52119 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsLtAg = external global i64 ; [#uses=0] + at TimeLtAg = external global i64 ; [#uses=0] + at .str53120 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsEqAg = external global i64 ; [#uses=0] + at TimeEqAg = external global i64 ; [#uses=0] + at .str54121 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsSumAg = external global i64 ; [#uses=0] + at TimeSumAg = external global i64 ; [#uses=0] + at .str55122 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at CallsDiffAg = external global i64 ; [#uses=0] + at TimeDiffAg = external global i64 ; [#uses=0] + at .str56123 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str57124 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str58125 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str59126 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str60127 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str61128 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str62129 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str63130 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str64131 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str65132 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str66 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str67 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str68 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str69 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str70 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at CPP.b = external global i1 ; [#uses=0] + at .str71 = external constant [1 x i8], align 1 ; <[1 x i8]*> [#uses=0] + at .str72 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at CPN = external global i64 ; [#uses=0] + at .str73 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str74 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str75 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str76 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str77 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str78 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str79 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str80 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str81 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str82 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str83 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str84 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str87 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str89 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str91 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str93 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str94 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str95 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str96 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str97 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str98 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str99 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str100 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str101 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str102 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str103 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str104 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str105 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str106 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str107 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str108 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str109 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str110 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str111 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] + at .str113 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str114 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str115 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str116 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str117 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str118 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str119 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str120 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str121 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str122 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str123 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str124 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str125 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str137 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str1138 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str2139 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str3140 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str4141 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str5142 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str6143 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str7144 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str8145 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str9146 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str10147 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str11148 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str12149 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str13150 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str14151 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str15152 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str16153 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str17154 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str18155 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str19156 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str20157 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str21158 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str22159 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str23160 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str24161 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str25162 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str26163 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str27164 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str28165 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str29166 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str30167 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str31168 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str32169 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str33170 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str34171 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str35172 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str36173 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str37174 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str38175 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str39176 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str40177 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str41178 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str179 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str1180 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str2181 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str3182 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str4183 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str5184 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str6185 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str7186 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str8187 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str9188 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str10189 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str11190 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str12191 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str13192 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str14193 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str15194 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str16195 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str17196 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str18197 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str19198 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] + at .str20199 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str21200 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str22201 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str23202 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str24203 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str25204 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str26205 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str27206 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str28207 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at hdTable = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at treeType = external global i64 ; [#uses=0] + at hdWordValue = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at hdTree2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at treeWordLength = external global i64 ; [#uses=0] + at wordList = external global [1024 x i64], align 32 ; <[1024 x i64]*> [#uses=0] + at hdTabl2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str208 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str1209 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str2210 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str3211 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str4212 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str5213 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str6214 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str7215 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str8216 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str9217 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str10218 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str11219 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str12220 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str13221 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str14222 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str15223 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str16224 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at hdExponent = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at hdTree1 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at hdTree = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str17225 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str18226 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str19227 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str20228 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str21229 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str22230 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str23231 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str24232 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str25233 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str26234 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str27235 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str28236 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str29237 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at hdRel = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str30238 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at hdNums = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str31239 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str32240 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str33241 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str34242 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at dedlst = external global i64 ; [#uses=0] + at .str35243 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at dedfst = external global i64 ; [#uses=0] + at dedgen = external global [40960 x i64], align 32 ; <[40960 x i64]*> [#uses=0] + at dedcos = external global [40960 x i64], align 32 ; <[40960 x i64]*> [#uses=0] + at dedprint.b = external global i1 ; [#uses=0] + at .str36244 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at hdNext = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at hdPrev = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at lastDef = external global i64 ; [#uses=0] + at firstDef = external global i64 ; [#uses=0] + at hdFact = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at firstFree = external global i64 ; [#uses=0] + at lastFree = external global i64 ; [#uses=0] + at nrdel = external global i64 ; [#uses=0] + at .str37245 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str38246 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at lastN.4480 = external global i64 ; [#uses=0] + at phi.4481 = external global i64 ; [#uses=0] + at isSqfree.4482.b = external global i1 ; [#uses=0] + at nrp.4483 = external global i64 ; [#uses=0] + at HdResult = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at CycLastE = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str247 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str1248 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str2249 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str3250 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str4251 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=1] + at .str5252 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str6253 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str7254 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str8255 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str9256 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str10257 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str11258 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str12259 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str13260 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str14261 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str15262 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str16263 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str17264 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str18265 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str19266 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at CycLastN = external global i64 ; [#uses=0] + at .str20267 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str21268 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str22269 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str23270 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str24271 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str25272 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str26273 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str27274 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str28275 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str29276 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str30277 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str31278 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at EvTab = external global [81 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ; <[81 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] + at TabSum = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabDiff = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabProd = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabQuo = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabMod = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabPow = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at HdTrue = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdFalse = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at TabEq = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabLt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at PrTab = external global [81 x void (%struct.TypHeader*)*], align 32 ; <[81 x void (%struct.TypHeader*)*]*> [#uses=0] + at .str292 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at TabComm = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at .str1294 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str2295 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at HdVoid = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str3297 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str4298 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str5299 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str6300 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str7301 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str8302 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=1] + at .str9303 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str10304 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at HdTildePr = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str11305 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str12306 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str13307 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str14308 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str15309 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str16310 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str17311 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str18312 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str19313 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str20314 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str21315 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] + at .str22316 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str23317 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str24318 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str25319 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str26320 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str27321 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str28322 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str29323 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str30324 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str31325 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str32326 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str33327 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str34328 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str35329 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str36330 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str37331 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str38332 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str40334 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str41335 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str42336 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str43337 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str44338 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str45339 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str46340 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str47341 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str48342 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str49343 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str50344 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str51345 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str52346 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str53347 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str54348 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str55349 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str56350 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str57351 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str58352 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str59353 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str60354 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at prPrec = external global i64 ; [#uses=0] + at .str61355 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str62356 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str63357 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str64358 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str65359 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str66360 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str67361 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str68362 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str69363 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str70364 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str71365 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str72366 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str73367 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str74368 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str75369 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str76370 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str77371 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str78372 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str79373 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str81375 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str82376 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str83377 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str84378 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str85379 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str86380 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str87381 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str88382 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str89383 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str90384 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str91385 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str92386 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str93387 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str94388 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at HdReturn = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at Pols = external constant [186 x i64], align 32 ; <[186 x i64]*> [#uses=0] + at HdFields = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdIntFFEs = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str396 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str1397 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str2398 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str3399 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str4400 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str5401 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str6402 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str7403 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str8404 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str9405 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str10406 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str11407 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str12408 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str13409 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at HdLastIntFFE = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str14410 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str15411 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str16412 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str17413 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str18414 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str19415 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str20416 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str21417 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str22418 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] + at .str23419 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str24420 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str25421 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] + at .str26422 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at .str27423 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] + at .str28424 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at .str29425 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] + at .str30426 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at .str31427 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] + at .str32428 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at HdExec = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str431 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str1432 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str2433 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str3434 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at HdTimes = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str4435 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str5436 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str8439 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str11442 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str12443 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str13444 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str14445 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str15446 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at prFull.b = external global i1 ; [#uses=0] + at .str16447 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str18449 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str19450 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str20451 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str22453 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str23454 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str24455 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str25456 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str26457 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str27458 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str28459 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str29460 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at IsProfiling = external global i64 ; [#uses=0] + at .str30461 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str31462 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str32463 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str33464 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at Timesum = external global i64 ; [#uses=0] + at .str34465 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str35466 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str36467 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str37468 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str39470 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str40471 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str42473 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str43474 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str477 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str1478 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str2479 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str3480 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str4481 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str5482 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str7484 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str8485 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at HdLast = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at ErrRet = external global [1 x %struct.__jmp_buf_tag], align 32 ; <[1 x %struct.__jmp_buf_tag]*> [#uses=0] + at .str9486 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str10487 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at HdLast2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str11488 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at HdLast3 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str12489 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at HdTime = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str13490 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str14491 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str15492 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str16493 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str17494 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str18495 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str19496 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str20497 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str21498 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str22499 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str23500 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str24501 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str25502 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str26503 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str27504 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str28505 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str29506 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str30507 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str31508 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str32509 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str33510 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str34511 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str35512 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str36513 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str37514 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str38515 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str39516 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str40517 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str41518 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str42519 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str43520 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str44521 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str45522 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str46523 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str47524 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str48525 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str49526 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str50527 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str51528 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str52529 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str53530 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str54531 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at .str55532 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] + at .str56533 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str57534 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str58535 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str59536 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str60537 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str61538 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str62539 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str63540 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str64541 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str65542 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str66543 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str67544 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str68545 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str69546 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str70547 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str71548 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str72549 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str73550 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str74551 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str75552 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str76553 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str77554 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str78555 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str79556 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str80557 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str81558 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str82559 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str83560 = external constant [54 x i8], align 8 ; <[54 x i8]*> [#uses=0] + at .str84561 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str85562 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str86563 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str87564 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str88565 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str89566 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str90567 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str91568 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str93570 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] + at .str94571 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str95572 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str96573 = external constant [54 x i8], align 8 ; <[54 x i8]*> [#uses=0] + at .str97574 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str98575 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str99576 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str100577 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str101578 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str102579 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str103580 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str104581 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str105582 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str106583 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str107584 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str108585 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str109586 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str110587 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str111588 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str112589 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str113590 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str114591 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str115592 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str116593 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str117594 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str118595 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str119596 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str120597 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str121598 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str122599 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str124601 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str125602 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str126 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str127 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str128 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at NameType = external constant [81 x i8*], align 32 ; <[81 x i8*]*> [#uses=0] + at Size = external global [81 x %struct.anon], align 32 ; <[81 x %struct.anon]*> [#uses=0] + at HdNewHandles = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at NrNewHandles = external global i64 ; [#uses=0] + at s.3831 = external global [7 x i8] ; <[7 x i8]*> [#uses=0] + at HdFree = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str605 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] + at FreeHandle = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at NrFreeHandles = external global i64 ; [#uses=0] + at FirstBag = external global %struct.TypHeader** ; <%struct.TypHeader***> [#uses=0] + at HdResize = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at IsResizeCall.b = external global i1 ; [#uses=0] + at .str1606 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str2607 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str3608 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str4609 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str5610 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str6611 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str7612 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str8613 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str9614 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str10615 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str11616 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at lastType = external global i64 ; [#uses=0] + at lastSize = external global i64 ; [#uses=0] + at .str12617 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str13618 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str14619 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str15620 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str16621 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str17622 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str18623 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str19624 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str20625 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str21626 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str22627 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str23628 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str24629 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str25630 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str26631 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str28633 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str29634 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str30635 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str31636 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str32637 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str33638 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str34639 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str35640 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str36641 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str37642 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str38643 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str39644 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str40645 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str41646 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str42647 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str43648 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str44649 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str45650 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str46651 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str47652 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str54659 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str65670 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str66671 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str67672 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str68673 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str69674 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str70675 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str71676 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str72677 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str73678 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str74679 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str75680 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str76681 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str77682 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str78683 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str79684 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str80685 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str81686 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str82687 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str83688 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str84689 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str85690 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str86691 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str87692 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at GasmanStatAlive = external constant [81 x i64], align 32 ; <[81 x i64]*> [#uses=0] + at GasmanStatTotal = external global [81 x i64], align 32 ; <[81 x i64]*> [#uses=0] + at GasmanStatTSize = external global [81 x i64], align 32 ; <[81 x i64]*> [#uses=0] + at HdStack = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at TopStack = external global i64 ; [#uses=0] + at HdIdenttab = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=1] + at HdRectab = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at NrRectab = external global i64 ; [#uses=0] + at IsUndefinedGlobal.b = external global i1 ; [#uses=0] + at NrIdenttab = external global i64 ; [#uses=0] + at .str710 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str1711 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str2712 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str3713 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str4714 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str5715 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str6716 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str7717 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str8718 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str9719 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str10720 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str11721 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str12722 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at PrIntC = external global [1000 x i16], align 32 ; <[1000 x i16]*> [#uses=0] + at PrIntD = external global [1205 x i16], align 32 ; <[1205 x i16]*> [#uses=0] + at .str15725 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str16726 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str18728 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at TabIsList = external global [28 x i64], align 32 ; <[28 x i64]*> [#uses=0] + at TabPlainList = external global [28 x void (%struct.TypHeader*)*], align 32 ; <[28 x void (%struct.TypHeader*)*]*> [#uses=0] + at TabIsXTypeList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ; <[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] + at TabLenList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ; <[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] + at TabElmlList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] + at TabElmrList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] + at TabElmList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] + at TabElmfList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] + at TabElmsList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]*> [#uses=0] + at TabAssList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64, %struct.TypHeader*)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64, %struct.TypHeader*)*]*> [#uses=0] + at TabAsssList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]*> [#uses=0] + at TabPosList = external global [28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64)*], align 32 ; <[28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64)*]*> [#uses=0] + at TabIsDenseList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ; <[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] + at TabIsPossList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ; <[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] + at TabDepthVector = external global [28 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] + at .str748 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str1749 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str2750 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str3751 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str4752 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str5753 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str6754 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str7755 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str8756 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str9757 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str10758 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str11759 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str12760 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str13761 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str14762 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str15763 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str16764 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str17765 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str18766 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str19767 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str20768 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str21769 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str22770 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str23771 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str24772 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str25773 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str26774 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str27775 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str28776 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str29777 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str30778 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str31779 = external constant [66 x i8], align 8 ; <[66 x i8]*> [#uses=0] + at .str32780 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str33781 = external constant [62 x i8], align 8 ; <[62 x i8]*> [#uses=0] + at .str34782 = external constant [72 x i8], align 8 ; <[72 x i8]*> [#uses=0] + at .str35783 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str36784 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str37785 = external constant [63 x i8], align 8 ; <[63 x i8]*> [#uses=0] + at .str38786 = external constant [65 x i8], align 8 ; <[65 x i8]*> [#uses=0] + at .str39787 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str40788 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str41789 = external constant [61 x i8], align 8 ; <[61 x i8]*> [#uses=0] + at .str42790 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] + at .str43791 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str44792 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str45793 = external constant [69 x i8], align 8 ; <[69 x i8]*> [#uses=0] + at .str46794 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str47795 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at .str49797 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str50798 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str51799 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str52800 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str53801 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str54802 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str55803 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str56804 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str57805 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str58806 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str59807 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str60808 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str61809 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str62810 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str63811 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str64812 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str68816 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str69817 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str70818 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str71819 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str72820 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str73821 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str74822 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str75823 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str76824 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str77825 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str78826 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str832 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str1833 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str2834 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str3835 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str4836 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str5837 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str6838 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str7839 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str8840 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str9841 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str10842 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str11843 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str12844 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str13845 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str14846 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str15847 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str16848 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str17849 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str18850 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str19851 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str20852 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str21853 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str22854 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str23855 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str24856 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str25857 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str26858 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str27859 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str28860 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str29861 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str30862 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str31863 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str32864 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str33865 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str34866 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str35867 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str36868 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str37869 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str38870 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str39871 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str40872 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str41873 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str42874 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str43875 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str44876 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str45877 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str46878 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str47879 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str48880 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str49881 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str50882 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str51883 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str52884 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str53885 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str54886 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str55887 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str56888 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str57889 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str58890 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str59891 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str60892 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str61893 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str62894 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str63895 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str64896 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str65897 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str66898 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str67899 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str68900 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str69901 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str70902 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str71903 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str72904 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str73905 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str74906 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str75907 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str76908 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str77909 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str78910 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str79911 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str80912 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str81913 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str82914 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str83915 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str84916 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str85917 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str86918 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str87919 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str88920 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str89921 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str92924 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str93925 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str94926 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str95927 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str96928 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str97929 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str98930 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str99931 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str100932 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str934 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str1935 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str2936 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str3937 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str4938 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str5939 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str6940 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str7941 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at HdPerm = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str8942 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str9943 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str10944 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str11945 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str12946 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str13947 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str14948 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str15949 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str16950 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] + at .str17951 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str18952 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str19953 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str20954 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str21955 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str22956 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str23957 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str24958 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str25959 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str26960 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str27961 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str28962 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str29963 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str30964 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at .str31965 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str32966 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str33967 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str34968 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str35969 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str36970 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str37971 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str38972 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str39973 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str40974 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str41975 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str42976 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str44978 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str45979 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str48982 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str6992 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at TabNormalizeCoeffs = external global [28 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] + at TabShrinkCoeffs = external global [28 x void (%struct.TypHeader*)*], align 32 ; <[28 x void (%struct.TypHeader*)*]*> [#uses=0] + at TabShiftedCoeffs = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] + at TabAddCoeffs = external global [28 x [28 x void (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x void (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabMultiplyCoeffs = external global [28 x [28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*, i64)*]], align 32 ; <[28 x [28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*, i64)*]]*> [#uses=0] + at TabProductCoeffs = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabProductCoeffsMod = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabReduceCoeffs = external global [28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64)*]], align 32 ; <[28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64)*]]*> [#uses=0] + at TabReduceCoeffsMod = external global [28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*)*]]*> [#uses=0] + at TabPowerModCoeffsInt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at TabPowerModCoeffsLInt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] + at .str995 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str1996 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str2997 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str3998 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str4999 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str51000 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str61001 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str71002 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str81003 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str91004 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str101005 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str111006 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str121007 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str131008 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str141009 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str151010 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str161011 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str171012 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str181013 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str191014 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str201015 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str211016 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str221017 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str231018 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str241019 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str251020 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str261021 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str271022 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str281023 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str1025 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str21027 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str31028 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str41029 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str51030 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str61031 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str81033 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str111036 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str121037 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str131038 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str141039 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str151040 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str1044 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str11045 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str21046 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str31047 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str41048 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str51049 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str61050 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str71051 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str81052 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str101054 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str121056 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str131057 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str11060 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at HdCurLHS = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str21061 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str31062 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str41063 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str61065 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str71066 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str81067 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str91068 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str101069 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str131072 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str141073 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str151074 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str161075 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str171076 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str181077 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str241083 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str251084 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str271086 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str281087 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at HdRnOp = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnEq = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallEq = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdStrEq = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdTilde = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str11093 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at HdRnSum = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallSum = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str31096 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdStrSum = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnDiff = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallDiff = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str51099 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdStrDiff = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnProd = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallProd = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str71102 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdStrProd = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnQuo = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallQuo = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str91105 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdStrQuo = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnMod = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallMod = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str111108 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at HdStrMod = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnPow = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallPow = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str131111 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdStrPow = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnComm = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallComm = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str151114 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at HdStrComm = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str171116 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdRnLt = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallLt = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str191119 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdStrLt = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnIn = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallIn = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str211122 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at HdStrIn = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdRnPrint = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdCallPrint = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str231125 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at HdStrPrint = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str241126 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str251127 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str261128 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str271129 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str281130 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str291131 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str301132 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str311133 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str321134 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str331135 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str341136 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str351137 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str361138 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str371139 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str421144 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str661168 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str671169 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str681170 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str691171 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str711173 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str721174 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str731175 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str741176 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str761178 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str771179 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str781180 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str791181 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at Logfile = external global i64 ; [#uses=0] + at Input = external global %struct.TypInputFile* ; <%struct.TypInputFile**> [#uses=0] + at TestInput = external global i64 ; [#uses=0] + at In = external global i8* ; [#uses=0] + at Symbol = external global i64 ; [#uses=0] + at TestOutput = external global i64 ; [#uses=0] + at TestLine = external global [256 x i8], align 32 ; <[256 x i8]*> [#uses=0] + at InputLogfile = external global i64 ; [#uses=0] + at InputFiles = external global [16 x %struct.TypInputFile], align 32 ; <[16 x %struct.TypInputFile]*> [#uses=0] + at .str1187 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at Output = external global %struct.TypOutputFile* ; <%struct.TypOutputFile**> [#uses=0] + at OutputFiles = external global [16 x %struct.TypOutputFile], align 32 ; <[16 x %struct.TypOutputFile]*> [#uses=0] + at .str21189 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str41191 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str51192 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str61193 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str71194 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at NrError = external global i64 ; [#uses=0] + at NrErrLine = external global i64 ; [#uses=0] + at .str91198 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str101199 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str131202 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str141203 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str151204 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at Prompt = external global i8* ; [#uses=0] + at .str161206 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at Value = external global [1024 x i8], align 32 ; <[1024 x i8]*> [#uses=0] + at .str171208 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str181209 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str191210 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str201211 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str211212 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str431234 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str1250 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str11251 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str21252 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str31253 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str41254 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str51255 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str61256 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str71257 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str81258 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at HdUnion = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str111261 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str121262 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str131263 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str141264 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str151265 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str161266 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str171267 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str181268 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str191269 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str201270 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str211271 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str221272 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str231273 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str241274 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str251275 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str261276 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str271277 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str281278 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str291279 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str301280 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str311281 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str321282 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str331283 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str341284 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str351285 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at StrStat = external global i8* ; [#uses=0] + at HdStat = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str11292 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str21293 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str41295 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str51296 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str61297 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str71298 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str81299 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] + at .str91300 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str101301 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str111302 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str131304 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str151306 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str161307 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str171308 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str181309 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str191310 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str201311 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str211312 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str221313 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str231314 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str241315 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] + at .str251316 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str281319 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str291320 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at HdChars = external global [256 x %struct.TypHeader*], align 32 ; <[256 x %struct.TypHeader*]*> [#uses=0] + at .str1322 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str31326 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str41327 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str61329 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str71330 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str81331 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str91332 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str101333 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str111334 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str121335 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str131336 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str151338 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str161339 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str171340 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str181341 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str191342 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str201343 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str211344 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str221345 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at SyFlags = external global [13 x i8] ; <[13 x i8]*> [#uses=0] + at syLastIntr = external global i64 ; [#uses=0] + at syWorkspace = external global i8* ; [#uses=0] + at stderr = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=0] + at .str1350 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at syStartTime = external global i64 ; [#uses=0] + at .str11351 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] + at syBuf = external global [16 x %0], align 32 ; <[16 x %0]*> [#uses=0] + at syWindow.b = external global i1 ; [#uses=0] + at syOld = external global %struct.termio, align 16 ; <%struct.termio*> [#uses=0] + at .str21352 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at syFid = external global i64 ; [#uses=0] + at .str31353 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] + at .str41354 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str51355 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at stdin = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=0] + at stdout = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=0] + at .str121362 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str131363 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at SyBanner = external global i64 ; [#uses=0] + at SyGasman = external global i64 ; [#uses=0] + at .str141366 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at SyLibname = external global [256 x i8], align 32 ; <[256 x i8]*> [#uses=0] + at .str161369 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at SyHelpname = external global [256 x i8], align 32 ; <[256 x i8]*> [#uses=0] + at .str171370 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at SyMemory = external global i64 ; [#uses=0] + at .str181372 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at syLineEdit = external global i64 ; [#uses=0] + at SyQuiet = external global i64 ; [#uses=0] + at .str191374 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at SyNrCols = external global i64 ; [#uses=0] + at .str201376 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at SyNrRows = external global i64 ; [#uses=0] + at syCTRD = external global i64 ; [#uses=0] + at .str211378 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str231380 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str241381 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at SyInitfiles = external global [16 x [256 x i8]], align 32 ; <[16 x [256 x i8]]*> [#uses=0] + at .str251383 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str261384 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str271385 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str281386 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str291387 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str301388 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str311389 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str321390 = external constant [56 x i8], align 8 ; <[56 x i8]*> [#uses=0] + at .str331391 = external constant [53 x i8], align 8 ; <[53 x i8]*> [#uses=0] + at .str341392 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str351393 = external constant [54 x i8], align 8 ; <[54 x i8]*> [#uses=0] + at .str361394 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str371395 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str381396 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str391397 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at WinCmdBuffer = external global [8000 x i8], align 32 ; <[8000 x i8]*> [#uses=0] + at .str401398 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at syNrchar = external global i64 ; [#uses=0] + at syPrompt = external global [256 x i8], align 32 ; <[256 x i8]*> [#uses=0] + at .str411399 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str421400 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str431401 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str441402 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str451403 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at syNew = external global %struct.termio, align 16 ; <%struct.termio*> [#uses=0] + at syStopTime = external global i64 ; [#uses=0] + at syHistory = external global [8192 x i8], align 32 ; <[8192 x i8]*> [#uses=0] + at syCTRO = external global i32 ; [#uses=0] + at yank.3948 = external global [512 x i8], align 32 ; <[512 x i8]*> [#uses=0] + at syHi = external global i8* ; [#uses=0] + at .str461404 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str471405 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str491407 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str501408 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str511409 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str521410 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at syLastIndex = external global i16 ; [#uses=0] + at syLastTopics = external global [16 x [64 x i8]], align 32 ; <[16 x [64 x i8]]*> [#uses=0] + at .str551413 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str561414 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str571415 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str581416 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str591417 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str601418 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str611419 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] + at .str621420 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str631421 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + at .str641422 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str651423 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str661424 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str671425 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str681426 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str691427 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str701428 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str711429 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str721430 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str731431 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str741432 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str751433 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str761434 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str771435 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str781436 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str791437 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str801438 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] + at .str811439 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str821440 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str831441 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str841442 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str851443 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str861444 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str871445 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] + at .str881446 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str891447 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str901448 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str911449 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str921450 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str931451 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str941452 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str951453 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str961454 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str971455 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str981456 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str991457 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str1001458 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str1011459 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str1021460 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str1031461 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] + at .str1041462 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str1051463 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str1061464 = external constant [67 x i8], align 8 ; <[67 x i8]*> [#uses=0] + at .str1071465 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str1081466 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str1111469 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str1121470 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str1131471 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str1141472 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str1151473 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at syChapnames = external global [128 x [16 x i8]], align 32 ; <[128 x [16 x i8]]*> [#uses=0] + at .str1161474 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str1171475 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str1181476 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str1191477 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] + at .str1201478 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str1211479 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str1221480 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str1231481 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str1241482 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] + at .str1251483 = external constant [71 x i8], align 8 ; <[71 x i8]*> [#uses=0] + at .str1261484 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str1271485 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str1281486 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str129 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str130 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] + at .str131 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] + at .str132 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str1504 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str11505 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str21506 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str31507 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at .str41508 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str51509 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str61510 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] + at .str71511 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str81512 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str91513 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str101514 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str111515 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str121516 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str131517 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str141518 = external constant [62 x i8], align 8 ; <[62 x i8]*> [#uses=0] + at .str151519 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str161520 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str171521 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str181522 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str191523 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str201524 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str211525 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str221526 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str231527 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str241528 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str251529 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str261530 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str271531 = external constant [63 x i8], align 8 ; <[63 x i8]*> [#uses=0] + at .str281532 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str291533 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str301534 = external constant [57 x i8], align 8 ; <[57 x i8]*> [#uses=0] + at .str311535 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str321536 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str331537 = external constant [54 x i8], align 8 ; <[54 x i8]*> [#uses=0] + at .str341538 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str351539 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str361540 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str371541 = external constant [63 x i8], align 8 ; <[63 x i8]*> [#uses=0] + at .str381542 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str391543 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str401544 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str411545 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str421546 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str431547 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str441548 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str451549 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str461550 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str471551 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str1553 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str11554 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str21555 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] + at .str31556 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str41557 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str51558 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at LargestUnknown = external global i64 ; [#uses=0] + at .str61559 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str81561 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str91562 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at HdVecFFEL = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at HdVecFFER = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at TabIntVecFFE = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ; <[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] + at .str1564 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str11565 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str21566 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str31567 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] + at .str41568 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str51569 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str61570 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str91573 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] + at .str101574 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] + at .str111575 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str121576 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str131577 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str141578 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str151579 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] + at .str161580 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str171581 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str181582 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str191583 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str201584 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str211585 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] + at .str241588 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] + at .str261590 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] + at .str281592 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str291593 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str301594 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str311595 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str321596 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str331597 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str341598 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] + at .str351599 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] + at .str361600 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str371601 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str381602 = external constant [65 x i8], align 8 ; <[65 x i8]*> [#uses=0] + at .str391603 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] + at .str401604 = external constant [63 x i8], align 8 ; <[63 x i8]*> [#uses=0] + at .str1619 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] + at .str11620 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] + at .str21621 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str31622 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] + at .str41623 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str51624 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] + at .str61625 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str71626 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] + at .str81627 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] + at .str91628 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] + at HdIdWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] + at .str101630 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str111631 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str121632 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str131633 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] + at .str141634 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str151635 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] + at .str161636 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] + at .str171637 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] + at .str181638 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] + at .str191639 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str201640 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str211641 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str221642 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] + at .str231643 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] + at .str241644 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str251645 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] + at .str261646 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] + at .str271647 = external constant [53 x i8], align 8 ; <[53 x i8]*> [#uses=0] + at .str281648 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] + at .str291649 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] + at .str301650 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] + at .str311651 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] + at .str341654 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] + at .str351655 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] + at .str361656 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] + at .str371657 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] + at .str401660 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] + at .str421662 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + at .str431663 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] + +declare fastcc i32 @OrdinaryCollect() nounwind + +declare fastcc void @AddString2(i16* nocapture) nounwind + +declare i32 @AgCombinatorial2(i64*, %struct.TypHeader* nocapture) nounwind + +declare i32 @AgSingle(i64* nocapture, %struct.TypHeader* nocapture) nounwind + +declare i32 @AgTriple(i64* nocapture, %struct.TypHeader* nocapture) nounwind + +declare i32 @AgQuadruple(i64* nocapture, %struct.TypHeader* nocapture) nounwind + +declare fastcc void @SetAvecAgGroup(%struct.TypHeader* nocapture, i64, i64) nounwind + +declare fastcc void @SetGeneratorsAgGroup(%struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @AgWordAgExp(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @SaveAndClearCollector(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @BlankAgGroup() nounwind + +declare fastcc void @SetStacksAgGroup(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @EvalOopN(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader* nocapture, i8* nocapture) nounwind + +declare fastcc %struct.TypHeader* @EvalOop2(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*, i8* nocapture) nounwind + +declare fastcc %struct.TypHeader* @EvalOop(%struct.TypHeader*, %struct.TypHeader*, i8* nocapture) nounwind + +declare fastcc void @AddString(i16* nocapture, i64) nounwind + +declare fastcc void @AddGen() nounwind + +declare i32 @AgCombinatorial(i64*, %struct.TypHeader* nocapture) nounwind + +declare fastcc i32 @SetCWeightsAgGroup(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare void @InitCombinatorial(%struct.TypHeader* nocapture, i64) nounwind + +declare void @InitSingle(%struct.TypHeader* nocapture, i64) nounwind + +declare fastcc void @Collect(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @InitTriple(%struct.TypHeader* nocapture, i64) nounwind + +declare void @InitQuadr(%struct.TypHeader* nocapture, i64) nounwind + +declare fastcc %struct.TypHeader* @AgSolution2(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader** nocapture, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @AgSolution(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EqAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EvAg(%struct.TypHeader*) nounwind readnone + +declare fastcc %struct.TypHeader* @IntExponentsAgWord(%struct.TypHeader* nocapture, i64, i64) nounwind + +declare %struct.TypHeader* @ProdAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModAg(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowAgI(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowAgAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CommAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunSumAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDifferenceAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDepthAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCentralWeightAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunExponentsAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunFactorAgGroup(%struct.TypHeader* nocapture) nounwind + +declare void @PrAgen(%struct.TypHeader* nocapture) nounwind + +declare void @PrAgList(%struct.TypHeader* nocapture) nounwind + +declare void @PrAgExp(%struct.TypHeader* nocapture) nounwind + +declare void @PrAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAgProfile(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @TEqAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @TLtAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @TProdAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @TQuoAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @TModAg(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @TPowAgI(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @TPowAgAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @TCommAg(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunAgGroupRecord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDUMPLONG(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCollectorProfile(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsCompatibleAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunExponentAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunReducedAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunInformationAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunRelativeOrderAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLeadingExponentAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTailDepthAgWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNormalizeIgs(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @DifferenceAgWord(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @SumAgWord(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunFactorAgWord(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @FactorAgGroup(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @FunSetCollectorAgWord(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunAgFpGroup(%struct.TypHeader* nocapture) nounwind + +declare i64 @LenBlist(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfBlist(%struct.TypHeader* nocapture, i64) nounwind readonly + +declare i64 @PosBlist(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind readonly + +declare i64 @IsDenseBlist(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsPossBlist(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqBlist(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmBlist(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsBlist(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssBlist(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssBlist(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @PlainBlist(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunIsBlist(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunBlistList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunListBlist(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSizeBlist(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsSubsetBlist(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIntersectBlist(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunUniteBlist(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSubtractBlist(%struct.TypHeader* nocapture) nounwind + +declare fastcc i64 @IsBlist(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunDistanceBlist(%struct.TypHeader* nocapture) nounwind + +declare fastcc void @CVCM2V2(%struct.TypHeader*, %struct.TypHeader*, i64, i64, %struct.TypHeader*, i64, i64*, %struct.TypHeader*) nounwind + +declare fastcc void @CVCMFVF(%struct.TypHeader*, i64, %struct.TypHeader*, i64, i64, %struct.TypHeader*, i64, i64, i64*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunDistanceVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDistancesDistributionVecFFEsVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDistancesDistributionMatFFEVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCosetLeadersMatFFE(%struct.TypHeader* nocapture) nounwind + +declare fastcc i64 @CLMF(%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*, %struct.TypHeader*, i64, i64, i64) nounwind + +declare fastcc i64 @CLM2(%struct.TypHeader*, i64, i64, %struct.TypHeader*, %struct.TypHeader*, i64, i64) nounwind + +declare fastcc %struct.TypHeader* @BlistsMatFF2(%struct.TypHeader*) nounwind + +declare fastcc void @DDMFVF(%struct.TypHeader*, i64, %struct.TypHeader*, %struct.TypHeader*, i64, i64, %struct.TypHeader*) nounwind + +declare fastcc void @DDM2V2(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare fastcc i64 @ConvVecFFE(%struct.TypHeader*, i64) nounwind + +declare fastcc i64 @ConvMatFFE(%struct.TypHeader*, i64) nounwind + +declare %struct.TypHeader* @FunAClosestVectorCombinationsMatFFEVecFFE(%struct.TypHeader* nocapture) nounwind + +declare fastcc void @CompressDeductionList() nounwind + +declare %struct.TypHeader* @FunStandardizeTable(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunStandardizeTable2(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunApplyRel(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunMakeConsequences(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunApplyRel2(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCopyRel(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunMakeCanonical(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTreeEntry(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunMakeConsequences2(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAddAbelianRelator(%struct.TypHeader* nocapture) nounwind + +declare fastcc i64 @TreeEntryC() nounwind + +declare fastcc void @AddCosetFactor2(i64) nounwind + +declare fastcc void @HandleCoinc2(i64, i64, %struct.TypHeader*) nounwind + +declare fastcc void @HandleCoinc(i64, i64) nounwind + +declare fastcc void @ConvertToBase(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @EvCyc(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqCyc(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @LtCyc(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdCycI(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @Cyclotomic(%struct.TypHeader* nocapture, i64, i64) nounwind + +declare void @PrCyc(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsCyc(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsCycInt(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNofCyc(%struct.TypHeader* nocapture) nounwind + +define internal %struct.TypHeader* @FunCoeffsCyc(%struct.TypHeader* nocapture %hdCall) nounwind { +entry: + ret %struct.TypHeader* null +} + +define internal %struct.TypHeader* @FunGaloisCyc(%struct.TypHeader* nocapture %hdCall) nounwind { +entry: + unreachable +} + +declare %struct.TypHeader* @CantEval(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @Sum(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Diff(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Prod(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Quo(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Mod(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Pow(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Eq(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Lt(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Ne(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Le(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Gt(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @Ge(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @IsTrue(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @IsFalse(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EvBool(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqBool(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare %struct.TypHeader* @LtBool(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +define internal fastcc void @InitEval() nounwind { +bb.nph49: + br label %bb + +bb: ; preds = %bb, %bb.nph49 + br i1 undef, label %bb5.preheader, label %bb + +bb4: ; preds = %bb5.preheader, %bb4 + br i1 undef, label %bb6, label %bb4 + +bb6: ; preds = %bb4 + br i1 undef, label %bb11.preheader, label %bb5.preheader + +bb5.preheader: ; preds = %bb6, %bb + br label %bb4 + +bb10: ; preds = %bb11.preheader, %bb10 + br i1 undef, label %bb15, label %bb10 + +bb15: ; preds = %bb10 + br i1 undef, label %bb17, label %bb11.preheader + +bb11.preheader: ; preds = %bb15, %bb6 + br label %bb10 + +bb17: ; preds = %bb15 + br i1 undef, label %InstIntFunc.exit, label %bb.i + +bb.i: ; preds = %bb17 + unreachable + +InstIntFunc.exit: ; preds = %bb17 + br i1 undef, label %InstIntFunc.exit8, label %bb.i7 + +bb.i7: ; preds = %InstIntFunc.exit + unreachable + +InstIntFunc.exit8: ; preds = %InstIntFunc.exit + br i1 undef, label %InstVar.exit28, label %bb.i27 + +bb.i27: ; preds = %InstIntFunc.exit8 + unreachable + +InstVar.exit28: ; preds = %InstIntFunc.exit8 + br i1 undef, label %InstVar.exit, label %bb.i25 + +bb.i25: ; preds = %InstVar.exit28 + unreachable + +InstVar.exit: ; preds = %InstVar.exit28 + br i1 undef, label %InstIntFunc.exit23, label %bb.i22 + +bb.i22: ; preds = %InstVar.exit + unreachable + +InstIntFunc.exit23: ; preds = %InstVar.exit + br i1 undef, label %InstIntFunc.exit20, label %bb.i19 + +bb.i19: ; preds = %InstIntFunc.exit23 + unreachable + +InstIntFunc.exit20: ; preds = %InstIntFunc.exit23 + br i1 undef, label %InstIntFunc.exit17, label %bb.i16 + +bb.i16: ; preds = %InstIntFunc.exit20 + br label %InstIntFunc.exit17 + +InstIntFunc.exit17: ; preds = %bb.i16, %InstIntFunc.exit20 + %tmp79 = tail call fastcc %struct.TypHeader* @NewBag(i32 16, i64 8) nounwind ; <%struct.TypHeader*> [#uses=2] + %tmp80 = getelementptr inbounds %struct.TypHeader* %tmp79, i64 0, i32 1 ; <%struct.TypHeader***> [#uses=1] + %tmp81 = load %struct.TypHeader*** %tmp80, align 8 ; <%struct.TypHeader**> [#uses=1] + store %struct.TypHeader* bitcast (%struct.TypHeader* (%struct.TypHeader*)* @FunIsBound to %struct.TypHeader*), %struct.TypHeader** %tmp81 + %tmp82 = tail call fastcc %struct.TypHeader* @FindIdent(i8* getelementptr inbounds ([8 x i8]* @.str8302, i64 0, i64 0)) nounwind ; <%struct.TypHeader*> [#uses=1] + %tmp83 = getelementptr inbounds %struct.TypHeader* %tmp82, i64 0, i32 1 ; <%struct.TypHeader***> [#uses=1] + %tmp84 = load %struct.TypHeader*** %tmp83, align 8 ; <%struct.TypHeader**> [#uses=1] + br i1 undef, label %InstIntFunc.exit14, label %bb.i13 + +bb.i13: ; preds = %InstIntFunc.exit17 + unreachable + +InstIntFunc.exit14: ; preds = %InstIntFunc.exit17 + store %struct.TypHeader* %tmp79, %struct.TypHeader** %tmp84, align 8 + br i1 undef, label %InstIntFunc.exit11, label %bb.i10 + +bb.i10: ; preds = %InstIntFunc.exit14 + unreachable + +InstIntFunc.exit11: ; preds = %InstIntFunc.exit14 + br i1 undef, label %InstIntFunc.exit9.i, label %bb.i8.i + +bb.i8.i: ; preds = %InstIntFunc.exit11 + unreachable + +InstIntFunc.exit9.i: ; preds = %InstIntFunc.exit11 + br i1 undef, label %InstIntFunc.exit6.i, label %bb.i5.i + +bb.i5.i: ; preds = %InstIntFunc.exit9.i + unreachable + +InstIntFunc.exit6.i: ; preds = %InstIntFunc.exit9.i + br i1 undef, label %InstIntFunc.exit3.i, label %bb.i2.i + +bb.i2.i: ; preds = %InstIntFunc.exit6.i + unreachable + +InstIntFunc.exit3.i: ; preds = %InstIntFunc.exit6.i + br i1 undef, label %InitInt.exit, label %bb.i.i + +bb.i.i: ; preds = %InstIntFunc.exit3.i + br label %InitInt.exit + +InitInt.exit: ; preds = %bb.i.i, %InstIntFunc.exit3.i + br i1 undef, label %InstIntFunc.exit6.i419, label %bb.i5.i418 + +bb.i5.i418: ; preds = %InitInt.exit + unreachable + +InstIntFunc.exit6.i419: ; preds = %InitInt.exit + br i1 undef, label %InstIntFunc.exit3.i422, label %bb.i2.i421 + +bb.i2.i421: ; preds = %InstIntFunc.exit6.i419 + unreachable + +InstIntFunc.exit3.i422: ; preds = %InstIntFunc.exit6.i419 + br i1 undef, label %InitRat.exit, label %bb.i.i424 + +bb.i.i424: ; preds = %InstIntFunc.exit3.i422 + unreachable + +InitRat.exit: ; preds = %InstIntFunc.exit3.i422 + br label %bb.i396 + +bb.i396: ; preds = %bb.i396, %InitRat.exit + br i1 undef, label %bb2.i398, label %bb.i396 + +bb2.i398: ; preds = %bb.i396 + br i1 undef, label %InstIntFunc.exit15.i401, label %bb.i14.i400 + +bb.i14.i400: ; preds = %bb2.i398 + br label %InstIntFunc.exit15.i401 + +InstIntFunc.exit15.i401: ; preds = %bb.i14.i400, %bb2.i398 + br i1 undef, label %InstIntFunc.exit12.i404, label %bb.i11.i403 + +bb.i11.i403: ; preds = %InstIntFunc.exit15.i401 + unreachable + +InstIntFunc.exit12.i404: ; preds = %InstIntFunc.exit15.i401 + br i1 undef, label %InstIntFunc.exit9.i407, label %bb.i8.i406 + +bb.i8.i406: ; preds = %InstIntFunc.exit12.i404 + unreachable + +InstIntFunc.exit9.i407: ; preds = %InstIntFunc.exit12.i404 + br i1 undef, label %InstIntFunc.exit6.i410, label %bb.i5.i409 + +bb.i5.i409: ; preds = %InstIntFunc.exit9.i407 + br label %InstIntFunc.exit6.i410 + +InstIntFunc.exit6.i410: ; preds = %bb.i5.i409, %InstIntFunc.exit9.i407 + %tmp215 = tail call fastcc %struct.TypHeader* @NewBag(i32 16, i64 8) nounwind ; <%struct.TypHeader*> [#uses=2] + %tmp216 = getelementptr inbounds %struct.TypHeader* %tmp215, i64 0, i32 1 ; <%struct.TypHeader***> [#uses=1] + %tmp217 = load %struct.TypHeader*** %tmp216, align 8 ; <%struct.TypHeader**> [#uses=1] + store %struct.TypHeader* bitcast (%struct.TypHeader* (%struct.TypHeader*)* @FunCoeffsCyc to %struct.TypHeader*), %struct.TypHeader** %tmp217 + %tmp218 = tail call fastcc %struct.TypHeader* @FindIdent(i8* getelementptr inbounds ([10 x i8]* @.str4251, i64 0, i64 0)) nounwind ; <%struct.TypHeader*> [#uses=1] + %tmp219 = getelementptr inbounds %struct.TypHeader* %tmp218, i64 0, i32 1 ; <%struct.TypHeader***> [#uses=1] + %tmp220 = load %struct.TypHeader*** %tmp219, align 8 ; <%struct.TypHeader**> [#uses=1] + br i1 undef, label %InstIntFunc.exit3.i413, label %bb.i2.i412 + +bb.i2.i412: ; preds = %InstIntFunc.exit6.i410 + unreachable + +InstIntFunc.exit3.i413: ; preds = %InstIntFunc.exit6.i410 + store %struct.TypHeader* %tmp215, %struct.TypHeader** %tmp220, align 8 + unreachable +} + +declare void @CantPrint(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantSum(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantDiff(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantProd(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantQuo(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantMod(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantPow(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @IntComm(%struct.TypHeader* nocapture) nounwind + +declare void @PrBinop(%struct.TypHeader*) nounwind + +declare void @PrComm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvVar(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvVarAuto(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvVarAss(%struct.TypHeader* nocapture) nounwind + +declare void @PrVar(%struct.TypHeader* nocapture) nounwind + +declare void @PrVarAss(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvNot(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvAnd(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvOr(%struct.TypHeader* nocapture) nounwind + +declare void @PrBool(%struct.TypHeader*) nounwind + +declare void @PrNot(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsBool(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunShallowCopy(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCopy(%struct.TypHeader* nocapture) nounwind + +define internal %struct.TypHeader* @FunIsBound(%struct.TypHeader* nocapture %hdCall) nounwind { +entry: + br i1 undef, label %bb1, label %bb + +bb: ; preds = %entry + ret %struct.TypHeader* undef + +bb1: ; preds = %entry + br i1 undef, label %bb3, label %bb24 + +bb3: ; preds = %bb1 + br i1 undef, label %bb25, label %bb24 + +bb24: ; preds = %bb3, %bb1 + ret %struct.TypHeader* undef + +bb25: ; preds = %bb3 + br i1 undef, label %bb28, label %bb86 + +bb28: ; preds = %bb25 + br i1 undef, label %bb133, label %bb86 + +bb86: ; preds = %bb28, %bb25 + br i1 undef, label %bb93, label %bb94 + +bb93: ; preds = %bb86 + unreachable + +bb94: ; preds = %bb86 + br i1 undef, label %bb97, label %bb108 + +bb97: ; preds = %bb94 + ret %struct.TypHeader* undef + +bb108: ; preds = %bb94 + br i1 undef, label %bb110, label %bb109 + +bb109: ; preds = %bb108 + %tmp91 = bitcast %struct.TypHeader** undef to i8* ; [#uses=1] + %tmp92 = call fastcc %struct.TypHeader* @FindRecname(i8* %tmp91) nounwind ; <%struct.TypHeader*> [#uses=0] + unreachable + +bb110: ; preds = %bb108 + ret %struct.TypHeader* undef + +bb133: ; preds = %bb28 + ret %struct.TypHeader* undef +} + +declare %struct.TypHeader* @FunLeftQuotient(%struct.TypHeader* nocapture) nounwind + +define internal %struct.TypHeader* @CantComm(%struct.TypHeader* %hdL, %struct.TypHeader* %hdR) nounwind { +entry: + unreachable +} + +declare i16** @__ctype_b_loc() nounwind readnone + +declare fastcc void @Print(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunUnbind(%struct.TypHeader* nocapture) nounwind + +declare fastcc void @CopyCleanup(%struct.TypHeader*) nounwind + +declare fastcc void @CopyCopy(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare fastcc void @CopyForward(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @CopyShadow(%struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @Copy(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvFFE(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare void @PrFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowFFE(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunIsFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLogFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIntFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunZ(%struct.TypHeader* nocapture) nounwind + +declare fastcc void @PrFF(%struct.TypHeader** nocapture, i32) nounwind + +declare fastcc %struct.TypHeader* @RootFiniteField(i64) nounwind + +declare fastcc %struct.TypHeader* @ConvTabIntFFE(i64) nounwind + +declare fastcc %struct.TypHeader* @CommonFF(%struct.TypHeader** nocapture, %struct.TypHeader* nocapture) nounwind + +declare fastcc void @ChangeEnv(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvFunction(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EvReturn(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvFunccall(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvMakefunc(%struct.TypHeader* nocapture) nounwind + +declare void @PrFunccall(%struct.TypHeader* nocapture) nounwind + +declare void @PrFunction(%struct.TypHeader* nocapture) nounwind + +declare void @PrFuncint(%struct.TypHeader* nocapture) nounwind + +declare void @PrReturn(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTrace(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunUntrace(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunProfile(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunApplyFunc(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsFunc(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIgnore(%struct.TypHeader* nocapture) nounwind readonly + +declare fastcc i64 @SizeObj(%struct.TypHeader*) nounwind + +declare fastcc void @MarkObj(%struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @Error(i8* nocapture, i64, i64) nounwind + +declare void @longjmp(%struct.__jmp_buf_tag*, i32) noreturn nounwind + +declare fastcc void @InitGap(i32, i8** nocapture) nounwind + +declare i32 @_setjmp(%struct.__jmp_buf_tag*) nounwind + +declare %struct.TypHeader* @FunSIZEHANDLES(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNUMBERHANDLES(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCoefficients(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunGASMAN(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSIZE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTYPE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOBJ(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunHANDLE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsIdentical(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTmpName(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSizeScreen(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunRuntime(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunExec(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunHelp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunReadTest(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLogInputTo(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLogTo(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAppendTo(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPrntTo(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPrint(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAUTO(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunREAD(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunWindowCmd(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunError(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunBacktrace(%struct.TypHeader*) nounwind + +declare i32 @main(i32, i8** nocapture) noreturn nounwind + +declare fastcc void @ExitKernel(%struct.TypHeader*) nounwind + +declare fastcc void @CollectGarb() nounwind + +define internal fastcc %struct.TypHeader* @NewBag(i32 %type, i64 %size) nounwind { +entry: + br i1 undef, label %bb3, label %bb2 + +bb2: ; preds = %entry + br i1 undef, label %bb22, label %bb28 + +bb3: ; preds = %entry + unreachable + +bb22: ; preds = %bb2 + unreachable + +bb28: ; preds = %bb2 + br i1 undef, label %bb30, label %bb29 + +bb29: ; preds = %bb28 + unreachable + +bb30: ; preds = %bb28 + br i1 undef, label %bb33, label %bb31 + +bb31: ; preds = %bb30 + br i1 undef, label %bb32, label %bb33 + +bb32: ; preds = %bb31 + tail call fastcc void @Resize(%struct.TypHeader* undef, i64 undef) nounwind + ret %struct.TypHeader* undef + +bb33: ; preds = %bb31, %bb30 + ret %struct.TypHeader* undef +} + +define internal fastcc void @Resize(%struct.TypHeader* %hdBag, i64 %newSize) nounwind { +entry: + br i1 undef, label %bb1, label %bb2 + +bb1: ; preds = %entry + br label %bb2 + +bb2: ; preds = %bb1, %entry + br i1 undef, label %bb3, label %bb4 + +bb3: ; preds = %bb2 + ret void + +bb4: ; preds = %bb2 + %tmp53 = tail call fastcc %struct.TypHeader* @NewBag(i32 undef, i64 %newSize) nounwind ; <%struct.TypHeader*> [#uses=0] + unreachable +} + +declare fastcc i64 @completion(i8* nocapture, i64, i64) nounwind + +define internal fastcc %struct.TypHeader* @FindRecname(i8* nocapture %name) nounwind { +entry: + br i1 undef, label %bb8, label %bb5 + +bb5: ; preds = %entry + unreachable + +bb8: ; preds = %entry + %tmp24 = tail call fastcc %struct.TypHeader* @NewBag(i32 78, i64 0) nounwind ; <%struct.TypHeader*> [#uses=1] + %tmp26 = getelementptr inbounds %struct.TypHeader* %tmp24, i64 0, i32 1 ; <%struct.TypHeader***> [#uses=1] + %tmp27 = load %struct.TypHeader*** %tmp26, align 8 ; <%struct.TypHeader**> [#uses=1] + %tmp29 = bitcast %struct.TypHeader** %tmp27 to i8* ; [#uses=1] + %tmp30 = tail call i8* @strncat(i8* %tmp29, i8* %name, i64 undef) nounwind ; [#uses=0] + unreachable +} + +define internal fastcc %struct.TypHeader* @FindIdent(i8* nocapture %name) nounwind { +entry: + br i1 undef, label %bb10, label %bb8 + +bb8: ; preds = %entry + br label %bb10 + +bb10: ; preds = %bb8, %entry + %tmp28 = load %struct.TypHeader** @HdIdenttab, align 8 ; <%struct.TypHeader*> [#uses=1] + %tmp32 = getelementptr inbounds %struct.TypHeader* %tmp28, i64 0, i32 1 ; <%struct.TypHeader***> [#uses=1] + %tmp33 = load %struct.TypHeader*** %tmp32, align 8 ; <%struct.TypHeader**> [#uses=1] + br label %bb12 + +bb11: ; preds = %bb13 + br label %bb12 + +bb12: ; preds = %bb11, %bb10 + %tmp36 = getelementptr inbounds %struct.TypHeader** %tmp33, i64 undef ; <%struct.TypHeader**> [#uses=1] + %tmp37 = load %struct.TypHeader** %tmp36, align 8 ; <%struct.TypHeader*> [#uses=2] + br i1 undef, label %bb19, label %bb13 + +bb13: ; preds = %bb12 + br i1 undef, label %bb14, label %bb11 + +bb14: ; preds = %bb13 + br i1 undef, label %bb19, label %bb15 + +bb15: ; preds = %bb14 + br i1 undef, label %bb18, label %bb17 + +bb17: ; preds = %bb15 + ret %struct.TypHeader* %tmp37 + +bb18: ; preds = %bb15 + ret %struct.TypHeader* %tmp37 + +bb19: ; preds = %bb14, %bb12 + unreachable +} + +declare %struct.TypHeader* @EvInt(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqInt(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare %struct.TypHeader* @LtInt(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare void @PrInteger(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunIsInt(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunQuo(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunRem(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunGcdInt(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @GcdInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @RemInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @QuoInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @CantLenList(%struct.TypHeader* nocapture) nounwind + +declare i64 @NotIsDenseList(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @NotIsPossList(%struct.TypHeader* nocapture) nounwind readnone + +declare %struct.TypHeader* @EvList(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @LtList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoLists(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModLists(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowLists(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CommList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CommLists(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CantElmList(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @CantElmsList(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CantAssList(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CantAsssList(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare i64 @CantPosList(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, i64) nounwind + +declare void @CantPlainList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @DepthListx(%struct.TypHeader*) nounwind + +declare void @PrList(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumSclList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumListScl(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffSclList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffListScl(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdSclList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdListScl(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvElmList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvElmListLevel(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvElmsList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvElmsListLevel(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvAssList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvAssListLevel(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvAsssList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvAsssListLevel(%struct.TypHeader* nocapture) nounwind + +declare void @PrElmList(%struct.TypHeader* nocapture) nounwind + +declare void @PrElmsList(%struct.TypHeader* nocapture) nounwind + +declare void @PrAssList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvIn(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsVector(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsMat(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLength(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAdd(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAppend(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPosition(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOnPoints(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOnPairs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOnTuples(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOnSets(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOnRight(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOnLeft(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDepthVector(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CantDepthVector(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @AsssListLevel(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*, i64) nounwind + +declare fastcc %struct.TypHeader* @AssListLevel(%struct.TypHeader*, i64, %struct.TypHeader*, i64) nounwind + +declare fastcc %struct.TypHeader* @ElmsListLevel(%struct.TypHeader*, %struct.TypHeader*, i64) nounwind + +declare fastcc %struct.TypHeader* @ElmListLevel(%struct.TypHeader*, i64, i64) nounwind + +declare %struct.TypHeader* @ProdListList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffListList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumListList(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @PrPcPres(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTriangleIndex(%struct.TypHeader* nocapture) nounwind + +declare fastcc i32 @IsNormedPcp(%struct.TypHeader*, %struct.TypHeader** nocapture) nounwind + +declare %struct.TypHeader* @FunTailReducedPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunBaseReducedPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTailDepthPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDepthPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunExponentsPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunExponentPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDifferencePcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSumPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSubtractPowerPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAddPowerPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDefinePowerPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSubtractCommPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAddCommPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDefineCommPcp(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @NormalWordPcp(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunPowerPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunConjugatePcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCommPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunQuotientPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLeftQuotientPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunProductPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNormalWordPcp(%struct.TypHeader* nocapture) nounwind + +declare fastcc void @ShrinkSwords(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCentralWeightsPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunShrinkPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunGeneratorsPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDefineCentralWeightsPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunExtendCentralPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAgPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPcp(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvPerm(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EvMakeperm(%struct.TypHeader* nocapture) nounwind + +declare void @PrMakeperm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowPI(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowIP(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @QuoIP(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsPerm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPermList(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunOrderPerm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSignPerm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSmallestGeneratorPerm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CommQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CommQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CommPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CommPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ModQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ModQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ModPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ModPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCyclePermInt(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunCycleLengthPermInt(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLargestMovedPointPerm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @QuoIQ(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowIQ(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @QuoQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @QuoQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @QuoPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @QuoPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowQI(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare void @PrPermQ(%struct.TypHeader* nocapture) nounwind + +declare void @PrPermP(%struct.TypHeader* nocapture) nounwind + +declare i64 @LenPlist(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfPlist(%struct.TypHeader* nocapture, i64) nounwind readonly + +declare i64 @PosPlist(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind + +declare void @PlainPlist(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsDensePlist(%struct.TypHeader* nocapture) nounwind readonly + +declare i64 @IsPossPlist(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqPlist(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @LtPlist(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ElmPlist(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsPlist(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssPlist(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssPlist(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvMakeList(%struct.TypHeader* nocapture) nounwind + +declare void @PrMakeList(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @MakeList(%struct.TypHeader*, i64, %struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @UnifiedFieldVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare void @AddCoeffsListxListx(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @MultiplyCoeffsListxListx(%struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*, i64) nounwind + +declare %struct.TypHeader* @CantNormalizeCoeffs(%struct.TypHeader* nocapture) nounwind + +declare void @CantShrinkCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CantShiftedCoeffs(%struct.TypHeader* nocapture, i64) nounwind + +declare void @CantAddCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare i64 @CantMultiplyCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @CantProductCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CantProductCoeffsMod(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare i64 @CantReduceCoeffs(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind + +declare i64 @CantReduceCoeffsMod(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture) nounwind + +declare noalias %struct.TypHeader* @CantPowerModCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @NormalizeCoeffsListx(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @NormalizeCoeffsVecFFE(%struct.TypHeader*) nounwind + +declare void @ShrinkCoeffsListx(%struct.TypHeader*) nounwind + +declare void @ShrinkCoeffsVecFFE(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ShiftedCoeffsListx(%struct.TypHeader*, i64) nounwind + +declare %struct.TypHeader* @ShiftedCoeffsVecFFE(%struct.TypHeader*, i64) nounwind + +declare void @AddCoeffsListxVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @AddCoeffsVecFFEVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @MultiplyCoeffsVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ProductCoeffsListxListx(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProductCoeffsVecFFEVecFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProductCoeffsModListxListx(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @ReduceCoeffsListxListx(%struct.TypHeader*, i64, %struct.TypHeader*, i64) nounwind + +declare i64 @ReduceCoeffsVecFFEVecFFE(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind + +declare i64 @ReduceCoeffsModListxListx(%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare i64 @ReduceCoeffsModListx(%struct.TypHeader*, i64, %struct.TypHeader* nocapture, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowerModListxIntListx(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowerModVecFFEIntVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowerModListxLIntListx(%struct.TypHeader*, %struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowerModVecFFELIntVecFFE(%struct.TypHeader*, %struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunShiftedCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNormalizeCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunShrinkCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAddCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSumCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunProductCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunProductCoeffsMod(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunReduceCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunRemainderCoeffs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunReduceCoeffsMod(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPowerModCoeffs(%struct.TypHeader* nocapture) nounwind + +declare i64 @LenRange(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfRange(%struct.TypHeader* nocapture, i64) nounwind readonly + +declare i64 @PosRange(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind + +declare i64 @IsDenseRange(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsPossRange(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtRange(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmRange(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsRange(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssRange(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssRange(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @PlainRange(%struct.TypHeader*) nounwind + +declare void @PrRange(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvMakeRange(%struct.TypHeader* nocapture) nounwind + +declare void @PrMakeRange(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsRange(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvRat(%struct.TypHeader*) nounwind readnone + +declare void @PrRat(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumRat(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffRat(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdRat(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoRat(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModRat(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowRat(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EqRat(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare %struct.TypHeader* @LtRat(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunIsRat(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNumerator(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDenominator(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @RdExpr(i64) nounwind + +declare fastcc %struct.TypHeader* @RdAtom(i64) nounwind + +declare fastcc %struct.TypHeader* @RdFactor(i64) nounwind + +declare fastcc %struct.TypHeader* @RdTerm(i64) nounwind + +declare fastcc %struct.TypHeader* @RdAri(i64) nounwind + +declare fastcc %struct.TypHeader* @RdRel(i64) nounwind + +declare fastcc %struct.TypHeader* @RdStats(i64) nounwind + +declare fastcc %struct.TypHeader* @RdStat(i64) nounwind + +declare %struct.TypHeader* @EvRec(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvMakeRec(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvRecElm(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvRecAss(%struct.TypHeader* nocapture) nounwind + +declare void @PrRec(%struct.TypHeader*) nounwind + +declare void @PrRecElm(%struct.TypHeader* nocapture) nounwind + +declare void @PrRecAss(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @LtRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CommRec(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunIsRec(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunRecFields(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @MakeRec(%struct.TypHeader*, i64, %struct.TypHeader* nocapture) nounwind + +declare fastcc i64 @OpenInput(i8* nocapture) nounwind + +declare fastcc void @PutLine() nounwind + +declare fastcc void @PutChr(i32 signext) nounwind + +declare fastcc void @Pr(i8* nocapture, i64, i64) nounwind + +declare fastcc void @SyntaxError(i8*) nounwind + +declare fastcc void @GetLine() nounwind + +declare fastcc void @GetIdent() nounwind + +declare fastcc void @GetSymbol() nounwind + +declare fastcc void @Match(i64, i8* nocapture, i64) nounwind + +declare i64 @LenSet(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfSet(%struct.TypHeader* nocapture, i64) nounwind readonly + +declare i64 @PosSet(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind + +declare void @PlainSet(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsDenseSet(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsPossSet(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqSet(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @LtSet(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ElmSet(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsSet(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssSet(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssSet(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsEqualSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsSubsetSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAddSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunRemoveSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunUniteSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIntersectSet(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSubtractSet(%struct.TypHeader* nocapture) nounwind + +declare fastcc i64 @IsSet(%struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @SetList(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EvStatseq(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvIf(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvFor(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvWhile(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvRepeat(%struct.TypHeader* nocapture) nounwind + +declare void @PrStatseq(%struct.TypHeader* nocapture) nounwind + +declare void @PrIf(%struct.TypHeader* nocapture) nounwind + +declare void @PrFor(%struct.TypHeader* nocapture) nounwind + +declare void @PrWhile(%struct.TypHeader* nocapture) nounwind + +declare void @PrRepeat(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvChar(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqChar(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtChar(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare i64 @LenString(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfString(%struct.TypHeader* nocapture, i64) nounwind readonly + +declare i64 @PosString(%struct.TypHeader*, %struct.TypHeader*, i64) nounwind + +declare i64 @IsDenseString(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsPossString(%struct.TypHeader* nocapture) nounwind readonly + +declare void @PrChar(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ElmString(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsString(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssString(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssString(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @PlainString(%struct.TypHeader*) nounwind + +declare void @PrString(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EqString(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtString(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @FunIsString(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvMakeString(%struct.TypHeader* nocapture) nounwind + +declare fastcc i64 @IsString(%struct.TypHeader*) nounwind + +declare noalias i8* @calloc(i64, i64) nounwind + +declare i8* @tmpnam(i8*) nounwind + +declare fastcc void @SyExit(i64) noreturn nounwind + +declare void @exit(i32) noreturn nounwind + +declare i64 @times(%struct.tms* nocapture) nounwind + +declare i64 @fwrite(i8* nocapture, i64, i64, i8* nocapture) nounwind + +declare void @syAnswerIntr(i32) nounwind + +declare i64 @time(i64*) nounwind + +declare void (i32)* @signal(i32, void (i32)*) nounwind + +declare fastcc void @syEchoch(i32, i64) nounwind + +declare i32 @fileno(%struct._IO_FILE* nocapture) nounwind + +declare i64 @write(i32, i8* nocapture, i64) + +declare fastcc void @syStopraw(i64) nounwind + +declare i32 @ioctl(i32, i64, ...) nounwind + +declare void @syAnswerTstp(i32) nounwind + +declare i32 @getpid() nounwind + +declare i32 @kill(i32, i32) nounwind + +declare fastcc void @SyFclose(i64) nounwind + +declare i32 @fclose(%struct._IO_FILE* nocapture) nounwind + +declare i8* @strncat(i8*, i8* nocapture, i64) nounwind + +declare i32 @strcmp(i8* nocapture, i8* nocapture) nounwind readonly + +declare fastcc i64 @SyFopen(i8* nocapture, i8* nocapture) nounwind + +declare noalias %struct._IO_FILE* @fopen(i8* noalias nocapture, i8* noalias nocapture) nounwind + +declare void @setbuf(%struct._IO_FILE* noalias nocapture, i8* noalias) nounwind + +declare i64 @strlen(i8* nocapture) nounwind readonly + +declare fastcc void @syWinPut(i64, i8* nocapture, i8* nocapture) nounwind + +declare i32 @isatty(i32) nounwind + +declare i8* @ttyname(i32) nounwind + +declare i32 @fputs(i8* noalias nocapture, %struct._IO_FILE* noalias nocapture) nounwind + +declare i32 @atoi(i8* nocapture) nounwind readonly + +declare noalias i8* @malloc(i64) nounwind + +declare void @free(i8* nocapture) nounwind + +declare i8* @getenv(i8* nocapture) nounwind readonly + +declare i32 @system(i8* nocapture) + +declare i64 @read(i32, i8* nocapture, i64) + +declare fastcc void @SyFputs(i8* nocapture, i64) nounwind + +declare fastcc i32 @syGetch(i64) nounwind + +declare fastcc i32 @syStartraw(i64) nounwind + +declare void @llvm.memcpy.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind + +declare void @syAnswerCont(i32) nounwind + +declare fastcc void @syEchos(i8* nocapture, i64) nounwind + +declare fastcc i8* @SyFgets(i8*, i64) nounwind + +declare i8* @fgets(i8* noalias, i32, %struct._IO_FILE* noalias nocapture) nounwind + +declare fastcc void @SyHelp(i8* nocapture, i64) nounwind + +declare %struct.TypHeader* @FunTzRelator(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzSortC(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzRenumberGens(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzReplaceGens(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzSubstituteGen(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzOccurrences(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzOccurrencesPairs(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunTzSearchC(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvUnknown(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqUnknown(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @LtUnknown(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare void @PrUnknown(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowUnknown(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunUnknown(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsUnknown(%struct.TypHeader* nocapture) nounwind + +declare i64 @LenVecFFE(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmlVecFFE(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmrVecFFE(%struct.TypHeader* nocapture, i64) nounwind + +declare i64 @PosVecFFE(%struct.TypHeader*, %struct.TypHeader*, i64) nounwind + +declare i64 @IsDenseVecFFE(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsPossVecFFE(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @DepthVecFFE(%struct.TypHeader* nocapture) nounwind readonly + +declare fastcc i64 @DegreeVecFFE(%struct.TypHeader* nocapture) nounwind readonly + +declare fastcc i64 @DegreeMatFFE(%struct.TypHeader** nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfVecFFE(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmVecFFE(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssVecFFE(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @PlainVecFFE(%struct.TypHeader*) nounwind + +declare i64 @IsXTypeVecFFE(%struct.TypHeader*) nounwind + +declare i64 @IsXTypeMatFFE(%struct.TypHeader*) nounwind + +declare void @PrVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumVecFFEFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @DiffFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @DiffVecFFEFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @DiffVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdVecFFEFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdVecFFEMatFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowMatFFEInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunCharFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunDegreeFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLogVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunMakeVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunNumberVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @CantIntVecFFE(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @FunIntVecFFE(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdFFEVector(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdVectorFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffFFEVector(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffVectorFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumFFEVector(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumVectorFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @IntVecFFE(%struct.TypHeader*, i64) nounwind + +declare i64 @LenVector(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @ElmfVector(%struct.TypHeader* nocapture, i64) nounwind readonly + +declare i64 @PosVector(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind + +declare void @PlainVector(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsDenseVector(%struct.TypHeader* nocapture) nounwind readnone + +declare i64 @IsPossVector(%struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @EqVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @LtVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ElmVector(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @ElmsVector(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AssVector(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @AsssVector(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @IsXTypeVector(%struct.TypHeader*) nounwind + +declare i64 @IsXTypeMatrix(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumIntVector(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @SumVectorInt(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumVectorVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @DiffIntVector(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @DiffVectorInt(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffVectorVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdIntVector(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdVectorInt(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdVectorVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdVectorMatrix(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @PowMatrixInt(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare fastcc %struct.TypHeader* @SwordWord(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @EvWord(%struct.TypHeader*) nounwind readnone + +declare %struct.TypHeader* @EqWord(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare fastcc %struct.TypHeader* @WordSword(%struct.TypHeader* nocapture) nounwind + +declare void @PrWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @ProdWord(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoWord(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ModWord(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @PowWW(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @CommWord(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @LtWord(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare %struct.TypHeader* @PowWI(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @FunExpsum(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunIsWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunPosWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSubword(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunLenWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunMappedWord(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunEliminated(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunSubs(%struct.TypHeader* nocapture) nounwind + +declare fastcc %struct.TypHeader* @Words(%struct.TypHeader* nocapture, i64) nounwind + +declare %struct.TypHeader* @FunAbstractGenerators(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @FunAbstractGenerator(%struct.TypHeader* nocapture) nounwind + +declare void @PrSword(%struct.TypHeader* nocapture) nounwind + +declare %struct.TypHeader* @LtAg_DIRECT(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly + +declare %struct.TypHeader* @CommAg_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdCyc_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @QuoCyc_DIRECT(%struct.TypHeader*) nounwind + +declare void @AddCoeffsListxListx_DIRECT(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @PosRange_DIRECT(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdCycI_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare void @PrFunction_DIRECT(%struct.TypHeader* nocapture) nounwind + +declare void @FunPrint_DIRECT(%struct.TypHeader* nocapture) nounwind + +declare void @FunBacktrace_DIRECT() nounwind + +declare %struct.TypHeader* @SumSclList_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @SumListScl_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffSclList_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @DiffListScl_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdSclList_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare %struct.TypHeader* @ProdListScl_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind + +declare i64 @IsXTypeVector_DIRECT(%struct.TypHeader*) nounwind + +declare %struct.TypHeader* @EqWord_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly + +declare %struct.TypHeader* @ProdWord_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind From foldr at codedgers.com Mon Jul 19 12:17:11 2010 From: foldr at codedgers.com (Mikhail Glushenkov) Date: Mon, 19 Jul 2010 17:17:11 -0000 Subject: [llvm-commits] [llvm] r108714 - /llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Message-ID: <20100719171711.231D52A6C12C@llvm.org> Author: foldr Date: Mon Jul 19 12:17:10 2010 New Revision: 108714 URL: http://llvm.org/viewvc/llvm-project?rev=108714&view=rev Log: Better error reporting for switch_list. Modified: llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Modified: llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp?rev=108714&r1=108713&r2=108714&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Mon Jul 19 12:17:10 2010 @@ -315,6 +315,10 @@ bool isList() const { return OptionType::IsList(this->Type); } + bool isParameterList() const + { return (OptionType::IsList(this->Type) + && !OptionType::IsSwitchList(this->Type)); } + }; void OptionDescription::CheckConsistency() const { @@ -471,8 +475,11 @@ const OptionDescription& FindSwitch(const std::string& OptName) const; const OptionDescription& FindParameter(const std::string& OptName) const; const OptionDescription& FindList(const std::string& OptName) const; + const OptionDescription& FindParameterList(const std::string& OptName) const; const OptionDescription& FindListOrParameter(const std::string& OptName) const; + const OptionDescription& + FindParameterListOrParameter(const std::string& OptName) const; /// insertDescription - Insert new OptionDescription into /// OptionDescriptions list @@ -510,6 +517,14 @@ } const OptionDescription& +OptionDescriptions::FindParameterList(const std::string& OptName) const { + const OptionDescription& OptDesc = this->FindOption(OptName); + if (!OptDesc.isList() || OptDesc.isSwitchList()) + throw OptName + ": incorrect option type - should be a parameter list!"; + return OptDesc; +} + +const OptionDescription& OptionDescriptions::FindParameter(const std::string& OptName) const { const OptionDescription& OptDesc = this->FindOption(OptName); if (!OptDesc.isParameter()) @@ -526,6 +541,16 @@ return OptDesc; } +const OptionDescription& +OptionDescriptions::FindParameterListOrParameter +(const std::string& OptName) const { + const OptionDescription& OptDesc = this->FindOption(OptName); + if ((!OptDesc.isList() && !OptDesc.isParameter()) || OptDesc.isSwitchList()) + throw OptName + + ": incorrect option type - should be a parameter list or parameter!"; + return OptDesc; +} + void OptionDescriptions::InsertDescription (const OptionDescription& o) { container_type::iterator I = Descriptions.find(o.Name); if (I != Descriptions.end()) { @@ -679,8 +704,8 @@ void onCommaSeparated (const DagInit& d) { CheckNumberOfArguments(d, 0); - if (!optDesc_.isList()) - throw "'comma_separated' is valid only on list options!"; + if (!optDesc_.isParameterList()) + throw "'comma_separated' is valid only on parameter list options!"; optDesc_.setCommaSeparated(); } @@ -747,7 +772,7 @@ if (val < 2) throw "Error in the 'multi_val' property: " "the value must be greater than 1!"; - if (!optDesc_.isList()) + if (!optDesc_.isParameterList()) throw "The multi_val property is valid only on list options!"; optDesc_.MultiVal = val; } @@ -1453,7 +1478,7 @@ return true; } else if (TestName == "element_in_list") { - const OptionDescription& OptDesc = OptDescs.FindList(OptName); + const OptionDescription& OptDesc = OptDescs.FindParameterList(OptName); const std::string& VarName = OptDesc.GenVariableName(); O << "std::find(" << VarName << ".begin(),\n"; O.indent(IndentLevel + Indent1) @@ -2026,7 +2051,7 @@ { CheckNumberOfArguments(Dag, 1); const std::string& Name = InitPtrToString(Dag.getArg(0)); - const OptionDescription& D = OptDescs.FindListOrParameter(Name); + const OptionDescription& D = OptDescs.FindParameterListOrParameter(Name); if (D.isSwitchList()) { throw std::runtime_error @@ -2061,7 +2086,7 @@ CheckNumberOfArguments(Dag, 2); const std::string& Name = InitPtrToString(Dag.getArg(0)); const std::string& Hook = InitPtrToString(Dag.getArg(1)); - const OptionDescription& D = OptDescs.FindListOrParameter(Name); + const OptionDescription& D = OptDescs.FindParameterListOrParameter(Name); O.indent(IndentLevel) << "vec.push_back(std::make_pair(" << D.GenVariableName() << ".getPosition(" @@ -2527,8 +2552,15 @@ O.indent(IndentLevel) << OptDesc.GenVariableName() << ".clear();\n"; for (ListInit::const_iterator B = List.begin(), E = List.end(); B != E; ++B) { - O.indent(IndentLevel) << OptDesc.GenVariableName() << ".push_back(\"" - << InitPtrToString(*B) << "\");\n"; + const Init* CurElem = *B; + if (OptDesc.isSwitchList()) + CheckBooleanConstant(CurElem); + + O.indent(IndentLevel) + << OptDesc.GenVariableName() << ".push_back(\"" + << (OptDesc.isSwitchList() ? CurElem->getAsString() + : InitPtrToString(CurElem)) + << "\");\n"; } } else if (OptDesc.isSwitch()) { @@ -2797,7 +2829,8 @@ CheckNumberOfArguments(Dag, 2); const std::string& OptName = InitPtrToString(Dag.getArg(0)); const std::string& HookName = InitPtrToString(Dag.getArg(1)); - const OptionDescription& D = OptDescs_.FindOption(OptName); + const OptionDescription& D = + OptDescs_.FindParameterListOrParameter(OptName); HookNames_[HookName] = HookInfo(D.isList() ? HookInfo::ListHook : HookInfo::ArgHook); From foldr at codedgers.com Mon Jul 19 12:17:22 2010 From: foldr at codedgers.com (Mikhail Glushenkov) Date: Mon, 19 Jul 2010 17:17:22 -0000 Subject: [llvm-commits] [llvm] r108718 - /llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Message-ID: <20100719171723.059642A6C12F@llvm.org> Author: foldr Date: Mon Jul 19 12:17:22 2010 New Revision: 108718 URL: http://llvm.org/viewvc/llvm-project?rev=108718&view=rev Log: Remove code duplication. Modified: llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Modified: llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp?rev=108718&r1=108717&r2=108718&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Mon Jul 19 12:17:22 2010 @@ -1853,6 +1853,24 @@ } +/// EmitForEachListElementCycleHeader - Emit common code for iterating through +/// all elements of a list. Helper function used by +/// EmitForwardOptionPropertyHandlingCode. +void EmitForEachListElementCycleHeader (const OptionDescription& D, + unsigned IndentLevel, + raw_ostream& O) { + unsigned IndentLevel1 = IndentLevel + Indent1; + + O.indent(IndentLevel) + << "for (" << D.GenTypeDeclaration() + << "::iterator B = " << D.GenVariableName() << ".begin(),\n"; + O.indent(IndentLevel) + << "E = " << D.GenVariableName() << ".end(); B != E;) {\n"; + O.indent(IndentLevel1) << "unsigned pos = " << D.GenVariableName() + << ".getPosition(B - " << D.GenVariableName() + << ".begin());\n"; +} + /// EmitForwardOptionPropertyHandlingCode - Helper function used to /// implement EmitActionHandler. Emits code for /// handling the (forward) and (forward_as) option properties. @@ -1893,16 +1911,7 @@ << D.GenVariableName() << "));\n"; break; case OptionType::PrefixList: - // TODO: remove duplication across PrefixList / ParameterList / SwitchList - // branches - O.indent(IndentLevel) - << "for (" << D.GenTypeDeclaration() - << "::iterator B = " << D.GenVariableName() << ".begin(),\n"; - O.indent(IndentLevel) - << "E = " << D.GenVariableName() << ".end(); B != E;) {\n"; - O.indent(IndentLevel1) << "unsigned pos = " << D.GenVariableName() - << ".getPosition(B - " << D.GenVariableName() - << ".begin());\n"; + EmitForEachListElementCycleHeader(D, IndentLevel, O); O.indent(IndentLevel1) << "vec.push_back(std::make_pair(pos, \"" << Name << "\" + " << "*B));\n"; O.indent(IndentLevel1) << "++B;\n"; @@ -1915,14 +1924,7 @@ O.indent(IndentLevel) << "}\n"; break; case OptionType::ParameterList: - O.indent(IndentLevel) - << "for (" << D.GenTypeDeclaration() << "::iterator B = " - << D.GenVariableName() << ".begin(),\n"; - O.indent(IndentLevel) << "E = " << D.GenVariableName() - << ".end() ; B != E;) {\n"; - O.indent(IndentLevel1) << "unsigned pos = " << D.GenVariableName() - << ".getPosition(B - " << D.GenVariableName() - << ".begin());\n"; + EmitForEachListElementCycleHeader(D, IndentLevel, O); O.indent(IndentLevel1) << "vec.push_back(std::make_pair(pos, \"" << Name << "\"));\n"; @@ -1934,14 +1936,7 @@ O.indent(IndentLevel) << "}\n"; break; case OptionType::SwitchList: - O.indent(IndentLevel) - << "for (" << D.GenTypeDeclaration() << "::iterator B = " - << D.GenVariableName() << ".begin(),\n"; - O.indent(IndentLevel) << "E = " << D.GenVariableName() - << ".end() ; B != E;) {\n"; - O.indent(IndentLevel1) << "unsigned pos = " << D.GenVariableName() - << ".getPosition(B - " << D.GenVariableName() - << ".begin());\n"; + EmitForEachListElementCycleHeader(D, IndentLevel, O); O.indent(IndentLevel1) << "vec.push_back(std::make_pair(pos, \"" << Name << "\"));\n"; O.indent(IndentLevel1) << "++B;\n"; From grosbach at apple.com Mon Jul 19 12:18:28 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 19 Jul 2010 17:18:28 -0000 Subject: [llvm-commits] [llvm] r108722 - in /llvm/trunk/lib/Target/ARM: ARMISelLowering.cpp ARMISelLowering.h Message-ID: <20100719171828.926362A6C12C@llvm.org> Author: grosbach Date: Mon Jul 19 12:18:28 2010 New Revision: 108722 URL: http://llvm.org/viewvc/llvm-project?rev=108722&view=rev Log: Since ARM emits inline jump tables as part of the ConstantIsland pass, it should set the jump table encloding the EK_Inline. This prevents a second, unused, copy of the table from being emitted after the function body. PR7499. Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.h Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=108722&r1=108721&r2=108722&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Jul 19 12:18:28 2010 @@ -1628,6 +1628,10 @@ return DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Res); } +unsigned ARMTargetLowering::getJumpTableEncoding() const { + return MachineJumpTableInfo::EK_Inline; +} + SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const { MachineFunction &MF = DAG.getMachineFunction(); Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=108722&r1=108721&r2=108722&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Jul 19 12:18:28 2010 @@ -175,6 +175,8 @@ public: explicit ARMTargetLowering(TargetMachine &TM); + virtual unsigned getJumpTableEncoding(void) const; + virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; /// ReplaceNodeResults - Replace the results of node with an illegal result From grosbach at apple.com Mon Jul 19 12:19:40 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 19 Jul 2010 17:19:40 -0000 Subject: [llvm-commits] [llvm] r108727 - in /llvm/trunk/lib/Target/ARM: ARMISelLowering.cpp ARMISelLowering.h Message-ID: <20100719171940.8DDAB2A6C12C@llvm.org> Author: grosbach Date: Mon Jul 19 12:19:40 2010 New Revision: 108727 URL: http://llvm.org/viewvc/llvm-project?rev=108727&view=rev Log: revert so I can get the right PR# in the log message. Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.h Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=108727&r1=108726&r2=108727&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Jul 19 12:19:40 2010 @@ -1628,10 +1628,6 @@ return DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Res); } -unsigned ARMTargetLowering::getJumpTableEncoding() const { - return MachineJumpTableInfo::EK_Inline; -} - SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const { MachineFunction &MF = DAG.getMachineFunction(); Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=108727&r1=108726&r2=108727&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Jul 19 12:19:40 2010 @@ -175,8 +175,6 @@ public: explicit ARMTargetLowering(TargetMachine &TM); - virtual unsigned getJumpTableEncoding(void) const; - virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; /// ReplaceNodeResults - Replace the results of node with an illegal result From grosbach at apple.com Mon Jul 19 12:20:38 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 19 Jul 2010 17:20:38 -0000 Subject: [llvm-commits] [llvm] r108730 - in /llvm/trunk/lib/Target/ARM: ARMISelLowering.cpp ARMISelLowering.h Message-ID: <20100719172038.469F82A6C12C@llvm.org> Author: grosbach Date: Mon Jul 19 12:20:38 2010 New Revision: 108730 URL: http://llvm.org/viewvc/llvm-project?rev=108730&view=rev Log: Since ARM emits inline jump tables as part of the ConstantIsland pass, it should set the jump table encloding the EK_Inline. This prevents a second, unused, copy of the table from being emitted after the function body. PR6581. Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.h Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=108730&r1=108729&r2=108730&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Jul 19 12:20:38 2010 @@ -1628,6 +1628,10 @@ return DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Res); } +unsigned ARMTargetLowering::getJumpTableEncoding() const { + return MachineJumpTableInfo::EK_Inline; +} + SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const { MachineFunction &MF = DAG.getMachineFunction(); Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=108730&r1=108729&r2=108730&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Jul 19 12:20:38 2010 @@ -175,6 +175,8 @@ public: explicit ARMTargetLowering(TargetMachine &TM); + virtual unsigned getJumpTableEncoding(void) const; + virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; /// ReplaceNodeResults - Replace the results of node with an illegal result From dalej at apple.com Mon Jul 19 12:40:16 2010 From: dalej at apple.com (Dale Johannesen) Date: Mon, 19 Jul 2010 10:40:16 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r108554 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp In-Reply-To: <0AD86F36-DA36-43F9-84EF-FB2DD517C18D@apple.com> References: <20100716210032.1BE872A6C12C@llvm.org> <0AD86F36-DA36-43F9-84EF-FB2DD517C18D@apple.com> Message-ID: On Jul 19, 2010, at 9:20 AMPDT, Bob Wilson wrote: > Dale, I don't think this is correct, at least for ARM. The 'p' > constraint is for a memory address, not the actual memory > reference. If I remember correctly, the use of this reported in > pr4521 was kind of questionable, and I haven't yet looked in any > detail at pr5314 and pr5533. Maybe we can talk about this in person > sometime today. It wouldn't surprise me if "p" isn't completely correct yet; inline asm is implemented incrementally as bugs are found in it. I believe this one is an improvement, but could be wrong. Do you know of anything it breaks? > On Jul 16, 2010, at 2:00 PM, Dale Johannesen wrote: > >> Author: johannes >> Date: Fri Jul 16 16:00:31 2010 >> New Revision: 108554 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=108554&view=rev >> Log: >> "p" constraint is a form of "m", not "r". PR 5314. >> >> >> Modified: >> llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp >> >> Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=108554&r1=108553&r2=108554&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) >> +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Jul 16 16:00:31 2010 >> @@ -4429,12 +4429,11 @@ >> continue; >> } >> >> - // Translate 'p' to 'r'. This is supposed to check for a >> valid memory >> + // Translate 'p' to 'm'. This is supposed to check for a >> valid memory >> // address, but for inline assembly there is no way to know the >> mode of >> - // the data being addressed. Assume that a general register >> is always >> - // a valid address. >> + // the data being addressed. >> if (ConstraintChar == 'p') >> - ConstraintChar = 'r'; >> + ConstraintChar = 'm'; >> >> // See if this is a regclass constraint. >> unsigned RegClass; >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From dpatel at apple.com Mon Jul 19 12:53:55 2010 From: dpatel at apple.com (Devang Patel) Date: Mon, 19 Jul 2010 17:53:55 -0000 Subject: [llvm-commits] [llvm] r108731 - in /llvm/trunk: lib/CodeGen/AsmPrinter/DwarfDebug.cpp test/DebugInfo/2010-07-19-Crash.ll Message-ID: <20100719175355.653482A6C12C@llvm.org> Author: dpatel Date: Mon Jul 19 12:53:55 2010 New Revision: 108731 URL: http://llvm.org/viewvc/llvm-project?rev=108731&view=rev Log: Fix PR 7662. Do not try to insert local variable info to a DIE used for function declaration. Added: llvm/trunk/test/DebugInfo/2010-07-19-Crash.ll Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=108731&r1=108730&r2=108731&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Jul 19 12:53:55 2010 @@ -2032,6 +2032,7 @@ if (!SP.Verify()) continue; // Collect info for variables that were optimized out. + if (!SP.isDefinition()) continue; StringRef FName = SP.getLinkageName(); if (FName.empty()) FName = SP.getName(); Added: llvm/trunk/test/DebugInfo/2010-07-19-Crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-07-19-Crash.ll?rev=108731&view=auto ============================================================================== --- llvm/trunk/test/DebugInfo/2010-07-19-Crash.ll (added) +++ llvm/trunk/test/DebugInfo/2010-07-19-Crash.ll Mon Jul 19 12:53:55 2010 @@ -0,0 +1,24 @@ +; RUN: llc -o /dev/null < %s +; PR7662 +; Do not add variables to !11 because it is a declaration entry. + +define i32 @bar() nounwind readnone ssp { +entry: + ret i32 42, !dbg !9 +} + +!llvm.dbg.sp = !{!0, !6, !11} +!llvm.dbg.lv.foo = !{!7} + +!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"bar", metadata !"bar", metadata !"bar", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 ()* @bar} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 524329, metadata !"one.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 524305, i32 0, i32 12, metadata !"one.c", metadata !".", metadata !"clang 2.8", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!4 = metadata !{metadata !5} +!5 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 7, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 true, null} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 7, metadata !3, i1 true, i1 false, i32 0, i32 0, null, i1 false, i1 true, null} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 524544, metadata !8, metadata !"one", metadata !1, i32 8, metadata !5} ; [ DW_TAG_auto_variable ] +!8 = metadata !{i32 524299, metadata !6, i32 7, i32 18} ; [ DW_TAG_lexical_block ] +!9 = metadata !{i32 4, i32 3, metadata !10, null} +!10 = metadata !{i32 524299, metadata !0, i32 3, i32 11} ; [ DW_TAG_lexical_block ] From dalej at apple.com Mon Jul 19 12:56:21 2010 From: dalej at apple.com (Dale Johannesen) Date: Mon, 19 Jul 2010 10:56:21 -0700 Subject: [llvm-commits] [llvm] r108639 - /llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp In-Reply-To: <2AD332F8-BCA8-44CA-89B6-F957DE67F33E@apple.com> References: <20100718084754.EB5022A6C12C@llvm.org> <9A1C9E46-38B4-4B1E-9B56-2DA374BF9E8A@apple.com> <15083EB0-FA01-4730-88DF-2B92CB0FB549@mac.com> <93873D0A-7686-47FD-8B2B-EEB48F83226D@mac.com> <74CCA0EE-E64A-4FD9-B697-CF4E6D2CE1C3@apple.com> <8E04AB0D-30A8-4A52-9D6B-3CB0F0FB3F96@mac.com> <2AD332F8-BCA8-44CA-89B6-F957DE67F33E@apple.com> Message-ID: On Jul 18, 2010, at 1:12 PMPDT, Chris Lattner wrote: > On Jul 18, 2010, at 1:02 PM, Owen Anderson wrote: > On Jul 18, 2010, at 12:52 PM, Chris Lattner wrote: >>> >>> I would prefer for this to happen in InstCombiner::visitFPTrunc. >>> Both because we already have the infrastructure to do this there, >>> but also because your code only handles the -fno-math-errno case. >>> Normal calls to libm sqrt should be transformed, not just llvm.sqrt. >> >> Do we really want InstCombine assigning semantic value to random >> functions named sqrt()? I understand SimplifyLibCalls doing this, >> since it implicitly assumes that we're using libc, but I'm wary of >> making InstCombine assume it. > > Yes we do. When/if we support -fno-builtin-sqrt, we will do this by > adding a "not a builtin" function attribute, which optimizations > like this should listen to. This is adding the assumption that the source language is C-based, or otherwise has a sqrt (as Fortran). So far this assumption has been quarantined in SimplifyLibCalls. From clattner at apple.com Mon Jul 19 12:57:46 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Jul 2010 10:57:46 -0700 Subject: [llvm-commits] [llvm] r108639 - /llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp In-Reply-To: References: <20100718084754.EB5022A6C12C@llvm.org> <9A1C9E46-38B4-4B1E-9B56-2DA374BF9E8A@apple.com> <15083EB0-FA01-4730-88DF-2B92CB0FB549@mac.com> <93873D0A-7686-47FD-8B2B-EEB48F83226D@mac.com> <74CCA0EE-E64A-4FD9-B697-CF4E6D2CE1C3@apple.com> <8E04AB0D-30A8-4A52-9D6B-3CB0F0FB3F96@mac.com> <2AD332F8-BCA8-44CA-89B6-F957DE67F33E@apple.com> Message-ID: On Jul 19, 2010, at 10:56 AM, Dale Johannesen wrote: > > On Jul 18, 2010, at 1:12 PMPDT, Chris Lattner wrote: > >> On Jul 18, 2010, at 1:02 PM, Owen Anderson wrote: >> On Jul 18, 2010, at 12:52 PM, Chris Lattner wrote: >>>> >>>> I would prefer for this to happen in InstCombiner::visitFPTrunc. Both because we already have the infrastructure to do this there, but also because your code only handles the -fno-math-errno case. Normal calls to libm sqrt should be transformed, not just llvm.sqrt. >>> >>> Do we really want InstCombine assigning semantic value to random functions named sqrt()? I understand SimplifyLibCalls doing this, since it implicitly assumes that we're using libc, but I'm wary of making InstCombine assume it. >> >> Yes we do. When/if we support -fno-builtin-sqrt, we will do this by adding a "not a builtin" function attribute, which optimizations like this should listen to. > > This is adding the assumption that the source language is C-based, No, this is just making the assumption that libm is in the address space. This is not true for kernels, but is true for just about every user application, no matter what language it is written in. > or otherwise has a sqrt (as Fortran). So far this assumption has been quarantined in SimplifyLibCalls. Yep, someone who cares should really implement -fno-builtin-foo support. -Chris From dalej at apple.com Mon Jul 19 13:22:06 2010 From: dalej at apple.com (Dale Johannesen) Date: Mon, 19 Jul 2010 18:22:06 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108732 - /llvm-gcc-4.2/trunk/gcc/cp/decl.c Message-ID: <20100719182206.31E862A6C12C@llvm.org> Author: johannes Date: Mon Jul 19 13:22:06 2010 New Revision: 108732 URL: http://llvm.org/viewvc/llvm-project?rev=108732&view=rev Log: Apply another copy of the fix for 7729514 to the duplicate code in the C++ FE. 8195660. Modified: llvm-gcc-4.2/trunk/gcc/cp/decl.c Modified: llvm-gcc-4.2/trunk/gcc/cp/decl.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/decl.c?rev=108732&r1=108731&r2=108732&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/cp/decl.c (original) +++ llvm-gcc-4.2/trunk/gcc/cp/decl.c Mon Jul 19 13:22:06 2010 @@ -377,7 +377,10 @@ /* Avoid crashing later. */ define_label (location, DECL_NAME (label)); } - else if (!TREE_USED (label)) +/* LLVM LOCAL begin 8204109 */ + else if (!TREE_USED (label) && + strncmp (IDENTIFIER_POINTER (DECL_NAME (label)), "LASM$", 5) != 0) +/* LLVM LOCAL end */ warning (OPT_Wunused_label, "label %q+D defined but not used", label); } From dalej at apple.com Mon Jul 19 13:22:40 2010 From: dalej at apple.com (Dale Johannesen) Date: Mon, 19 Jul 2010 18:22:40 -0000 Subject: [llvm-commits] [llvm] r108733 - /llvm/trunk/test/FrontendC++/2010-07-19-nowarn.cpp Message-ID: <20100719182240.ECAEC2A6C12C@llvm.org> Author: johannes Date: Mon Jul 19 13:22:40 2010 New Revision: 108733 URL: http://llvm.org/viewvc/llvm-project?rev=108733&view=rev Log: Testcase for 108732 (8195660). Added: llvm/trunk/test/FrontendC++/2010-07-19-nowarn.cpp Added: llvm/trunk/test/FrontendC++/2010-07-19-nowarn.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FrontendC%2B%2B/2010-07-19-nowarn.cpp?rev=108733&view=auto ============================================================================== --- llvm/trunk/test/FrontendC++/2010-07-19-nowarn.cpp (added) +++ llvm/trunk/test/FrontendC++/2010-07-19-nowarn.cpp Mon Jul 19 13:22:40 2010 @@ -0,0 +1,21 @@ +// RUN: %llvmgcc %s -c -m32 -fasm-blocks -o /dev/null +// This should not warn about unreferenced label. 8195660. +// XFAIL: * +// XTARGET: x86,i386,i686 + +void quarterAsm(int array[], int len) +{ + __asm + { + mov esi, array; + mov ecx, len; + shr ecx, 2; +loop: + movdqa xmm0, [esi]; + psrad xmm0, 2; + movdqa [esi], xmm0; + add esi, 16; + sub ecx, 1; + jnz loop; + } +} From xerxes at zafena.se Mon Jul 19 13:32:18 2010 From: xerxes at zafena.se (Xerxes Ranby) Date: Mon, 19 Jul 2010 20:32:18 +0200 Subject: [llvm-commits] [patch] v2 PR7608 ARMv4 JIT forgets to set the lr register when making a indirect function call In-Reply-To: References: <4C3A4388.1040703@zafena.se> <4C3B79BF.3080303@zafena.se> Message-ID: <4C449A32.7060101@zafena.se> Bob Wilson wrote: > On Jul 12, 2010, at 1:23 PM, Xerxes Ranby wrote: > >> Bob Wilson wrote: >> >>> I don't think this is good enough. The "mov lr, pc" instruction must be emitted immediately before the call. I don't know how to do that without making all the "call_nolink" instructions into pseudo-instructions. >>> >> Where can I find documentation on what pseudo instructions are and how pseudo instructions can resolve this kind of situation? >> > > Look at ARMCodeEmitter::emitPseudoInstruction for some examples. Basically you would just change the "call_nolink" instructions to be marked as pseudo instructions and then add code to ARMCodeEmitter to generate both the "mov lr, pc" and "bx" instructions together Hi I have attached a new patch that basicaly implements what Bob suggested, thank you Bob, it marks all the ARM "call_nolink" instructions as pseudo instructions and adds code to ARMCodeEmitter to generate both the "mov lr, pc" and the branch instructions together. My own testing indicates that this work very well and fixes the PR7608 bug without introducing any new test regressions. Index: llvm/lib/Target/ARM/ARMInstrInfo.td =================================================================== --- llvm.orig/lib/Target/ARM/ARMInstrInfo.td 2010-07-13 17:41:01.000000000 +0200 +++ llvm/lib/Target/ARM/ARMInstrInfo.td 2010-07-19 17:11:19.000000000 +0200 @@ -961,7 +961,7 @@ // ARMv4T // Note: Restrict $func to the tGPR regclass to prevent it being in LR. - def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tbx\t$func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, HasV4T, IsNotDarwin]> { @@ -971,7 +971,7 @@ } // ARMv4 - def BMOVPCRX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BMOVPCRX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, NoV4T, IsNotDarwin]> { @@ -1010,7 +1010,7 @@ // ARMv4T // Note: Restrict $func to the tGPR regclass to prevent it being in LR. - def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tbx\t$func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, HasV4T, IsDarwin]> { @@ -1020,7 +1020,7 @@ } // ARMv4 - def BMOVPCRXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BMOVPCRXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, NoV4T, IsDarwin]> { Index: llvm/lib/Target/ARM/ARMCodeEmitter.cpp =================================================================== --- llvm.orig/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-13 17:41:01.000000000 +0200 +++ llvm/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-19 17:20:26.000000000 +0200 @@ -654,6 +654,16 @@ switch (Opcode) { default: llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction"); + case ARM::BX: + case ARM::BMOVPCRX: + case ARM::BXr9: + case ARM::BMOVPCRXr9: { + // First emit mov lr, pc + emitWordLE(0xe1a0e00f); + // and then emit the branch. + emitMiscBranchInstruction(MI); + break; + } case TargetOpcode::INLINEASM: { // We allow inline assembler nodes with empty bodies - they can // implicitly define registers, which is ok for JIT. Ok to push? Cheers Xerxes -------------- next part -------------- A non-text attachment was scrubbed... Name: rawMOVLRPC.patch Type: text/x-patch Size: 2515 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20100719/010f3356/attachment.bin From stoklund at 2pi.dk Mon Jul 19 13:41:20 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 18:41:20 -0000 Subject: [llvm-commits] [llvm] r108734 - in /llvm/trunk/lib/CodeGen: InlineSpiller.cpp RegAllocLinearScan.cpp Spiller.cpp Spiller.h Message-ID: <20100719184120.B0C062A6C12C@llvm.org> Author: stoklund Date: Mon Jul 19 13:41:20 2010 New Revision: 108734 URL: http://llvm.org/viewvc/llvm-project?rev=108734&view=rev Log: Spillers may alter MachineLoopInfo when breaking critical edges, so make it non-const. Modified: llvm/trunk/lib/CodeGen/InlineSpiller.cpp llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp llvm/trunk/lib/CodeGen/Spiller.cpp llvm/trunk/lib/CodeGen/Spiller.h Modified: llvm/trunk/lib/CodeGen/InlineSpiller.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/InlineSpiller.cpp?rev=108734&r1=108733&r2=108734&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/InlineSpiller.cpp (original) +++ llvm/trunk/lib/CodeGen/InlineSpiller.cpp Mon Jul 19 13:41:20 2010 @@ -18,6 +18,7 @@ #include "llvm/CodeGen/LiveIntervalAnalysis.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetInstrInfo.h" @@ -30,6 +31,7 @@ class InlineSpiller : public Spiller { MachineFunction &mf_; LiveIntervals &lis_; + MachineLoopInfo &loops_; VirtRegMap &vrm_; MachineFrameInfo &mfi_; MachineRegisterInfo &mri_; @@ -53,8 +55,9 @@ ~InlineSpiller() {} public: - InlineSpiller(MachineFunction *mf, LiveIntervals *lis, VirtRegMap *vrm) - : mf_(*mf), lis_(*lis), vrm_(*vrm), + InlineSpiller(MachineFunction *mf, LiveIntervals *lis, MachineLoopInfo *mli, + VirtRegMap *vrm) + : mf_(*mf), lis_(*lis), loops_(*mli), vrm_(*vrm), mfi_(*mf->getFrameInfo()), mri_(mf->getRegInfo()), tii_(*mf->getTarget().getInstrInfo()), @@ -82,9 +85,9 @@ namespace llvm { Spiller *createInlineSpiller(MachineFunction *mf, LiveIntervals *lis, - const MachineLoopInfo *mli, + MachineLoopInfo *mli, VirtRegMap *vrm) { - return new InlineSpiller(mf, lis, vrm); + return new InlineSpiller(mf, lis, mli, vrm); } } Modified: llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp?rev=108734&r1=108733&r2=108734&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp (original) +++ llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp Mon Jul 19 13:41:20 2010 @@ -127,7 +127,7 @@ BitVector allocatableRegs_; LiveIntervals* li_; LiveStacks* ls_; - const MachineLoopInfo *loopInfo; + MachineLoopInfo *loopInfo; /// handled_ - Intervals are added to the handled_ set in the order of their /// start value. This is uses for backtracking. @@ -799,7 +799,7 @@ static float getConflictWeight(LiveInterval *cur, unsigned Reg, LiveIntervals *li_, MachineRegisterInfo *mri_, - const MachineLoopInfo *loopInfo) { + MachineLoopInfo *loopInfo) { float Conflicts = 0; for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(Reg), E = mri_->reg_end(); I != E; ++I) { Modified: llvm/trunk/lib/CodeGen/Spiller.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Spiller.cpp?rev=108734&r1=108733&r2=108734&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/Spiller.cpp (original) +++ llvm/trunk/lib/CodeGen/Spiller.cpp Mon Jul 19 13:41:20 2010 @@ -193,10 +193,10 @@ class StandardSpiller : public Spiller { protected: LiveIntervals *lis; - const MachineLoopInfo *loopInfo; + MachineLoopInfo *loopInfo; VirtRegMap *vrm; public: - StandardSpiller(LiveIntervals *lis, const MachineLoopInfo *loopInfo, + StandardSpiller(LiveIntervals *lis, MachineLoopInfo *loopInfo, VirtRegMap *vrm) : lis(lis), loopInfo(loopInfo), vrm(vrm) {} @@ -222,7 +222,7 @@ class SplittingSpiller : public StandardSpiller { public: SplittingSpiller(MachineFunction *mf, LiveIntervals *lis, - const MachineLoopInfo *loopInfo, VirtRegMap *vrm) + MachineLoopInfo *loopInfo, VirtRegMap *vrm) : StandardSpiller(lis, loopInfo, vrm) { mri = &mf->getRegInfo(); @@ -508,12 +508,12 @@ namespace llvm { Spiller *createInlineSpiller(MachineFunction*, LiveIntervals*, - const MachineLoopInfo*, + MachineLoopInfo*, VirtRegMap*); } llvm::Spiller* llvm::createSpiller(MachineFunction *mf, LiveIntervals *lis, - const MachineLoopInfo *loopInfo, + MachineLoopInfo *loopInfo, VirtRegMap *vrm) { switch (spillerOpt) { default: assert(0 && "unknown spiller"); Modified: llvm/trunk/lib/CodeGen/Spiller.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Spiller.h?rev=108734&r1=108733&r2=108734&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/Spiller.h (original) +++ llvm/trunk/lib/CodeGen/Spiller.h Mon Jul 19 13:41:20 2010 @@ -51,7 +51,7 @@ /// Create and return a spiller object, as specified on the command line. Spiller* createSpiller(MachineFunction *mf, LiveIntervals *li, - const MachineLoopInfo *loopInfo, VirtRegMap *vrm); + MachineLoopInfo *loopInfo, VirtRegMap *vrm); } #endif From evan.cheng at apple.com Mon Jul 19 13:47:01 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Jul 2010 18:47:01 -0000 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp Message-ID: <20100719184701.BD0E92A6C12C@llvm.org> Author: evancheng Date: Mon Jul 19 13:47:01 2010 New Revision: 108735 URL: http://llvm.org/viewvc/llvm-project?rev=108735&view=rev Log: Teach computeRegisterProperties() to compute "representative" register class for legal value types. A "representative" register class is the largest legal super-reg register class for a value type. e.g. On i386, GR32 is the rep register class for i8 / i16 / i32; on x86_64 it would be GR64. This property will be used by the register pressure tracking instruction scheduler. Modified: llvm/trunk/include/llvm/Target/TargetLowering.h llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Modified: llvm/trunk/include/llvm/Target/TargetLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=108735&r1=108734&r2=108735&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetLowering.h (original) +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Jul 19 13:47:01 2010 @@ -168,6 +168,18 @@ return RC; } + /// getRepRegClassFor - Return the 'representative' register class for the + /// specified value type. The 'representative' register class is the largest + /// legal super-reg register class for the register class of the value type. + /// For example, on i386 the rep register class for i8, i16, and i32 are GR32; + /// while the rep register class is GR64 on x86_64. + virtual const TargetRegisterClass *getRepRegClassFor(EVT VT) const { + assert(VT.isSimple() && "getRegClassFor called on illegal type!"); + const TargetRegisterClass *RC = RepRegClassForVT[VT.getSimpleVT().SimpleTy]; + assert(RC && "This value type is not natively supported!"); + return RC; + } + /// isTypeLegal - Return true if the target has native support for the /// specified value type. This means that it has a register that directly /// holds it without promotions or expansions. @@ -1562,6 +1574,12 @@ unsigned char NumRegistersForVT[MVT::LAST_VALUETYPE]; EVT RegisterTypeForVT[MVT::LAST_VALUETYPE]; + /// RepRegClassForVT - This indicates the "representative" register class to + /// use for each ValueType the target supports natively. This information is + /// used by the scheduler to track register pressure. e.g. On x86, i8, i16, + /// and i32's representative class would be GR32. + const TargetRegisterClass *RepRegClassForVT[MVT::LAST_VALUETYPE]; + /// Synthesizable indicates whether it is OK for the compiler to create new /// operations using this type. All Legal types are Synthesizable except /// MMX types on X86. Non-Legal types are not Synthesizable. @@ -1672,6 +1690,20 @@ /// This field specifies whether the target can benefit from code placement /// optimization. bool benefitFromCodePlacementOpt; + +private: + /// isLegalRC - Return true if the value types that can be represented by the + /// specified register class are all legal. + bool isLegalRC(const TargetRegisterClass *RC) const; + + /// hasLegalSuperRegRegClasses - Return true if the specified register class + /// has one or more super-reg register classes that are legal. + bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC); + + /// findRepresentativeClass - Return the largest legal super-reg register class + /// of the specified register class. + const TargetRegisterClass * + findRepresentativeClass(const TargetRegisterClass *RC); }; /// GetReturnInfo - Given an LLVM IR type and return type attributes, Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=108735&r1=108734&r2=108735&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Jul 19 13:47:01 2010 @@ -651,6 +651,50 @@ return NumVectorRegs; } +/// isLegalRC - Return true if the value types that can be represented by the +/// specified register class are all legal. +bool TargetLowering::isLegalRC(const TargetRegisterClass *RC) const { + for (TargetRegisterClass::vt_iterator I = RC->vt_begin(), E = RC->vt_end(); + I != E; ++I) { + if (isTypeLegal(*I)) + return true; + } + return false; +} + +/// hasLegalSuperRegRegClasses - Return true if the specified register class +/// has one or more super-reg register classes that are legal. +bool TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) { + if (*RC->superregclasses_begin() == 0) + return false; + for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(), + E = RC->superregclasses_end(); I != E; ++I) { + const TargetRegisterClass *RRC = *I; + if (isLegalRC(RRC)) + return true; + } + return false; +} + +/// findRepresentativeClass - Return the largest legal super-reg register class +/// of the specified register class. +const TargetRegisterClass * +TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) { + if (!RC) return 0; + + const TargetRegisterClass *BestRC = RC; + for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(), + E = RC->superregclasses_end(); I != E; ++I) { + const TargetRegisterClass *RRC = *I; + if (RRC->isASubClass() || !isLegalRC(RRC)) + continue; + if (!hasLegalSuperRegRegClasses(RRC)) + return RRC; + BestRC = RRC; + } + return BestRC; +} + /// computeRegisterProperties - Once all of the register classes are added, /// this allows us to compute derived properties we expose. void TargetLowering::computeRegisterProperties() { @@ -770,6 +814,14 @@ } } } + + // Determine the 'representative' register class for each value type. + // An representative register class is the largest (meaning one which is + // not a sub-register class / subreg register class) legal register class for + // a group of value types. For example, on i386, i8, i16, and i32 + // representative would be GR32; while on x86_64 it's GR64. + for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) + RepRegClassForVT[i] = findRepresentativeClass(RegClassForVT[i]); } const char *TargetLowering::getTargetNodeName(unsigned Opcode) const { From resistor at mac.com Mon Jul 19 14:23:33 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 19:23:33 -0000 Subject: [llvm-commits] [llvm] r108736 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Message-ID: <20100719192333.1B6132A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 14:23:32 2010 New Revision: 108736 URL: http://llvm.org/viewvc/llvm-project?rev=108736&view=rev Log: Tweak per Chris' comments. Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=108736&r1=108735&r2=108736&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Mon Jul 19 14:23:32 2010 @@ -1106,19 +1106,20 @@ Call->getNumArgOperands() == 1) { CastInst *Arg = dyn_cast(Call->getArgOperand(0)); if (Arg && Arg->getOpcode() == Instruction::FPExt && - CI.getType() == Builder->getFloatTy() && - Call->getType() == Builder->getDoubleTy() && - Arg->getType() == Builder->getDoubleTy() && - Arg->getOperand(0)->getType() == Builder->getFloatTy()) { - Module* M = CI.getParent()->getParent()->getParent(); + CI.getType()->isFloatTy() && + Call->getType()->isDoubleTy() && + Arg->getType()->isDoubleTy() && + Arg->getOperand(0)->getType()->isFloatTy()) { + Function *Callee = Call->getCalledFunction(); + Module *M = CI.getParent()->getParent()->getParent(); Constant* SqrtfFunc = M->getOrInsertFunction("sqrtf", - Call->getAttributes(), + Callee->getAttributes(), Builder->getFloatTy(), Builder->getFloatTy(), NULL); CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0), "sqrtfcall"); - ret->setAttributes(Call->getAttributes()); + ret->setAttributes(Callee->getAttributes()); return ret; } } From resistor at mac.com Mon Jul 19 14:24:38 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 19:24:38 -0000 Subject: [llvm-commits] [llvm] r108737 - /llvm/trunk/autoconf/configure.ac Message-ID: <20100719192438.114CC2A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 14:24:37 2010 New Revision: 108737 URL: http://llvm.org/viewvc/llvm-project?rev=108737&view=rev Log: Add support for detecting and the getsect() function. Modified: llvm/trunk/autoconf/configure.ac Modified: llvm/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/autoconf/configure.ac?rev=108737&r1=108736&r2=108737&view=diff ============================================================================== --- llvm/trunk/autoconf/configure.ac (original) +++ llvm/trunk/autoconf/configure.ac Mon Jul 19 14:24:37 2010 @@ -1287,6 +1287,9 @@ dnl Try to find Darwin specific crash reporting library. AC_CHECK_HEADERS([CrashReporterClient.h]) +dnl Try to find Darwin specific linker-section library. +AC_CHECK_HEADERS([mach-o/getsect.h]) + dnl===-----------------------------------------------------------------------=== dnl=== dnl=== SECTION 7: Check for types and structures @@ -1362,6 +1365,22 @@ AC_DEFINE(LLVM_MULTITHREADED, 0, Build multithreading support into LLVM) AC_MSG_WARN([LLVM will be built thread-unsafe because atomic builtins are missing])) +dnl Check for Darwin-specific getsect(). +AC_MSG_CHECKING(for getsect()) +AC_COMPILE_IFELSE( + AC_LANG_SOURCE( + [[#include + int main() { + unsigned long p; + return (int)getsect("__DATA","??__pass_info", &p); + } + ]]), + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_GETSECT, 1, Have Darwin getsect() support), + AC_MSG_RESULT(no) + AC_DEFINE(HAVE_GETSECT, 1, Have Darwin getsect() support) +) + dnl===-----------------------------------------------------------------------=== dnl=== From resistor at mac.com Mon Jul 19 14:24:55 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 19:24:55 -0000 Subject: [llvm-commits] [llvm] r108738 - in /llvm/trunk: configure include/llvm/Config/config.h.in Message-ID: <20100719192455.A60862A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 14:24:55 2010 New Revision: 108738 URL: http://llvm.org/viewvc/llvm-project?rev=108738&view=rev Log: Regenerate. Modified: llvm/trunk/configure llvm/trunk/include/llvm/Config/config.h.in Modified: llvm/trunk/configure URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/configure?rev=108738&r1=108737&r2=108738&view=diff ============================================================================== --- llvm/trunk/configure (original) +++ llvm/trunk/configure Mon Jul 19 14:24:55 2010 @@ -17120,6 +17120,176 @@ +for ac_header in mach-o/getsect.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ----------------------------------- ## +## Report this to llvmbugs at cs.uiuc.edu ## +## ----------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + { echo "$as_me:$LINENO: checking for HUGE_VAL sanity" >&5 @@ -20066,6 +20236,78 @@ rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext +{ echo "$as_me:$LINENO: checking for getsect()" >&5 +echo $ECHO_N "checking for getsect()... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + int main() { + unsigned long p; + return (int)getsect("__DATA","??__pass_info", &p); + } + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETSECT 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETSECT 1 +_ACEOF + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$llvm_cv_os_type" = "Linux" -a "$llvm_cv_target_arch" = "x86_64" ; then Modified: llvm/trunk/include/llvm/Config/config.h.in URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Config/config.h.in?rev=108738&r1=108737&r2=108738&view=diff ============================================================================== --- llvm/trunk/include/llvm/Config/config.h.in (original) +++ llvm/trunk/include/llvm/Config/config.h.in Mon Jul 19 14:24:55 2010 @@ -145,6 +145,9 @@ /* Define to 1 if you have the `getrusage' function. */ #undef HAVE_GETRUSAGE +/* Have Darwin getsect() support */ +#undef HAVE_GETSECT + /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY @@ -218,6 +221,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MACH_O_DYLD_H +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_O_GETSECT_H + /* Define if mallinfo() is available on this platform. */ #undef HAVE_MALLINFO From resistor at mac.com Mon Jul 19 14:41:53 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 19:41:53 -0000 Subject: [llvm-commits] [llvm] r108739 - /llvm/trunk/autoconf/configure.ac Message-ID: <20100719194153.1C5962A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 14:41:52 2010 New Revision: 108739 URL: http://llvm.org/viewvc/llvm-project?rev=108739&view=rev Log: Remove extraneous character. Modified: llvm/trunk/autoconf/configure.ac Modified: llvm/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/autoconf/configure.ac?rev=108739&r1=108738&r2=108739&view=diff ============================================================================== --- llvm/trunk/autoconf/configure.ac (original) +++ llvm/trunk/autoconf/configure.ac Mon Jul 19 14:41:52 2010 @@ -1372,7 +1372,7 @@ [[#include int main() { unsigned long p; - return (int)getsect("__DATA","??__pass_info", &p); + return (int)getsect("__DATA","__pass_info", &p); } ]]), AC_MSG_RESULT(yes) From resistor at mac.com Mon Jul 19 14:42:02 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 19:42:02 -0000 Subject: [llvm-commits] [llvm] r108740 - /llvm/trunk/configure Message-ID: <20100719194202.1ABB92A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 14:42:01 2010 New Revision: 108740 URL: http://llvm.org/viewvc/llvm-project?rev=108740&view=rev Log: Regenerate. Modified: llvm/trunk/configure Modified: llvm/trunk/configure URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/configure?rev=108740&r1=108739&r2=108740&view=diff ============================================================================== --- llvm/trunk/configure (original) +++ llvm/trunk/configure Mon Jul 19 14:42:01 2010 @@ -20247,7 +20247,7 @@ #include int main() { unsigned long p; - return (int)getsect("__DATA","??__pass_info", &p); + return (int)getsect("__DATA","__pass_info", &p); } _ACEOF From stoklund at 2pi.dk Mon Jul 19 14:59:05 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 12:59:05 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <20100719184701.BD0E92A6C12C@llvm.org> References: <20100719184701.BD0E92A6C12C@llvm.org> Message-ID: On Jul 19, 2010, at 11:47 AM, Evan Cheng wrote: > Author: evancheng > Date: Mon Jul 19 13:47:01 2010 > New Revision: 108735 > > URL: http://llvm.org/viewvc/llvm-project?rev=108735&view=rev > Log: > Teach computeRegisterProperties() to compute "representative" register class for legal value types. A "representative" register class is the largest legal super-reg register class for a value type. e.g. On i386, GR32 is the rep register class for i8 / i16 / i32; on x86_64 it would be GR64. > > This property will be used by the register pressure tracking instruction scheduler. Hi Evan, This looks a lot like you have x86 in mind. What is getRepRegClassFor(f32) going to return on ARM? QQQQ? How are you planning to deal with registers with more than one usable subregister? /jakob From evan.cheng at apple.com Mon Jul 19 15:11:21 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Jul 2010 13:11:21 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: References: <20100719184701.BD0E92A6C12C@llvm.org> Message-ID: <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> On Jul 19, 2010, at 12:59 PM, Jakob Stoklund Olesen wrote: > > On Jul 19, 2010, at 11:47 AM, Evan Cheng wrote: > >> Author: evancheng >> Date: Mon Jul 19 13:47:01 2010 >> New Revision: 108735 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=108735&view=rev >> Log: >> Teach computeRegisterProperties() to compute "representative" register class for legal value types. A "representative" register class is the largest legal super-reg register class for a value type. e.g. On i386, GR32 is the rep register class for i8 / i16 / i32; on x86_64 it would be GR64. >> >> This property will be used by the register pressure tracking instruction scheduler. > > Hi Evan, > > This looks a lot like you have x86 in mind. No. What is x86? :-) > > What is getRepRegClassFor(f32) going to return on ARM? QQQQ? QQ and QQQQ are not legal during isel. It's Q. It's probably overly conservative for tracking. I'm still trying to figure that out. > > How are you planning to deal with registers with more than one usable subregister? I am not sure what you mean? It's ignore sub-register classes (e.g. QPR_VFP2). Evan > > /jakob > From stoklund at 2pi.dk Mon Jul 19 15:22:15 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 13:22:15 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> Message-ID: <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> On Jul 19, 2010, at 1:11 PM, Evan Cheng wrote: > > On Jul 19, 2010, at 12:59 PM, Jakob Stoklund Olesen wrote: > >> >> On Jul 19, 2010, at 11:47 AM, Evan Cheng wrote: >> >>> Author: evancheng >>> Date: Mon Jul 19 13:47:01 2010 >>> New Revision: 108735 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=108735&view=rev >>> Log: >>> Teach computeRegisterProperties() to compute "representative" register class for legal value types. A "representative" register class is the largest legal super-reg register class for a value type. e.g. On i386, GR32 is the rep register class for i8 / i16 / i32; on x86_64 it would be GR64. >>> >>> This property will be used by the register pressure tracking instruction scheduler. >> >> Hi Evan, >> >> This looks a lot like you have x86 in mind. > > No. What is x86? :-) > >> >> What is getRepRegClassFor(f32) going to return on ARM? QQQQ? > > QQ and QQQQ are not legal during isel. It's Q. It's probably overly conservative for tracking. I'm still trying to figure that out. > > >> >> How are you planning to deal with registers with more than one usable subregister? > > I am not sure what you mean? It's ignore sub-register classes (e.g. QPR_VFP2). I meant the same as above - QPR only has 16 registers, but there are 32 DPR registers. If you are counting each DPR as a QPR, you are going to be scheduling as if you only had 16 DPR registers. Can you use some kind of scaling so a DPR counts as 0.5 QPR? From grosbach at apple.com Mon Jul 19 15:31:22 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 19 Jul 2010 20:31:22 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108744 - /llvm-gcc-4.2/trunk/gcc/config/darwin.c Message-ID: <20100719203122.5E4E42A6C12C@llvm.org> Author: grosbach Date: Mon Jul 19 15:31:22 2010 New Revision: 108744 URL: http://llvm.org/viewvc/llvm-project?rev=108744&view=rev Log: Put ObjC method names, method types and class names in separate string literal sections. rdar://8199900 Modified: llvm-gcc-4.2/trunk/gcc/config/darwin.c Modified: llvm-gcc-4.2/trunk/gcc/config/darwin.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/darwin.c?rev=108744&r1=108743&r2=108744&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/darwin.c (original) +++ llvm-gcc-4.2/trunk/gcc/config/darwin.c Mon Jul 19 15:31:22 2010 @@ -1713,10 +1713,7 @@ else if (!strncmp (name, "PROP_NAME_ATTR_", 15)) return "__TEXT,__cstring,cstring_literals"; } else if (flag_objc_abi == 2) { - if (!strncmp (name, "PROP_NAME_ATTR_", 15) - || !strncmp (name, "CLASS_NAME_", 11) - || !strncmp (name, "METH_VAR_NAME_", 14) - || !strncmp (name, "METH_VAR_TYPE_", 14)) + if (!strncmp (name, "PROP_NAME_ATTR_", 15)) return "__TEXT,__cstring,cstring_literals"; else if (!strncmp (name, "CLASSLIST_REFERENCES_", 21)) return "__DATA, __objc_classrefs, regular, no_dead_strip"; @@ -1743,6 +1740,12 @@ else if (!strncmp (name, "CLASS_$_", 8) || !strncmp (name, "METACLASS_$_", 12)) return "__DATA, __objc_data"; + else if (!strncmp (name, "METH_VAR_NAME_", 14)) + return "__TEXT, __objc_methname, cstring_literals"; + else if (!strncmp (name, "METH_VAR_TYPE_", 14)) + return "__TEXT, __objc_methtype, cstring_literals"; + else if (!strncmp (name, "CLASS_NAME_", 11)) + return "__TEXT, __objc_classname, cstring_literals"; } return 0; } From bob.wilson at apple.com Mon Jul 19 15:36:36 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 20:36:36 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108745 - /llvm-gcc-4.2/trunk/GNUmakefile Message-ID: <20100719203636.888A52A6C12C@llvm.org> Author: bwilson Date: Mon Jul 19 15:36:36 2010 New Revision: 108745 URL: http://llvm.org/viewvc/llvm-project?rev=108745&view=rev Log: Don't install libLTO.dylib as part of llvm-gcc. Radar 8169193. Modified: llvm-gcc-4.2/trunk/GNUmakefile Modified: llvm-gcc-4.2/trunk/GNUmakefile URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/GNUmakefile?rev=108745&r1=108744&r2=108745&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/GNUmakefile (original) +++ llvm-gcc-4.2/trunk/GNUmakefile Mon Jul 19 15:36:36 2010 @@ -93,7 +93,7 @@ SYMROOT=$(OBJROOT)/sym-llvmCore \ DSTROOT=$(OBJROOT)/dst-llvmCore llvmCore $(MAKE) LLVMCORE_PATH=$(OBJROOT)/dst-llvmCore/Developer/usr/local \ - INSTALL_LIBLTO=yes llvmgcc42 + INSTALL_LIBLTO=no llvmgcc42 llvmCore: $(OBJROOT) $(SYMROOT) $(DSTROOT) if [ ! -d $(SRC)/llvmCore ]; then \ From daniel at zuster.org Mon Jul 19 15:44:17 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 20:44:17 -0000 Subject: [llvm-commits] [llvm] r108746 - in /llvm/trunk: lib/Target/X86/X86Instr64bit.td lib/Target/X86/X86InstrInfo.td test/MC/AsmParser/X86/x86_32-new-encoder.s test/MC/AsmParser/X86/x86_64-new-encoder.s Message-ID: <20100719204417.36B182A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 15:44:16 2010 New Revision: 108746 URL: http://llvm.org/viewvc/llvm-project?rev=108746&view=rev Log: X86: Mark JMP{32,64}[mr] as requires 32-bit/64-bit mode. They are the same instruction, we only want to allow the one for the current subtarget. - This also fixes suffix matching for jmp instructions, because it eliminates the ambiguity between 'jmpl' and 'jmpq'. Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td llvm/trunk/lib/Target/X86/X86InstrInfo.td llvm/trunk/test/MC/AsmParser/X86/x86_32-new-encoder.s llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Instr64bit.td?rev=108746&r1=108745&r2=108746&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Instr64bit.td (original) +++ llvm/trunk/lib/Target/X86/X86Instr64bit.td Mon Jul 19 15:44:16 2010 @@ -217,9 +217,9 @@ def JMP64pcrel32 : I<0xE9, RawFrm, (outs), (ins brtarget:$dst), "jmp{q}\t$dst", []>; def JMP64r : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst", - [(brind GR64:$dst)]>; + [(brind GR64:$dst)]>, Requires<[In64BitMode]>; def JMP64m : I<0xFF, MRM4m, (outs), (ins i64mem:$dst), "jmp{q}\t{*}$dst", - [(brind (loadi64 addr:$dst))]>; + [(brind (loadi64 addr:$dst))]>, Requires<[In64BitMode]>; def FARJMP64 : RI<0xFF, MRM5m, (outs), (ins opaque80mem:$dst), "ljmp{q}\t{*}$dst", []>; } Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=108746&r1=108745&r2=108746&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Jul 19 15:44:16 2010 @@ -650,9 +650,9 @@ // Indirect branches let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in { def JMP32r : I<0xFF, MRM4r, (outs), (ins GR32:$dst), "jmp{l}\t{*}$dst", - [(brind GR32:$dst)]>; + [(brind GR32:$dst)]>, Requires<[In32BitMode]>; def JMP32m : I<0xFF, MRM4m, (outs), (ins i32mem:$dst), "jmp{l}\t{*}$dst", - [(brind (loadi32 addr:$dst))]>; + [(brind (loadi32 addr:$dst))]>, Requires<[In32BitMode]>; def FARJMP16i : Iseg16<0xEA, RawFrm, (outs), (ins i16imm:$seg, i16imm:$off), Modified: llvm/trunk/test/MC/AsmParser/X86/x86_32-new-encoder.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_32-new-encoder.s?rev=108746&r1=108745&r2=108746&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_32-new-encoder.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_32-new-encoder.s Mon Jul 19 15:44:16 2010 @@ -415,3 +415,6 @@ // CHECK: encoding: [0x61] popal +// CHECK: jmpl *8(%eax) +// CHECK: encoding: [0xff,0x60,0x08] + jmp *8(%eax) Modified: llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s?rev=108746&r1=108745&r2=108746&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_64-new-encoder.s Mon Jul 19 15:44:16 2010 @@ -150,3 +150,6 @@ // CHECK: [0x65,0x8b,0x04,0x25,0x7c,0x00,0x00,0x00] movl %gs:124, %eax +// CHECK: jmpq *8(%rax) +// CHECK: encoding: [0xff,0x60,0x08] + jmp *8(%rax) From daniel at zuster.org Mon Jul 19 15:44:20 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Mon, 19 Jul 2010 20:44:20 -0000 Subject: [llvm-commits] [llvm] r108747 - /llvm/trunk/lib/MC/MCMachOStreamer.cpp Message-ID: <20100719204420.30AFB2A6C12D@llvm.org> Author: ddunbar Date: Mon Jul 19 15:44:20 2010 New Revision: 108747 URL: http://llvm.org/viewvc/llvm-project?rev=108747&view=rev Log: MC/Mach-O: Silently ignore .file directives instead of error'ing out on them. They aren't important enough to abort the entire assembly, and failing early makes testing more annoying. Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=108747&r1=108746&r2=108747&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original) +++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Mon Jul 19 15:44:20 2010 @@ -82,10 +82,16 @@ unsigned char Value = 0); virtual void EmitFileDirective(StringRef Filename) { - report_fatal_error("unsupported directive: '.file'"); + // FIXME: Just ignore the .file; it isn't important enough to fail the + // entire assembly. + + //report_fatal_error("unsupported directive: '.file'"); } virtual void EmitDwarfFileDirective(unsigned FileNo, StringRef Filename) { - report_fatal_error("unsupported directive: '.file'"); + // FIXME: Just ignore the .file; it isn't important enough to fail the + // entire assembly. + + //report_fatal_error("unsupported directive: '.file'"); } virtual void EmitInstruction(const MCInst &Inst); From bob.wilson at apple.com Mon Jul 19 16:29:39 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 21:29:39 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108751 - /llvm-gcc-4.2/trunk/GNUmakefile Message-ID: <20100719212939.910682A6C12C@llvm.org> Author: bwilson Date: Mon Jul 19 16:29:39 2010 New Revision: 108751 URL: http://llvm.org/viewvc/llvm-project?rev=108751&view=rev Log: Don't explicitly set INSTALL_LIBLTO to its default value. Modified: llvm-gcc-4.2/trunk/GNUmakefile Modified: llvm-gcc-4.2/trunk/GNUmakefile URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/GNUmakefile?rev=108751&r1=108750&r2=108751&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/GNUmakefile (original) +++ llvm-gcc-4.2/trunk/GNUmakefile Mon Jul 19 16:29:39 2010 @@ -93,7 +93,7 @@ SYMROOT=$(OBJROOT)/sym-llvmCore \ DSTROOT=$(OBJROOT)/dst-llvmCore llvmCore $(MAKE) LLVMCORE_PATH=$(OBJROOT)/dst-llvmCore/Developer/usr/local \ - INSTALL_LIBLTO=no llvmgcc42 + llvmgcc42 llvmCore: $(OBJROOT) $(SYMROOT) $(DSTROOT) if [ ! -d $(SRC)/llvmCore ]; then \ From bob.wilson at apple.com Mon Jul 19 16:31:16 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 21:31:16 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108752 - /llvm-gcc-4.2/trunk/build_gcc Message-ID: <20100719213116.7D0AF2A6C12C@llvm.org> Author: bwilson Date: Mon Jul 19 16:31:16 2010 New Revision: 108752 URL: http://llvm.org/viewvc/llvm-project?rev=108752&view=rev Log: The llvmCore build now installs only one copy of libLTO.dylib, in the Developer/usr/lib directory, and that copy is already stripped so there's no need to strip it again. Modified: llvm-gcc-4.2/trunk/build_gcc Modified: llvm-gcc-4.2/trunk/build_gcc URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/build_gcc?rev=108752&r1=108751&r2=108752&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/build_gcc (original) +++ llvm-gcc-4.2/trunk/build_gcc Mon Jul 19 16:31:16 2010 @@ -768,18 +768,17 @@ # Install libLTO.dylib if [ "$INSTALL_LIBLTO" == yes ]; then - LTO=$LLVMCORE_PATH/lib/libLTO.dylib - if [ ! -r $LTO ]; then - LTO=$LLVMCORE_PATH/../lib/libLTO.dylib - if [ ! -r $LTO ]; then - echo "Error: llvmCore installation is missing libLTO.dylib" - exit 1 - fi + LTO=$LLVMCORE_PATH/../lib/libLTO.dylib + if [ ! -r $LTO ]; then + echo "Error: llvmCore installation is missing libLTO.dylib" + exit 1 fi mkdir -p $DEST_DIR/Developer/usr/lib cp $LTO $DEST_DIR/Developer/usr/lib/libLTO.dylib - strip -S $DEST_DIR/Developer/usr/lib/libLTO.dylib - + # FIXME: The unstripped libLTO.dylib from llvmCore's SYM_DIR should be + # copied to the current SYM_DIR. Clang is currently responsible for + # installing libLTO.dylib, not llvm-gcc, so it's not worth fixing now. + if [ "x$DISABLE_USR_LINKS" == "x" ]; then # Add a symlink in /usr/lib for B&I. mkdir -p $DEST_DIR/usr/lib/ From bob.wilson at apple.com Mon Jul 19 16:33:07 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 21:33:07 -0000 Subject: [llvm-commits] [llvm] r108753 - /llvm/trunk/utils/buildit/build_llvm Message-ID: <20100719213308.07F282A6C12C@llvm.org> Author: bwilson Date: Mon Jul 19 16:33:07 2010 New Revision: 108753 URL: http://llvm.org/viewvc/llvm-project?rev=108753&view=rev Log: Save a copy of the unstripped libLTO.dylib in $SYM_DIR. Clean up the code for dealing with libLTO.dylib to put it all in one place and to allow use of DISABLE_USR_LINKS. Modified: llvm/trunk/utils/buildit/build_llvm Modified: llvm/trunk/utils/buildit/build_llvm URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/buildit/build_llvm?rev=108753&r1=108752&r2=108753&view=diff ============================================================================== --- llvm/trunk/utils/buildit/build_llvm (original) +++ llvm/trunk/utils/buildit/build_llvm Mon Jul 19 16:33:07 2010 @@ -317,9 +317,20 @@ mkdir -p $DT_HOME/lib mv lib/libLTO.dylib $DT_HOME/lib/libLTO.dylib + # Save a copy of the unstripped dylib + mkdir -p $SYM_DIR/Developer/usr/lib + cp $DT_HOME/lib/libLTO.dylib $SYM_DIR/Developer/usr/lib/libLTO.dylib + # Use '-l' to strip i386 modules. N.B. that flag doesn't work with kext or # PPC objects! strip -arch all -Sl $DT_HOME/lib/libLTO.dylib + + if [ "x$DISABLE_USR_LINKS" == "x" ]; then + # Add a symlink in /usr/lib for B&I. + mkdir -p $DEST_DIR/usr/lib/ + (cd $DEST_DIR/usr/lib && \ + ln -s ../../Developer/usr/lib/libLTO.dylib ./libLTO.dylib) + fi else rm -f lib/libLTO.dylib fi @@ -350,15 +361,6 @@ rm -rf $DEST_DIR$DEST_ROOT/docs ################################################################################ -# symlinks so that B&I can find things - -if [ "$INSTALL_LIBLTO" = "yes" ]; then - mkdir -p $DEST_DIR/usr/lib/ - cd $DEST_DIR/usr/lib && \ - ln -s ../../Developer/usr/lib/libLTO.dylib ./libLTO.dylib -fi - -################################################################################ # w00t! Done! exit 0 From resistor at mac.com Mon Jul 19 16:44:49 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 21:44:49 -0000 Subject: [llvm-commits] [llvm] r108755 - in /llvm/trunk: include/llvm/PassSupport.h lib/VMCore/PassManager.cpp Message-ID: <20100719214449.232A42A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 16:44:48 2010 New Revision: 108755 URL: http://llvm.org/viewvc/llvm-project?rev=108755&view=rev Log: Change the implemented interfaces list on PassInfo from a std::vector to a manually implemented linked list. This is a little slower and involves more malloc'ing, but these lists are typically short, and it allows PassInfo to be entirely constant initializable. Modified: llvm/trunk/include/llvm/PassSupport.h llvm/trunk/lib/VMCore/PassManager.cpp Modified: llvm/trunk/include/llvm/PassSupport.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=108755&r1=108754&r2=108755&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassSupport.h (original) +++ llvm/trunk/include/llvm/PassSupport.h Mon Jul 19 16:44:48 2010 @@ -36,6 +36,10 @@ class PassInfo { public: typedef Pass* (*NormalCtor_t)(); + struct InterfaceInfo { + const PassInfo *interface; + const InterfaceInfo *next; + }; private: const char *const PassName; // Nice name for Pass @@ -44,7 +48,7 @@ const bool IsCFGOnlyPass; // Pass only looks at the CFG. const bool IsAnalysis; // True if an analysis pass. const bool IsAnalysisGroup; // True if an analysis group. - std::vector ItfImpl;// Interfaces implemented by this pass + const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass NormalCtor_t NormalCtor; @@ -116,13 +120,16 @@ /// template. /// void addInterfaceImplemented(const PassInfo *ItfPI) { - ItfImpl.push_back(ItfPI); + InterfaceInfo *NewInfo = new InterfaceInfo(); + NewInfo->interface = ItfPI; + NewInfo->next = ItfImpl; + ItfImpl = NewInfo; } /// getInterfacesImplemented - Return a list of all of the analysis group /// interfaces implemented by this pass. /// - const std::vector &getInterfacesImplemented() const { + const InterfaceInfo *getInterfacesImplemented() const { return ItfImpl; } Modified: llvm/trunk/lib/VMCore/PassManager.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/PassManager.cpp?rev=108755&r1=108754&r2=108755&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/PassManager.cpp (original) +++ llvm/trunk/lib/VMCore/PassManager.cpp Mon Jul 19 16:44:48 2010 @@ -638,10 +638,14 @@ // If Pass not found then check the interfaces implemented by Immutable Pass if (!P) { - const std::vector &ImmPI = - PI->getInterfacesImplemented(); - if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end()) - P = *I; + const PassInfo::InterfaceInfo *ImmPI = PI->getInterfacesImplemented(); + while (ImmPI) { + if (ImmPI->interface == AID) { + P = *I; + break; + } else + ImmPI = ImmPI->next; + } } } @@ -731,9 +735,11 @@ //This pass is the current implementation of all of the interfaces it //implements as well. - const std::vector &II = PI->getInterfacesImplemented(); - for (unsigned i = 0, e = II.size(); i != e; ++i) - AvailableAnalysis[II[i]] = P; + const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented(); + while (II) { + AvailableAnalysis[II->interface] = P; + II = II->next; + } } // Return true if P preserves high level analysis used by other @@ -867,12 +873,13 @@ // Remove all interfaces this pass implements, for which it is also // listed as the available implementation. - const std::vector &II = PI->getInterfacesImplemented(); - for (unsigned i = 0, e = II.size(); i != e; ++i) { + const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented(); + while (II) { std::map::iterator Pos = - AvailableAnalysis.find(II[i]); + AvailableAnalysis.find(II->interface); if (Pos != AvailableAnalysis.end() && Pos->second == P) AvailableAnalysis.erase(Pos); + II = II->next; } } } From resistor at mac.com Mon Jul 19 16:47:37 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 19 Jul 2010 14:47:37 -0700 Subject: [llvm-commits] [llvm] r108755 - in /llvm/trunk: include/llvm/PassSupport.h lib/VMCore/PassManager.cpp In-Reply-To: <20100719214449.232A42A6C12C@llvm.org> References: <20100719214449.232A42A6C12C@llvm.org> Message-ID: <67C6B4E1-A62B-4D0D-B21B-471DD1F692F1@mac.com> On Jul 19, 2010, at 2:44 PM, Owen Anderson wrote: > Change the implemented interfaces list on PassInfo from a std::vector to a manually implemented > linked list. This is a little slower and involves more malloc'ing, but these lists are > typically short, and it allows PassInfo to be entirely constant initializable. Module getting rid of its static constructor, of course. --Owen From grosbach at apple.com Mon Jul 19 17:04:28 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 19 Jul 2010 22:04:28 -0000 Subject: [llvm-commits] [llvm] r108759 - /llvm/trunk/CREDITS.TXT Message-ID: <20100719220428.D6E422A6C12C@llvm.org> Author: grosbach Date: Mon Jul 19 17:04:28 2010 New Revision: 108759 URL: http://llvm.org/viewvc/llvm-project?rev=108759&view=rev Log: long past time I added myself to this, I suppose. Modified: llvm/trunk/CREDITS.TXT Modified: llvm/trunk/CREDITS.TXT URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/CREDITS.TXT?rev=108759&r1=108758&r2=108759&view=diff ============================================================================== --- llvm/trunk/CREDITS.TXT (original) +++ llvm/trunk/CREDITS.TXT Mon Jul 19 17:04:28 2010 @@ -134,6 +134,11 @@ E: ggreif at gmail.com D: Improvements for space efficiency +N: James Grosbach +E: grosbach at apple.com +D: SjLj exception handling support +D: General fixes and improvements for the ARM back-end + N: Lang Hames E: lhames at gmail.com D: PBQP-based register allocator From evan.cheng at apple.com Mon Jul 19 17:09:06 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Jul 2010 15:09:06 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> Message-ID: On Jul 19, 2010, at 1:22 PM, Jakob Stoklund Olesen wrote: > > On Jul 19, 2010, at 1:11 PM, Evan Cheng wrote: > >> >> On Jul 19, 2010, at 12:59 PM, Jakob Stoklund Olesen wrote: >> >>> >>> On Jul 19, 2010, at 11:47 AM, Evan Cheng wrote: >>> >>>> Author: evancheng >>>> Date: Mon Jul 19 13:47:01 2010 >>>> New Revision: 108735 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=108735&view=rev >>>> Log: >>>> Teach computeRegisterProperties() to compute "representative" register class for legal value types. A "representative" register class is the largest legal super-reg register class for a value type. e.g. On i386, GR32 is the rep register class for i8 / i16 / i32; on x86_64 it would be GR64. >>>> >>>> This property will be used by the register pressure tracking instruction scheduler. >>> >>> Hi Evan, >>> >>> This looks a lot like you have x86 in mind. >> >> No. What is x86? :-) >> >>> >>> What is getRepRegClassFor(f32) going to return on ARM? QQQQ? >> >> QQ and QQQQ are not legal during isel. It's Q. It's probably overly conservative for tracking. I'm still trying to figure that out. >> >> >>> >>> How are you planning to deal with registers with more than one usable subregister? >> >> I am not sure what you mean? It's ignore sub-register classes (e.g. QPR_VFP2). > > I meant the same as above - QPR only has 16 registers, but there are 32 DPR registers. If you are counting each DPR as a QPR, you are going to be scheduling as if you only had 16 DPR registers. > > Can you use some kind of scaling so a DPR counts as 0.5 QPR? > No, I don't like that. I was hoping to avoid having targets provide findRepresentativeClass(). But I think it cannot be avoided. Evan From bob.wilson at apple.com Mon Jul 19 17:15:28 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 15:15:28 -0700 Subject: [llvm-commits] [patch] v2 PR7608 ARMv4 JIT forgets to set the lr register when making a indirect function call In-Reply-To: <4C449A32.7060101@zafena.se> References: <4C3A4388.1040703@zafena.se> <4C3B79BF.3080303@zafena.se> <4C449A32.7060101@zafena.se> Message-ID: <4C11E453-313C-4B77-BC04-07B730DC649A@apple.com> Looks good to me. On Jul 19, 2010, at 11:32 AM, Xerxes Ranby wrote: > Bob Wilson wrote: >> On Jul 12, 2010, at 1:23 PM, Xerxes Ranby wrote: >> >>> Bob Wilson wrote: >>> >>>> I don't think this is good enough. The "mov lr, pc" instruction must be emitted immediately before the call. I don't know how to do that without making all the "call_nolink" instructions into pseudo-instructions. >>>> >>> Where can I find documentation on what pseudo instructions are and how pseudo instructions can resolve this kind of situation? >>> >> >> Look at ARMCodeEmitter::emitPseudoInstruction for some examples. Basically you would just change the "call_nolink" instructions to be marked as pseudo instructions and then add code to ARMCodeEmitter to generate both the "mov lr, pc" and "bx" instructions together > Hi I have attached a new patch that basicaly implements what Bob suggested, thank you Bob, it marks all the ARM "call_nolink" instructions as pseudo instructions and adds code to ARMCodeEmitter to generate both the "mov lr, pc" and the branch instructions together. My own testing indicates that this work very well and fixes the PR7608 bug without introducing any new test regressions. > > Index: llvm/lib/Target/ARM/ARMInstrInfo.td > =================================================================== > --- llvm.orig/lib/Target/ARM/ARMInstrInfo.td 2010-07-13 17:41:01.000000000 +0200 > +++ llvm/lib/Target/ARM/ARMInstrInfo.td 2010-07-19 17:11:19.000000000 +0200 > @@ -961,7 +961,7 @@ > > // ARMv4T > // Note: Restrict $func to the tGPR regclass to prevent it being in LR. > - def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tbx\t$func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, HasV4T, IsNotDarwin]> { > @@ -971,7 +971,7 @@ > } > > // ARMv4 > - def BMOVPCRX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BMOVPCRX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, NoV4T, IsNotDarwin]> { > @@ -1010,7 +1010,7 @@ > > // ARMv4T > // Note: Restrict $func to the tGPR regclass to prevent it being in LR. > - def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tbx\t$func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, HasV4T, IsDarwin]> { > @@ -1020,7 +1020,7 @@ > } > > // ARMv4 > - def BMOVPCRXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BMOVPCRXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, NoV4T, IsDarwin]> { > Index: llvm/lib/Target/ARM/ARMCodeEmitter.cpp > =================================================================== > --- llvm.orig/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-13 17:41:01.000000000 +0200 > +++ llvm/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-19 17:20:26.000000000 +0200 > @@ -654,6 +654,16 @@ > switch (Opcode) { > default: > llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction"); > + case ARM::BX: > + case ARM::BMOVPCRX: > + case ARM::BXr9: > + case ARM::BMOVPCRXr9: { > + // First emit mov lr, pc > + emitWordLE(0xe1a0e00f); > + // and then emit the branch. > + emitMiscBranchInstruction(MI); > + break; > + } > case TargetOpcode::INLINEASM: { > // We allow inline assembler nodes with empty bodies - they can > // implicitly define registers, which is ok for JIT. > > > Ok to push? > > Cheers > Xerxes > > Index: llvm/lib/Target/ARM/ARMInstrInfo.td > =================================================================== > --- llvm.orig/lib/Target/ARM/ARMInstrInfo.td 2010-07-13 17:41:01.000000000 +0200 > +++ llvm/lib/Target/ARM/ARMInstrInfo.td 2010-07-19 17:11:19.000000000 +0200 > @@ -961,7 +961,7 @@ > > // ARMv4T > // Note: Restrict $func to the tGPR regclass to prevent it being in LR. > - def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tbx\t$func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, HasV4T, IsNotDarwin]> { > @@ -971,7 +971,7 @@ > } > > // ARMv4 > - def BMOVPCRX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BMOVPCRX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, NoV4T, IsNotDarwin]> { > @@ -1010,7 +1010,7 @@ > > // ARMv4T > // Note: Restrict $func to the tGPR regclass to prevent it being in LR. > - def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tbx\t$func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, HasV4T, IsDarwin]> { > @@ -1020,7 +1020,7 @@ > } > > // ARMv4 > - def BMOVPCRXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), > + def BMOVPCRXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), > IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", > [(ARMcall_nolink tGPR:$func)]>, > Requires<[IsARM, NoV4T, IsDarwin]> { > Index: llvm/lib/Target/ARM/ARMCodeEmitter.cpp > =================================================================== > --- llvm.orig/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-13 17:41:01.000000000 +0200 > +++ llvm/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-19 17:20:26.000000000 +0200 > @@ -654,6 +654,16 @@ > switch (Opcode) { > default: > llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction"); > + case ARM::BX: > + case ARM::BMOVPCRX: > + case ARM::BXr9: > + case ARM::BMOVPCRXr9: { > + // First emit mov lr, pc > + emitWordLE(0xe1a0e00f); > + // and then emit the branch. > + emitMiscBranchInstruction(MI); > + break; > + } > case TargetOpcode::INLINEASM: { > // We allow inline assembler nodes with empty bodies - they can > // implicitly define registers, which is ok for JIT. From evan.cheng at apple.com Mon Jul 19 17:15:08 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Jul 2010 22:15:08 -0000 Subject: [llvm-commits] [llvm] r108761 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp lib/Target/ARM/ARMISelLowering.cpp lib/Target/ARM/ARMISelLowering.h Message-ID: <20100719221508.C8EF02A6C12C@llvm.org> Author: evancheng Date: Mon Jul 19 17:15:08 2010 New Revision: 108761 URL: http://llvm.org/viewvc/llvm-project?rev=108761&view=rev Log: ARM has to provide its own TargetLowering::findRepresentativeClass because its scalar floating point registers alias its vector registers. Modified: llvm/trunk/include/llvm/Target/TargetLowering.h llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.h Modified: llvm/trunk/include/llvm/Target/TargetLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=108761&r1=108760&r2=108761&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetLowering.h (original) +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Jul 19 17:15:08 2010 @@ -993,6 +993,11 @@ Synthesizable[VT.getSimpleVT().SimpleTy] = isSynthesizable; } + /// findRepresentativeClass - Return the largest legal super-reg register class + /// of the specified register class. + virtual const TargetRegisterClass * + findRepresentativeClass(const TargetRegisterClass *RC) const; + /// computeRegisterProperties - Once all of the register classes are added, /// this allows us to compute derived properties we expose. void computeRegisterProperties(); @@ -1698,12 +1703,7 @@ /// hasLegalSuperRegRegClasses - Return true if the specified register class /// has one or more super-reg register classes that are legal. - bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC); - - /// findRepresentativeClass - Return the largest legal super-reg register class - /// of the specified register class. - const TargetRegisterClass * - findRepresentativeClass(const TargetRegisterClass *RC); + bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const; }; /// GetReturnInfo - Given an LLVM IR type and return type attributes, Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=108761&r1=108760&r2=108761&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Jul 19 17:15:08 2010 @@ -664,7 +664,8 @@ /// hasLegalSuperRegRegClasses - Return true if the specified register class /// has one or more super-reg register classes that are legal. -bool TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) { +bool +TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const{ if (*RC->superregclasses_begin() == 0) return false; for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(), @@ -679,9 +680,7 @@ /// findRepresentativeClass - Return the largest legal super-reg register class /// of the specified register class. const TargetRegisterClass * -TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) { - if (!RC) return 0; - +TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const { const TargetRegisterClass *BestRC = RC; for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(), E = RC->superregclasses_end(); I != E; ++I) { @@ -820,8 +819,10 @@ // not a sub-register class / subreg register class) legal register class for // a group of value types. For example, on i386, i8, i16, and i32 // representative would be GR32; while on x86_64 it's GR64. - for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) - RepRegClassForVT[i] = findRepresentativeClass(RegClassForVT[i]); + for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) { + const TargetRegisterClass *RC = RegClassForVT[i]; + RepRegClassForVT[i] = RC ? findRepresentativeClass(RC) : 0; + } } const char *TargetLowering::getTargetNodeName(unsigned Opcode) const { Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=108761&r1=108760&r2=108761&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Jul 19 17:15:08 2010 @@ -550,6 +550,22 @@ benefitFromCodePlacementOpt = true; } +const TargetRegisterClass * +ARMTargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const{ + switch (RC->getID()) { + default: + return RC; + case ARM::tGPRRegClassID: + case ARM::GPRRegClassID: + return ARM::GPRRegisterClass; + case ARM::SPRRegClassID: + case ARM::DPRRegClassID: + return ARM::DPRRegisterClass; + case ARM::QPRRegClassID: + return ARM::QPRRegisterClass; + } +} + const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const { switch (Opcode) { default: return 0; Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=108761&r1=108760&r2=108761&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Jul 19 17:15:08 2010 @@ -271,6 +271,10 @@ /// materialize the FP immediate as a load from a constant pool. virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const; + protected: + const TargetRegisterClass * + findRepresentativeClass(const TargetRegisterClass *RC) const; + private: /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can /// make the right decision when generating code for different targets. From stoklund at 2pi.dk Mon Jul 19 17:22:23 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 15:22:23 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> Message-ID: <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> On Jul 19, 2010, at 3:09 PM, Evan Cheng wrote: > > On Jul 19, 2010, at 1:22 PM, Jakob Stoklund Olesen wrote: >> >> Can you use some kind of scaling so a DPR counts as 0.5 QPR? >> > > No, I don't like that. I was hoping to avoid having targets provide findRepresentativeClass(). But I think it cannot be avoided. I don't think overriding findRepresentativeClass() solves the problem. There is no 'correct' representative register class. Whenever you allocate a QPR, you block two DPRs. Whenever you allocate a DPR, you block one (half) QPR. I think you need to model that asymmetry somehow. From echristo at apple.com Mon Jul 19 17:25:26 2010 From: echristo at apple.com (Eric Christopher) Date: Mon, 19 Jul 2010 15:25:26 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> Message-ID: On Jul 19, 2010, at 3:22 PM, Jakob Stoklund Olesen wrote: > > On Jul 19, 2010, at 3:09 PM, Evan Cheng wrote: > >> >> On Jul 19, 2010, at 1:22 PM, Jakob Stoklund Olesen wrote: >>> >>> Can you use some kind of scaling so a DPR counts as 0.5 QPR? >>> >> >> No, I don't like that. I was hoping to avoid having targets provide findRepresentativeClass(). But I think it cannot be avoided. > > I don't think overriding findRepresentativeClass() solves the problem. There is no 'correct' representative register class. > > Whenever you allocate a QPR, you block two DPRs. > Whenever you allocate a DPR, you block one (half) QPR. > > I think you need to model that asymmetry somehow. > As a first pass for scheduling wouldn't the second one be a bit overkill? i.e. is there anything wrong with considering it as a full QPR? If so, just round up? -eric From bob.wilson at apple.com Mon Jul 19 17:30:28 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Jul 2010 15:30:28 -0700 Subject: [llvm-commits] [patch] v2 PR7608 ARMv4 JIT forgets to set the lr register when making a indirect function call In-Reply-To: <4C11E453-313C-4B77-BC04-07B730DC649A@apple.com> References: <4C3A4388.1040703@zafena.se> <4C3B79BF.3080303@zafena.se> <4C449A32.7060101@zafena.se> <4C11E453-313C-4B77-BC04-07B730DC649A@apple.com> Message-ID: <4EA45324-80B0-49DA-8A5A-88199D5AA433@apple.com> Wait a minute.... How does EmitMiscBranchInstruction() know how to encode those BX instructions? You need to add the encoding bits in the .td file. Instead of declaring them as PseudoInsts, declare them as real instructions (similar to BRIND), but set the format to "Pseudo". On Jul 19, 2010, at 3:15 PM, Bob Wilson wrote: > Looks good to me. > > On Jul 19, 2010, at 11:32 AM, Xerxes Ranby wrote: > >> Bob Wilson wrote: >>> On Jul 12, 2010, at 1:23 PM, Xerxes Ranby wrote: >>> >>>> Bob Wilson wrote: >>>> >>>>> I don't think this is good enough. The "mov lr, pc" instruction must be emitted immediately before the call. I don't know how to do that without making all the "call_nolink" instructions into pseudo-instructions. >>>>> >>>> Where can I find documentation on what pseudo instructions are and how pseudo instructions can resolve this kind of situation? >>>> >>> >>> Look at ARMCodeEmitter::emitPseudoInstruction for some examples. Basically you would just change the "call_nolink" instructions to be marked as pseudo instructions and then add code to ARMCodeEmitter to generate both the "mov lr, pc" and "bx" instructions together >> Hi I have attached a new patch that basicaly implements what Bob suggested, thank you Bob, it marks all the ARM "call_nolink" instructions as pseudo instructions and adds code to ARMCodeEmitter to generate both the "mov lr, pc" and the branch instructions together. My own testing indicates that this work very well and fixes the PR7608 bug without introducing any new test regressions. >> >> Index: llvm/lib/Target/ARM/ARMInstrInfo.td >> =================================================================== >> --- llvm.orig/lib/Target/ARM/ARMInstrInfo.td 2010-07-13 17:41:01.000000000 +0200 >> +++ llvm/lib/Target/ARM/ARMInstrInfo.td 2010-07-19 17:11:19.000000000 +0200 >> @@ -961,7 +961,7 @@ >> >> // ARMv4T >> // Note: Restrict $func to the tGPR regclass to prevent it being in LR. >> - def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tbx\t$func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, HasV4T, IsNotDarwin]> { >> @@ -971,7 +971,7 @@ >> } >> >> // ARMv4 >> - def BMOVPCRX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BMOVPCRX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, NoV4T, IsNotDarwin]> { >> @@ -1010,7 +1010,7 @@ >> >> // ARMv4T >> // Note: Restrict $func to the tGPR regclass to prevent it being in LR. >> - def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tbx\t$func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, HasV4T, IsDarwin]> { >> @@ -1020,7 +1020,7 @@ >> } >> >> // ARMv4 >> - def BMOVPCRXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BMOVPCRXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, NoV4T, IsDarwin]> { >> Index: llvm/lib/Target/ARM/ARMCodeEmitter.cpp >> =================================================================== >> --- llvm.orig/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-13 17:41:01.000000000 +0200 >> +++ llvm/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-19 17:20:26.000000000 +0200 >> @@ -654,6 +654,16 @@ >> switch (Opcode) { >> default: >> llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction"); >> + case ARM::BX: >> + case ARM::BMOVPCRX: >> + case ARM::BXr9: >> + case ARM::BMOVPCRXr9: { >> + // First emit mov lr, pc >> + emitWordLE(0xe1a0e00f); >> + // and then emit the branch. >> + emitMiscBranchInstruction(MI); >> + break; >> + } >> case TargetOpcode::INLINEASM: { >> // We allow inline assembler nodes with empty bodies - they can >> // implicitly define registers, which is ok for JIT. >> >> >> Ok to push? >> >> Cheers >> Xerxes >> >> Index: llvm/lib/Target/ARM/ARMInstrInfo.td >> =================================================================== >> --- llvm.orig/lib/Target/ARM/ARMInstrInfo.td 2010-07-13 17:41:01.000000000 +0200 >> +++ llvm/lib/Target/ARM/ARMInstrInfo.td 2010-07-19 17:11:19.000000000 +0200 >> @@ -961,7 +961,7 @@ >> >> // ARMv4T >> // Note: Restrict $func to the tGPR regclass to prevent it being in LR. >> - def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tbx\t$func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, HasV4T, IsNotDarwin]> { >> @@ -971,7 +971,7 @@ >> } >> >> // ARMv4 >> - def BMOVPCRX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BMOVPCRX : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, NoV4T, IsNotDarwin]> { >> @@ -1010,7 +1010,7 @@ >> >> // ARMv4T >> // Note: Restrict $func to the tGPR regclass to prevent it being in LR. >> - def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tbx\t$func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, HasV4T, IsDarwin]> { >> @@ -1020,7 +1020,7 @@ >> } >> >> // ARMv4 >> - def BMOVPCRXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), >> + def BMOVPCRXr9 : PseudoInst<(outs), (ins tGPR:$func, variable_ops), >> IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", >> [(ARMcall_nolink tGPR:$func)]>, >> Requires<[IsARM, NoV4T, IsDarwin]> { >> Index: llvm/lib/Target/ARM/ARMCodeEmitter.cpp >> =================================================================== >> --- llvm.orig/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-13 17:41:01.000000000 +0200 >> +++ llvm/lib/Target/ARM/ARMCodeEmitter.cpp 2010-07-19 17:20:26.000000000 +0200 >> @@ -654,6 +654,16 @@ >> switch (Opcode) { >> default: >> llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction"); >> + case ARM::BX: >> + case ARM::BMOVPCRX: >> + case ARM::BXr9: >> + case ARM::BMOVPCRXr9: { >> + // First emit mov lr, pc >> + emitWordLE(0xe1a0e00f); >> + // and then emit the branch. >> + emitMiscBranchInstruction(MI); >> + break; >> + } >> case TargetOpcode::INLINEASM: { >> // We allow inline assembler nodes with empty bodies - they can >> // implicitly define registers, which is ok for JIT. > From evan.cheng at apple.com Mon Jul 19 17:35:53 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Jul 2010 15:35:53 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> Message-ID: On Jul 19, 2010, at 3:22 PM, Jakob Stoklund Olesen wrote: > > On Jul 19, 2010, at 3:09 PM, Evan Cheng wrote: > >> >> On Jul 19, 2010, at 1:22 PM, Jakob Stoklund Olesen wrote: >>> >>> Can you use some kind of scaling so a DPR counts as 0.5 QPR? >>> >> >> No, I don't like that. I was hoping to avoid having targets provide findRepresentativeClass(). But I think it cannot be avoided. > > I don't think overriding findRepresentativeClass() solves the problem. There is no 'correct' representative register class. > > Whenever you allocate a QPR, you block two DPRs. > Whenever you allocate a DPR, you block one (half) QPR. > > I think you need to model that asymmetry somehow. > We'll see. Register pressure is "estimated" during instruction scheduling. I think we'll get away with the current scheme because it's relatively rare for vector and non-vector to mix in a way for this to be an issue. I want to keep it simple for now. Evan From stoklund at 2pi.dk Mon Jul 19 17:38:20 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 15:38:20 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> Message-ID: On Jul 19, 2010, at 3:25 PM, Eric Christopher wrote: > > On Jul 19, 2010, at 3:22 PM, Jakob Stoklund Olesen wrote: > >> >> On Jul 19, 2010, at 3:09 PM, Evan Cheng wrote: >> >>> >>> On Jul 19, 2010, at 1:22 PM, Jakob Stoklund Olesen wrote: >>>> >>>> Can you use some kind of scaling so a DPR counts as 0.5 QPR? >>>> >>> >>> No, I don't like that. I was hoping to avoid having targets provide findRepresentativeClass(). But I think it cannot be avoided. >> >> I don't think overriding findRepresentativeClass() solves the problem. There is no 'correct' representative register class. >> >> Whenever you allocate a QPR, you block two DPRs. >> Whenever you allocate a DPR, you block one (half) QPR. >> >> I think you need to model that asymmetry somehow. >> > > As a first pass for scheduling wouldn't the second one be a bit overkill? i.e. is there anything wrong with considering it as a full QPR? If so, just round up? QPR has 16 registers, DPR has 32. If each DPR counts as a QPR, the scheduler is going to behave as if there were only 16 DPR registers available. That is almost as bad as scheduling purely for register pressure. From echristo at apple.com Mon Jul 19 17:41:28 2010 From: echristo at apple.com (Eric Christopher) Date: Mon, 19 Jul 2010 15:41:28 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> Message-ID: <6996DC86-32B5-4C1C-83DE-1D64667E860F@apple.com> On Jul 19, 2010, at 3:38 PM, Jakob Stoklund Olesen wrote: > > On Jul 19, 2010, at 3:25 PM, Eric Christopher wrote: > >> >> On Jul 19, 2010, at 3:22 PM, Jakob Stoklund Olesen wrote: >> >>> >>> On Jul 19, 2010, at 3:09 PM, Evan Cheng wrote: >>> >>>> >>>> On Jul 19, 2010, at 1:22 PM, Jakob Stoklund Olesen wrote: >>>>> >>>>> Can you use some kind of scaling so a DPR counts as 0.5 QPR? >>>>> >>>> >>>> No, I don't like that. I was hoping to avoid having targets provide findRepresentativeClass(). But I think it cannot be avoided. >>> >>> I don't think overriding findRepresentativeClass() solves the problem. There is no 'correct' representative register class. >>> >>> Whenever you allocate a QPR, you block two DPRs. >>> Whenever you allocate a DPR, you block one (half) QPR. >>> >>> I think you need to model that asymmetry somehow. >>> >> >> As a first pass for scheduling wouldn't the second one be a bit overkill? i.e. is there anything wrong with considering it as a full QPR? If so, just round up? > > QPR has 16 registers, DPR has 32. > > If each DPR counts as a QPR, the scheduler is going to behave as if there were only 16 DPR registers available. That is almost as bad as scheduling purely for register pressure. > True, but you could maybe count each QPR as two dprs and if you run into an occasion where that matters it'd suck, but I bet it'd be infrequent. -eric From gohman at apple.com Mon Jul 19 17:48:56 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Jul 2010 22:48:56 -0000 Subject: [llvm-commits] [llvm] r108765 - in /llvm/trunk: lib/CodeGen/SelectionDAG/FastISel.cpp test/CodeGen/X86/fast-isel-atomic.ll Message-ID: <20100719224856.C6D9C2A6C12C@llvm.org> Author: djg Date: Mon Jul 19 17:48:56 2010 New Revision: 108765 URL: http://llvm.org/viewvc/llvm-project?rev=108765&view=rev Log: After a custom inserter, in a block which has constant instructions, update the current basic block in addition to the current insert position, so that they remain consistent. This fixes rdar://8204072. Added: llvm/trunk/test/CodeGen/X86/fast-isel-atomic.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=108765&r1=108764&r2=108765&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Mon Jul 19 17:48:56 2010 @@ -276,6 +276,7 @@ void FastISel::recomputeInsertPt() { if (getLastLocalValue()) { FuncInfo.InsertPt = getLastLocalValue(); + FuncInfo.MBB = FuncInfo.InsertPt->getParent(); ++FuncInfo.InsertPt; } else FuncInfo.InsertPt = FuncInfo.MBB->getFirstNonPHI(); Added: llvm/trunk/test/CodeGen/X86/fast-isel-atomic.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fast-isel-atomic.ll?rev=108765&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/fast-isel-atomic.ll (added) +++ llvm/trunk/test/CodeGen/X86/fast-isel-atomic.ll Mon Jul 19 17:48:56 2010 @@ -0,0 +1,16 @@ +; RUN: llc < %s -O0 -march=x86-64 +; rdar://8204072 + + at sc = external global i8 + at uc = external global i8 + +declare i8 @llvm.atomic.load.and.i8.p0i8(i8* nocapture, i8) nounwind + +define void @test_fetch_and_op() nounwind { +entry: + %tmp40 = call i8 @llvm.atomic.load.and.i8.p0i8(i8* @sc, i8 11) ; [#uses=1] + store i8 %tmp40, i8* @sc + %tmp41 = call i8 @llvm.atomic.load.and.i8.p0i8(i8* @uc, i8 11) ; [#uses=1] + store i8 %tmp41, i8* @uc + ret void +} From stoklund at 2pi.dk Mon Jul 19 17:52:07 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 19 Jul 2010 15:52:07 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <6996DC86-32B5-4C1C-83DE-1D64667E860F@apple.com> References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> <6996DC86-32B5-4C1C-83DE-1D64667E860F@apple.com> Message-ID: <24318A76-8719-4D72-9F6B-55E0908D1EB6@2pi.dk> On Jul 19, 2010, at 3:41 PM, Eric Christopher wrote: > > On Jul 19, 2010, at 3:38 PM, Jakob Stoklund Olesen wrote: > >> QPR has 16 registers, DPR has 32. >> >> If each DPR counts as a QPR, the scheduler is going to behave as if there were only 16 DPR registers available. That is almost as bad as scheduling purely for register pressure. >> > > True, but you could maybe count each QPR as two dprs and if you run into an occasion where that matters it'd suck, but I bet it'd be infrequent. Right. That's what I meant by scaling. I think it is necessary. Evan is probably right that QPRs and DPRs won't be live at the same time. But we should at least get the number of registers right. Overriding findRepresentativeClass for ARM does get the register counts right, though. From echristo at apple.com Mon Jul 19 17:53:30 2010 From: echristo at apple.com (Eric Christopher) Date: Mon, 19 Jul 2010 15:53:30 -0700 Subject: [llvm-commits] [llvm] r108735 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp In-Reply-To: <24318A76-8719-4D72-9F6B-55E0908D1EB6@2pi.dk> References: <20100719184701.BD0E92A6C12C@llvm.org> <8E57D391-E68A-4532-B780-2B6FB52F7C2E@apple.com> <52E5CF36-C5F1-4834-8A37-23D68A18268C@2pi.dk> <2559FA6C-2DD4-4256-B1C2-B91C7F416927@2pi.dk> <6996DC86-32B5-4C1C-83DE-1D64667E860F@apple.com> <24318A76-8719-4D72-9F6B-55E0908D1EB6@2pi.dk> Message-ID: <899F5523-F71E-463F-9E95-204AEEE54CE4@apple.com> On Jul 19, 2010, at 3:52 PM, Jakob Stoklund Olesen wrote: > > On Jul 19, 2010, at 3:41 PM, Eric Christopher wrote: > >> >> On Jul 19, 2010, at 3:38 PM, Jakob Stoklund Olesen wrote: >> >>> QPR has 16 registers, DPR has 32. >>> >>> If each DPR counts as a QPR, the scheduler is going to behave as if there were only 16 DPR registers available. That is almost as bad as scheduling purely for register pressure. >>> >> >> True, but you could maybe count each QPR as two dprs and if you run into an occasion where that matters it'd suck, but I bet it'd be infrequent. > > Right. That's what I meant by scaling. I think it is necessary. > Ah. Yes. > Evan is probably right that QPRs and DPRs won't be live at the same time. > > But we should at least get the number of registers right. > > Overriding findRepresentativeClass for ARM does get the register counts right, though. Right. Violent agreement. :) -eric From dpatel at apple.com Mon Jul 19 18:25:39 2010 From: dpatel at apple.com (Devang Patel) Date: Mon, 19 Jul 2010 23:25:39 -0000 Subject: [llvm-commits] [llvm] r108767 - /llvm/trunk/lib/CodeGen/RegAllocFast.cpp Message-ID: <20100719232539.EDD322A6C12C@llvm.org> Author: dpatel Date: Mon Jul 19 18:25:39 2010 New Revision: 108767 URL: http://llvm.org/viewvc/llvm-project?rev=108767&view=rev Log: Fix memory leak reported by valgrind. Do not visit operands of old instruction. Visit all operands of new instruction. Modified: llvm/trunk/lib/CodeGen/RegAllocFast.cpp Modified: llvm/trunk/lib/CodeGen/RegAllocFast.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocFast.cpp?rev=108767&r1=108766&r2=108767&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/RegAllocFast.cpp (original) +++ llvm/trunk/lib/CodeGen/RegAllocFast.cpp Mon Jul 19 18:25:39 2010 @@ -753,31 +753,39 @@ // Debug values are not allowed to change codegen in any way. if (MI->isDebugValue()) { - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = MI->getOperand(i); - if (!MO.isReg()) continue; - unsigned Reg = MO.getReg(); - if (!Reg || TargetRegisterInfo::isPhysicalRegister(Reg)) continue; - LiveRegMap::iterator LRI = LiveVirtRegs.find(Reg); - if (LRI != LiveVirtRegs.end()) - setPhysReg(MI, i, LRI->second.PhysReg); - else { - int SS = StackSlotForVirtReg[Reg]; - if (SS == -1) - MO.setReg(0); // We can't allocate a physreg for a DebugValue, sorry! + bool ScanDbgValue = true; + while (ScanDbgValue) { + ScanDbgValue = false; + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { + MachineOperand &MO = MI->getOperand(i); + if (!MO.isReg()) continue; + unsigned Reg = MO.getReg(); + if (!Reg || TargetRegisterInfo::isPhysicalRegister(Reg)) continue; + LiveRegMap::iterator LRI = LiveVirtRegs.find(Reg); + if (LRI != LiveVirtRegs.end()) + setPhysReg(MI, i, LRI->second.PhysReg); else { - // Modify DBG_VALUE now that the value is in a spill slot. - uint64_t Offset = MI->getOperand(1).getImm(); - const MDNode *MDPtr = - MI->getOperand(MI->getNumOperands()-1).getMetadata(); - DebugLoc DL = MI->getDebugLoc(); - if (MachineInstr *NewDV = - TII->emitFrameIndexDebugValue(*MF, SS, Offset, MDPtr, DL)) { - DEBUG(dbgs() << "Modifying debug info due to spill:" << "\t" << *MI); - MachineBasicBlock *MBB = MI->getParent(); - MBB->insert(MBB->erase(MI), NewDV); - } else + int SS = StackSlotForVirtReg[Reg]; + if (SS == -1) MO.setReg(0); // We can't allocate a physreg for a DebugValue, sorry! + else { + // Modify DBG_VALUE now that the value is in a spill slot. + uint64_t Offset = MI->getOperand(1).getImm(); + const MDNode *MDPtr = + MI->getOperand(MI->getNumOperands()-1).getMetadata(); + DebugLoc DL = MI->getDebugLoc(); + if (MachineInstr *NewDV = + TII->emitFrameIndexDebugValue(*MF, SS, Offset, MDPtr, DL)) { + DEBUG(dbgs() << "Modifying debug info due to spill:" << "\t" << *MI); + MachineBasicBlock *MBB = MI->getParent(); + MBB->insert(MBB->erase(MI), NewDV); + // Scan NewDV operands from the beginning. + MI = NewDV; + ScanDbgValue = true; + break; + } else + MO.setReg(0); // We can't allocate a physreg for a DebugValue, sorry! + } } } } From dpatel at apple.com Mon Jul 19 18:26:44 2010 From: dpatel at apple.com (Devang Patel) Date: Mon, 19 Jul 2010 16:26:44 -0700 Subject: [llvm-commits] [llvm] r107678 - in /llvm/trunk: lib/Target/X86/AsmPrinter/X86MCInstLower.cpp test/CodeGen/X86/2010-07-06-DbgCrash.ll In-Reply-To: References: <20100706181832.4A4402A6C12C@llvm.org> <0CA13FB8-22D9-43AE-86A0-ECA778FAB91D@apple.com> Message-ID: <5EAED277-ED59-4B81-8757-52E035530D77@apple.com> On Jul 17, 2010, at 11:33 AM, Benjamin Kramer wrote: > > On 16.07.2010, at 22:16, Devang Patel wrote: > >> Valgrind on my mac is not reporting this error. Is it possible for any one with linux box to shed a little light here ? > > It only shows up on x86, probably due to register allocation differences. Here's a line to reproduce in darwin: > > valgrind llc -march=x86 -O0 -relocation-model pic < test/CodeGen/X86/2010-07-06-DbgCrash.ll -o /dev/null Indeed. Thanks! Fixed in r108767 - Devang -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20100719/c22d2c68/attachment.html From bruno.cardoso at gmail.com Mon Jul 19 18:32:44 2010 From: bruno.cardoso at gmail.com (Bruno Cardoso Lopes) Date: Mon, 19 Jul 2010 23:32:44 -0000 Subject: [llvm-commits] [llvm] r108769 - in /llvm/trunk: lib/Target/X86/AsmPrinter/X86ATTInstPrinter.h lib/Target/X86/AsmPrinter/X86IntelInstPrinter.h lib/Target/X86/X86InstrFragmentsSIMD.td lib/Target/X86/X86InstrInfo.td lib/Target/X86/X86InstrSSE.td lib/Target/X86/X86RegisterInfo.td test/MC/AsmParser/X86/x86_32-encoding.s test/MC/AsmParser/X86/x86_64-encoding.s utils/TableGen/EDEmitter.cpp Message-ID: <20100719233245.47F512A6C12C@llvm.org> Author: bruno Date: Mon Jul 19 18:32:44 2010 New Revision: 108769 URL: http://llvm.org/viewvc/llvm-project?rev=108769&view=rev Log: Add 256-bit vaddsub, vhadd, vhsub, vblend and vdpp instructions! Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.h llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelInstPrinter.h llvm/trunk/lib/Target/X86/X86InstrFragmentsSIMD.td llvm/trunk/lib/Target/X86/X86InstrInfo.td llvm/trunk/lib/Target/X86/X86InstrSSE.td llvm/trunk/lib/Target/X86/X86RegisterInfo.td llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s llvm/trunk/utils/TableGen/EDEmitter.cpp Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.h?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.h (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.h Mon Jul 19 18:32:44 2010 @@ -56,6 +56,9 @@ void printi128mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) { printMemReference(MI, OpNo, O); } + void printi256mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) { + printMemReference(MI, OpNo, O); + } void printf32mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) { printMemReference(MI, OpNo, O); } Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelInstPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelInstPrinter.h?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelInstPrinter.h (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelInstPrinter.h Mon Jul 19 18:32:44 2010 @@ -64,6 +64,10 @@ O << "XMMWORD PTR "; printMemReference(MI, OpNo, O); } + void printi256mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) { + O << "YMMWORD PTR "; + printMemReference(MI, OpNo, O); + } void printf32mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) { O << "DWORD PTR "; printMemReference(MI, OpNo, O); Modified: llvm/trunk/lib/Target/X86/X86InstrFragmentsSIMD.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFragmentsSIMD.td?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFragmentsSIMD.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrFragmentsSIMD.td Mon Jul 19 18:32:44 2010 @@ -213,6 +213,7 @@ def memopv16i8 : PatFrag<(ops node:$ptr), (v16i8 (memop node:$ptr))>; // FIXME: move this to a more appropriate place after all AVX is done. +def memopv32i8 : PatFrag<(ops node:$ptr), (v32i8 (memop node:$ptr))>; def memopv8f32 : PatFrag<(ops node:$ptr), (v8f32 (memop node:$ptr))>; def memopv4f64 : PatFrag<(ops node:$ptr), (v4f64 (memop node:$ptr))>; Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Jul 19 18:32:44 2010 @@ -222,7 +222,7 @@ def i32mem : X86MemOperand<"printi32mem">; def i64mem : X86MemOperand<"printi64mem">; def i128mem : X86MemOperand<"printi128mem">; -//def i256mem : X86MemOperand<"printi256mem">; +def i256mem : X86MemOperand<"printi256mem">; def f32mem : X86MemOperand<"printf32mem">; def f64mem : X86MemOperand<"printf64mem">; def f80mem : X86MemOperand<"printf80mem">; Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Mon Jul 19 18:32:44 2010 @@ -3125,35 +3125,41 @@ // SSE3 - Arithmetic //===---------------------------------------------------------------------===// -multiclass sse3_addsub { +multiclass sse3_addsub { def rr : I<0xD0, MRMSrcReg, - (outs VR128:$dst), (ins VR128:$src1, VR128:$src2), + (outs RC:$dst), (ins RC:$src1, RC:$src2), !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set VR128:$dst, (Int VR128:$src1, - VR128:$src2))]>; + [(set RC:$dst, (Int RC:$src1, RC:$src2))]>; def rm : I<0xD0, MRMSrcMem, - (outs VR128:$dst), (ins VR128:$src1, f128mem:$src2), + (outs RC:$dst), (ins RC:$src1, x86memop:$src2), !if(Is2Addr, !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"), !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")), - [(set VR128:$dst, (Int VR128:$src1, - (memop addr:$src2)))]>; - + [(set RC:$dst, (Int RC:$src1, (memop addr:$src2)))]>; } let isAsmParserOnly = 1, Predicates = [HasAVX], ExeDomain = SSEPackedDouble in { - defm VADDSUBPS : sse3_addsub, XD, - VEX_4V; - defm VADDSUBPD : sse3_addsub, OpSize, - VEX_4V; + defm VADDSUBPS : sse3_addsub, XD, VEX_4V; + defm VADDSUBPD : sse3_addsub, OpSize, VEX_4V; + let Pattern = [] in { + defm VADDSUBPSY : sse3_addsub, XD, VEX_4V; + defm VADDSUBPDY : sse3_addsub, OpSize, VEX_4V; + } } let Constraints = "$src1 = $dst", Predicates = [HasSSE3], ExeDomain = SSEPackedDouble in { - defm ADDSUBPS : sse3_addsub, XD; - defm ADDSUBPD : sse3_addsub, TB, OpSize; + defm ADDSUBPS : sse3_addsub, XD; + defm ADDSUBPD : sse3_addsub, TB, OpSize; } //===---------------------------------------------------------------------===// @@ -3161,51 +3167,65 @@ //===---------------------------------------------------------------------===// // Horizontal ops -class S3D_Intrr o, string OpcodeStr, Intrinsic IntId, bit Is2Addr = 1> - : S3DI o, string OpcodeStr, ValueType vt, RegisterClass RC, + X86MemOperand x86memop, Intrinsic IntId, bit Is2Addr = 1> { + def rr : S3DI; -class S3D_Intrm o, string OpcodeStr, Intrinsic IntId, bit Is2Addr = 1> - : S3DI; + + def rm : S3DI; -class S3_Intrr o, string OpcodeStr, Intrinsic IntId, bit Is2Addr = 1> - : S3I; +} +multiclass S3_Int o, string OpcodeStr, ValueType vt, RegisterClass RC, + X86MemOperand x86memop, Intrinsic IntId, bit Is2Addr = 1> { + def rr : S3I; -class S3_Intrm o, string OpcodeStr, Intrinsic IntId, bit Is2Addr = 1> - : S3I; + + def rm : S3I; + [(set RC:$dst, (vt (IntId RC:$src1, (memop addr:$src2))))]>; +} let isAsmParserOnly = 1, Predicates = [HasAVX] in { - def VHADDPSrr : S3D_Intrr<0x7C, "vhaddps", int_x86_sse3_hadd_ps, 0>, VEX_4V; - def VHADDPSrm : S3D_Intrm<0x7C, "vhaddps", int_x86_sse3_hadd_ps, 0>, VEX_4V; - def VHADDPDrr : S3_Intrr <0x7C, "vhaddpd", int_x86_sse3_hadd_pd, 0>, VEX_4V; - def VHADDPDrm : S3_Intrm <0x7C, "vhaddpd", int_x86_sse3_hadd_pd, 0>, VEX_4V; - def VHSUBPSrr : S3D_Intrr<0x7D, "vhsubps", int_x86_sse3_hsub_ps, 0>, VEX_4V; - def VHSUBPSrm : S3D_Intrm<0x7D, "vhsubps", int_x86_sse3_hsub_ps, 0>, VEX_4V; - def VHSUBPDrr : S3_Intrr <0x7D, "vhsubpd", int_x86_sse3_hsub_pd, 0>, VEX_4V; - def VHSUBPDrm : S3_Intrm <0x7D, "vhsubpd", int_x86_sse3_hsub_pd, 0>, VEX_4V; + defm VHADDPS : S3D_Int<0x7C, "vhaddps", v4f32, VR128, f128mem, + int_x86_sse3_hadd_ps, 0>, VEX_4V; + defm VHADDPD : S3_Int <0x7C, "vhaddpd", v2f64, VR128, f128mem, + int_x86_sse3_hadd_pd, 0>, VEX_4V; + defm VHSUBPS : S3D_Int<0x7D, "vhsubps", v4f32, VR128, f128mem, + int_x86_sse3_hsub_ps, 0>, VEX_4V; + defm VHSUBPD : S3_Int <0x7D, "vhsubpd", v2f64, VR128, f128mem, + int_x86_sse3_hsub_pd, 0>, VEX_4V; + let Pattern = [] in { + defm VHADDPSY : S3D_Int<0x7C, "vhaddps", v8f32, VR256, f256mem, + int_x86_sse3_hadd_ps, 0>, VEX_4V; + defm VHADDPDY : S3_Int <0x7C, "vhaddpd", v4f64, VR256, f256mem, + int_x86_sse3_hadd_pd, 0>, VEX_4V; + defm VHSUBPSY : S3D_Int<0x7D, "vhsubps", v8f32, VR256, f256mem, + int_x86_sse3_hsub_ps, 0>, VEX_4V; + defm VHSUBPDY : S3_Int <0x7D, "vhsubpd", v4f64, VR256, f256mem, + int_x86_sse3_hsub_pd, 0>, VEX_4V; + } } let Constraints = "$src1 = $dst" in { - def HADDPSrr : S3D_Intrr<0x7C, "haddps", int_x86_sse3_hadd_ps>; - def HADDPSrm : S3D_Intrm<0x7C, "haddps", int_x86_sse3_hadd_ps>; - def HADDPDrr : S3_Intrr <0x7C, "haddpd", int_x86_sse3_hadd_pd>; - def HADDPDrm : S3_Intrm <0x7C, "haddpd", int_x86_sse3_hadd_pd>; - def HSUBPSrr : S3D_Intrr<0x7D, "hsubps", int_x86_sse3_hsub_ps>; - def HSUBPSrm : S3D_Intrm<0x7D, "hsubps", int_x86_sse3_hsub_ps>; - def HSUBPDrr : S3_Intrr <0x7D, "hsubpd", int_x86_sse3_hsub_pd>; - def HSUBPDrm : S3_Intrm <0x7D, "hsubpd", int_x86_sse3_hsub_pd>; + defm HADDPS : S3D_Int<0x7C, "haddps", v4f32, VR128, f128mem, + int_x86_sse3_hadd_ps>; + defm HADDPD : S3_Int<0x7C, "haddpd", v2f64, VR128, f128mem, + int_x86_sse3_hadd_pd>; + defm HSUBPS : S3D_Int<0x7D, "hsubps", v4f32, VR128, f128mem, + int_x86_sse3_hsub_ps>; + defm HSUBPD : S3_Int<0x7D, "hsubpd", v2f64, VR128, f128mem, + int_x86_sse3_hsub_pd>; } //===---------------------------------------------------------------------===// @@ -4431,79 +4451,98 @@ /// SS41I_binop_rmi_int - SSE 4.1 binary operator with 8-bit immediate multiclass SS41I_binop_rmi_int opc, string OpcodeStr, - Intrinsic IntId128, bit Is2Addr = 1> { + Intrinsic IntId, RegisterClass RC, PatFrag memop_frag, + X86MemOperand x86memop, bit Is2Addr = 1> { let isCommutable = 1 in - def rri : SS4AIi8, + [(set RC:$dst, (IntId RC:$src1, RC:$src2, imm:$src3))]>, OpSize; - def rmi : SS4AIi8, + [(set RC:$dst, + (IntId RC:$src1, + (bitconvert (memop_frag addr:$src2)), imm:$src3))]>, OpSize; } let isAsmParserOnly = 1, Predicates = [HasAVX] in { let isCommutable = 0 in { defm VBLENDPS : SS41I_binop_rmi_int<0x0C, "vblendps", int_x86_sse41_blendps, - 0>, VEX_4V; + VR128, memopv16i8, i128mem, 0>, VEX_4V; defm VBLENDPD : SS41I_binop_rmi_int<0x0D, "vblendpd", int_x86_sse41_blendpd, - 0>, VEX_4V; + VR128, memopv16i8, i128mem, 0>, VEX_4V; + let Pattern = [] in { + defm VBLENDPSY : SS41I_binop_rmi_int<0x0C, "vblendps", int_x86_sse41_blendps, + VR256, memopv32i8, i256mem, 0>, VEX_4V; + defm VBLENDPDY : SS41I_binop_rmi_int<0x0D, "vblendpd", int_x86_sse41_blendpd, + VR256, memopv32i8, i256mem, 0>, VEX_4V; + } defm VPBLENDW : SS41I_binop_rmi_int<0x0E, "vpblendw", int_x86_sse41_pblendw, - 0>, VEX_4V; + VR128, memopv16i8, i128mem, 0>, VEX_4V; defm VMPSADBW : SS41I_binop_rmi_int<0x42, "vmpsadbw", int_x86_sse41_mpsadbw, - 0>, VEX_4V; + VR128, memopv16i8, i128mem, 0>, VEX_4V; } defm VDPPS : SS41I_binop_rmi_int<0x40, "vdpps", int_x86_sse41_dpps, - 0>, VEX_4V; + VR128, memopv16i8, i128mem, 0>, VEX_4V; defm VDPPD : SS41I_binop_rmi_int<0x41, "vdppd", int_x86_sse41_dppd, - 0>, VEX_4V; + VR128, memopv16i8, i128mem, 0>, VEX_4V; + let Pattern = [] in + defm VDPPSY : SS41I_binop_rmi_int<0x40, "vdpps", int_x86_sse41_dpps, + VR256, memopv32i8, i256mem, 0>, VEX_4V; } let Constraints = "$src1 = $dst" in { let isCommutable = 0 in { - defm BLENDPS : SS41I_binop_rmi_int<0x0C, "blendps", int_x86_sse41_blendps>; - defm BLENDPD : SS41I_binop_rmi_int<0x0D, "blendpd", int_x86_sse41_blendpd>; - defm PBLENDW : SS41I_binop_rmi_int<0x0E, "pblendw", int_x86_sse41_pblendw>; - defm MPSADBW : SS41I_binop_rmi_int<0x42, "mpsadbw", int_x86_sse41_mpsadbw>; + defm BLENDPS : SS41I_binop_rmi_int<0x0C, "blendps", int_x86_sse41_blendps, + VR128, memopv16i8, i128mem>; + defm BLENDPD : SS41I_binop_rmi_int<0x0D, "blendpd", int_x86_sse41_blendpd, + VR128, memopv16i8, i128mem>; + defm PBLENDW : SS41I_binop_rmi_int<0x0E, "pblendw", int_x86_sse41_pblendw, + VR128, memopv16i8, i128mem>; + defm MPSADBW : SS41I_binop_rmi_int<0x42, "mpsadbw", int_x86_sse41_mpsadbw, + VR128, memopv16i8, i128mem>; } - defm DPPS : SS41I_binop_rmi_int<0x40, "dpps", int_x86_sse41_dpps>; - defm DPPD : SS41I_binop_rmi_int<0x41, "dppd", int_x86_sse41_dppd>; + defm DPPS : SS41I_binop_rmi_int<0x40, "dpps", int_x86_sse41_dpps, + VR128, memopv16i8, i128mem>; + defm DPPD : SS41I_binop_rmi_int<0x41, "dppd", int_x86_sse41_dppd, + VR128, memopv16i8, i128mem>; } /// SS41I_quaternary_int_avx - AVX SSE 4.1 with 4 operators let isAsmParserOnly = 1, Predicates = [HasAVX] in { - multiclass SS41I_quaternary_int_avx opc, string OpcodeStr> { - def rr : I, OpSize, TA, VEX_4V, VEX_I8IMM; - - def rm : I, OpSize, TA, VEX_4V, VEX_I8IMM; - } +multiclass SS41I_quaternary_int_avx opc, string OpcodeStr, + RegisterClass RC, X86MemOperand x86memop> { + def rr : I, OpSize, TA, VEX_4V, VEX_I8IMM; + + def rm : I, OpSize, TA, VEX_4V, VEX_I8IMM; } +} + +defm VBLENDVPD : SS41I_quaternary_int_avx<0x4B, "vblendvpd", VR128, i128mem>; +defm VBLENDVPS : SS41I_quaternary_int_avx<0x4A, "vblendvps", VR128, i128mem>; +defm VBLENDVPDY : SS41I_quaternary_int_avx<0x4B, "vblendvpd", VR256, i256mem>; +defm VBLENDVPSY : SS41I_quaternary_int_avx<0x4A, "vblendvps", VR256, i256mem>; -defm VBLENDVPD : SS41I_quaternary_int_avx<0x4B, "vblendvpd">; -defm VBLENDVPS : SS41I_quaternary_int_avx<0x4A, "vblendvps">; -defm VPBLENDVB : SS41I_quaternary_int_avx<0x4C, "vpblendvb">; +defm VPBLENDVB : SS41I_quaternary_int_avx<0x4C, "vpblendvb", VR128, i128mem>; /// SS41I_ternary_int - SSE 4.1 ternary operator let Uses = [XMM0], Constraints = "$src1 = $dst" in { Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.td?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.td (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.td Mon Jul 19 18:32:44 2010 @@ -804,7 +804,7 @@ }]; } -def VR256 : RegisterClass<"X86", [v8i32, v4i64, v8f32, v4f64], 256, +def VR256 : RegisterClass<"X86", [v32i8, v8i32, v4i64, v8f32, v4f64], 256, [YMM0, YMM1, YMM2, YMM3, YMM4, YMM5, YMM6, YMM7, YMM8, YMM9, YMM10, YMM11, YMM12, YMM13, YMM14, YMM15]> { Modified: llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s Mon Jul 19 18:32:44 2010 @@ -12926,3 +12926,75 @@ // CHECK: encoding: [0xc5,0xec,0xc2,0xd9,0x1f] vcmptrue_usps %ymm1, %ymm2, %ymm3 +// CHECK: vaddsubps %ymm1, %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xef,0xd0,0xd9] + vaddsubps %ymm1, %ymm2, %ymm3 + +// CHECK: vaddsubps (%eax), %ymm1, %ymm2 +// CHECK: encoding: [0xc5,0xf7,0xd0,0x10] + vaddsubps (%eax), %ymm1, %ymm2 + +// CHECK: vaddsubpd %ymm1, %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xed,0xd0,0xd9] + vaddsubpd %ymm1, %ymm2, %ymm3 + +// CHECK: vaddsubpd (%eax), %ymm1, %ymm2 +// CHECK: encoding: [0xc5,0xf5,0xd0,0x10] + vaddsubpd (%eax), %ymm1, %ymm2 + +// CHECK: vhaddps %ymm1, %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xef,0x7c,0xd9] + vhaddps %ymm1, %ymm2, %ymm3 + +// CHECK: vhaddps (%eax), %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xef,0x7c,0x18] + vhaddps (%eax), %ymm2, %ymm3 + +// CHECK: vhaddpd %ymm1, %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xed,0x7c,0xd9] + vhaddpd %ymm1, %ymm2, %ymm3 + +// CHECK: vhaddpd (%eax), %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xed,0x7c,0x18] + vhaddpd (%eax), %ymm2, %ymm3 + +// CHECK: vhsubps %ymm1, %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xef,0x7d,0xd9] + vhsubps %ymm1, %ymm2, %ymm3 + +// CHECK: vhsubps (%eax), %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xef,0x7d,0x18] + vhsubps (%eax), %ymm2, %ymm3 + +// CHECK: vhsubpd %ymm1, %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xed,0x7d,0xd9] + vhsubpd %ymm1, %ymm2, %ymm3 + +// CHECK: vhsubpd (%eax), %ymm2, %ymm3 +// CHECK: encoding: [0xc5,0xed,0x7d,0x18] + vhsubpd (%eax), %ymm2, %ymm3 + +// CHECK: vblendps $3, %ymm2, %ymm5, %ymm1 +// CHECK: encoding: [0xc4,0xe3,0x55,0x0c,0xca,0x03] + vblendps $3, %ymm2, %ymm5, %ymm1 + +// CHECK: vblendps $3, (%eax), %ymm5, %ymm1 +// CHECK: encoding: [0xc4,0xe3,0x55,0x0c,0x08,0x03] + vblendps $3, (%eax), %ymm5, %ymm1 + +// CHECK: vblendpd $3, %ymm2, %ymm5, %ymm1 +// CHECK: encoding: [0xc4,0xe3,0x55,0x0d,0xca,0x03] + vblendpd $3, %ymm2, %ymm5, %ymm1 + +// CHECK: vblendpd $3, (%eax), %ymm5, %ymm1 +// CHECK: encoding: [0xc4,0xe3,0x55,0x0d,0x08,0x03] + vblendpd $3, (%eax), %ymm5, %ymm1 + +// CHECK: vdpps $3, %ymm2, %ymm5, %ymm1 +// CHECK: encoding: [0xc4,0xe3,0x55,0x40,0xca,0x03] + vdpps $3, %ymm2, %ymm5, %ymm1 + +// CHECK: vdpps $3, (%eax), %ymm5, %ymm1 +// CHECK: encoding: [0xc4,0xe3,0x55,0x40,0x08,0x03] + vdpps $3, (%eax), %ymm5, %ymm1 + Modified: llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s Mon Jul 19 18:32:44 2010 @@ -3000,3 +3000,75 @@ // CHECK: encoding: [0xc4,0x41,0x1c,0xc2,0xeb,0x1f] vcmptrue_usps %ymm11, %ymm12, %ymm13 +// CHECK: vaddsubps %ymm11, %ymm12, %ymm13 +// CHECK: encoding: [0xc4,0x41,0x1f,0xd0,0xeb] + vaddsubps %ymm11, %ymm12, %ymm13 + +// CHECK: vaddsubps (%rax), %ymm11, %ymm12 +// CHECK: encoding: [0xc5,0x27,0xd0,0x20] + vaddsubps (%rax), %ymm11, %ymm12 + +// CHECK: vaddsubpd %ymm11, %ymm12, %ymm13 +// CHECK: encoding: [0xc4,0x41,0x1d,0xd0,0xeb] + vaddsubpd %ymm11, %ymm12, %ymm13 + +// CHECK: vaddsubpd (%rax), %ymm11, %ymm12 +// CHECK: encoding: [0xc5,0x25,0xd0,0x20] + vaddsubpd (%rax), %ymm11, %ymm12 + +// CHECK: vhaddps %ymm11, %ymm12, %ymm13 +// CHECK: encoding: [0xc4,0x41,0x1f,0x7c,0xeb] + vhaddps %ymm11, %ymm12, %ymm13 + +// CHECK: vhaddps (%rax), %ymm12, %ymm13 +// CHECK: encoding: [0xc5,0x1f,0x7c,0x28] + vhaddps (%rax), %ymm12, %ymm13 + +// CHECK: vhaddpd %ymm11, %ymm12, %ymm13 +// CHECK: encoding: [0xc4,0x41,0x1d,0x7c,0xeb] + vhaddpd %ymm11, %ymm12, %ymm13 + +// CHECK: vhaddpd (%rax), %ymm12, %ymm13 +// CHECK: encoding: [0xc5,0x1d,0x7c,0x28] + vhaddpd (%rax), %ymm12, %ymm13 + +// CHECK: vhsubps %ymm11, %ymm12, %ymm13 +// CHECK: encoding: [0xc4,0x41,0x1f,0x7d,0xeb] + vhsubps %ymm11, %ymm12, %ymm13 + +// CHECK: vhsubps (%rax), %ymm12, %ymm13 +// CHECK: encoding: [0xc5,0x1f,0x7d,0x28] + vhsubps (%rax), %ymm12, %ymm13 + +// CHECK: vhsubpd %ymm11, %ymm12, %ymm13 +// CHECK: encoding: [0xc4,0x41,0x1d,0x7d,0xeb] + vhsubpd %ymm11, %ymm12, %ymm13 + +// CHECK: vhsubpd (%rax), %ymm12, %ymm13 +// CHECK: encoding: [0xc5,0x1d,0x7d,0x28] + vhsubpd (%rax), %ymm12, %ymm13 + +// CHECK: vblendps $3, %ymm12, %ymm10, %ymm11 +// CHECK: encoding: [0xc4,0x43,0x2d,0x0c,0xdc,0x03] + vblendps $3, %ymm12, %ymm10, %ymm11 + +// CHECK: vblendps $3, (%rax), %ymm10, %ymm11 +// CHECK: encoding: [0xc4,0x63,0x2d,0x0c,0x18,0x03] + vblendps $3, (%rax), %ymm10, %ymm11 + +// CHECK: vblendpd $3, %ymm12, %ymm10, %ymm11 +// CHECK: encoding: [0xc4,0x43,0x2d,0x0d,0xdc,0x03] + vblendpd $3, %ymm12, %ymm10, %ymm11 + +// CHECK: vblendpd $3, (%rax), %ymm10, %ymm11 +// CHECK: encoding: [0xc4,0x63,0x2d,0x0d,0x18,0x03] + vblendpd $3, (%rax), %ymm10, %ymm11 + +// CHECK: vdpps $3, %ymm12, %ymm10, %ymm11 +// CHECK: encoding: [0xc4,0x43,0x2d,0x40,0xdc,0x03] + vdpps $3, %ymm12, %ymm10, %ymm11 + +// CHECK: vdpps $3, (%rax), %ymm10, %ymm11 +// CHECK: encoding: [0xc4,0x63,0x2d,0x40,0x18,0x03] + vdpps $3, (%rax), %ymm10, %ymm11 + Modified: llvm/trunk/utils/TableGen/EDEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/EDEmitter.cpp?rev=108769&r1=108768&r2=108769&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/EDEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/EDEmitter.cpp Mon Jul 19 18:32:44 2010 @@ -339,6 +339,7 @@ MEM("f80mem"); MEM("opaque80mem"); MEM("i128mem"); + MEM("i256mem"); MEM("f128mem"); MEM("f256mem"); MEM("opaque512mem"); From sabre at nondot.org Mon Jul 19 18:41:57 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 19 Jul 2010 23:41:57 -0000 Subject: [llvm-commits] [llvm] r108782 - in /llvm/trunk/lib/Target/X86: AsmPrinter/X86AsmPrinter.cpp AsmPrinter/X86AsmPrinter.h AsmPrinter/X86MCInstLower.cpp AsmPrinter/X86MCInstLower.h X86AsmPrinter.cpp X86AsmPrinter.h X86MCInstLower.cpp X86MCInstLower.h Message-ID: <20100719234157.45E312A6C12C@llvm.org> Author: lattner Date: Mon Jul 19 18:41:57 2010 New Revision: 108782 URL: http://llvm.org/viewvc/llvm-project?rev=108782&view=rev Log: fix a layering problem by moving the x86 implementation of AsmPrinter and InstLowering into libx86 and out of the asmprinter subdirectory. Now X86/AsmPrinter just depends on MC stuff, not all of codegen and LLVM IR. Added: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp - copied, changed from r108730, llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp llvm/trunk/lib/Target/X86/X86AsmPrinter.h - copied, changed from r108730, llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h llvm/trunk/lib/Target/X86/X86MCInstLower.cpp - copied unchanged from r108730, llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp llvm/trunk/lib/Target/X86/X86MCInstLower.h - copied unchanged from r108730, llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h Removed: llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h Removed: llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp?rev=108781&view=auto ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp (removed) @@ -1,684 +0,0 @@ -//===-- X86AsmPrinter.cpp - Convert X86 LLVM code to AT&T assembly --------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains a printer that converts from our internal representation -// of machine-dependent LLVM code to X86 machine code. -// -//===----------------------------------------------------------------------===// - -#include "X86AsmPrinter.h" -#include "X86ATTInstPrinter.h" -#include "X86IntelInstPrinter.h" -#include "X86MCInstLower.h" -#include "X86.h" -#include "X86COFFMachineModuleInfo.h" -#include "X86MachineFunctionInfo.h" -#include "X86TargetMachine.h" -#include "llvm/CallingConv.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Module.h" -#include "llvm/Type.h" -#include "llvm/Assembly/Writer.h" -#include "llvm/MC/MCAsmInfo.h" -#include "llvm/MC/MCContext.h" -#include "llvm/MC/MCExpr.h" -#include "llvm/MC/MCSectionMachO.h" -#include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCSymbol.h" -#include "llvm/CodeGen/MachineJumpTableInfo.h" -#include "llvm/CodeGen/MachineModuleInfoImpls.h" -#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" -#include "llvm/Support/COFF.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Target/Mangler.h" -#include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetRegistry.h" -#include "llvm/ADT/SmallString.h" -using namespace llvm; - -//===----------------------------------------------------------------------===// -// Primitive Helper Functions. -//===----------------------------------------------------------------------===// - -void X86AsmPrinter::PrintPICBaseSymbol(raw_ostream &O) const { - const TargetLowering *TLI = TM.getTargetLowering(); - O << *static_cast(TLI)->getPICBaseSymbol(MF, - OutContext); -} - -/// runOnMachineFunction - Emit the function body. -/// -bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) { - SetupMachineFunction(MF); - - if (Subtarget->isTargetCOFF()) { - bool Intrn = MF.getFunction()->hasInternalLinkage(); - OutStreamer.BeginCOFFSymbolDef(CurrentFnSym); - OutStreamer.EmitCOFFSymbolStorageClass(Intrn ? COFF::IMAGE_SYM_CLASS_STATIC - : COFF::IMAGE_SYM_CLASS_EXTERNAL); - OutStreamer.EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_FUNCTION - << COFF::SCT_COMPLEX_TYPE_SHIFT); - OutStreamer.EndCOFFSymbolDef(); - } - - // Have common code print out the function header with linkage info etc. - EmitFunctionHeader(); - - // Emit the rest of the function body. - EmitFunctionBody(); - - // We didn't modify anything. - return false; -} - -/// printSymbolOperand - Print a raw symbol reference operand. This handles -/// jump tables, constant pools, global address and external symbols, all of -/// which print to a label with various suffixes for relocation types etc. -void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO, - raw_ostream &O) { - switch (MO.getType()) { - default: llvm_unreachable("unknown symbol type!"); - case MachineOperand::MO_JumpTableIndex: - O << *GetJTISymbol(MO.getIndex()); - break; - case MachineOperand::MO_ConstantPoolIndex: - O << *GetCPISymbol(MO.getIndex()); - printOffset(MO.getOffset(), O); - break; - case MachineOperand::MO_GlobalAddress: { - const GlobalValue *GV = MO.getGlobal(); - - MCSymbol *GVSym; - if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) - GVSym = GetSymbolWithGlobalValueBase(GV, "$stub"); - else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || - MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE || - MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) - GVSym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); - else - GVSym = Mang->getSymbol(GV); - - // Handle dllimport linkage. - if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) - GVSym = OutContext.GetOrCreateSymbol(Twine("__imp_") + GVSym->getName()); - - if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || - MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE) { - MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); - MachineModuleInfoImpl::StubValueTy &StubSym = - MMI->getObjFileInfo().getGVStubEntry(Sym); - if (StubSym.getPointer() == 0) - StubSym = MachineModuleInfoImpl:: - StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); - } else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE){ - MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); - MachineModuleInfoImpl::StubValueTy &StubSym = - MMI->getObjFileInfo().getHiddenGVStubEntry(Sym); - if (StubSym.getPointer() == 0) - StubSym = MachineModuleInfoImpl:: - StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); - } else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) { - MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$stub"); - MachineModuleInfoImpl::StubValueTy &StubSym = - MMI->getObjFileInfo().getFnStubEntry(Sym); - if (StubSym.getPointer() == 0) - StubSym = MachineModuleInfoImpl:: - StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); - } - - // If the name begins with a dollar-sign, enclose it in parens. We do this - // to avoid having it look like an integer immediate to the assembler. - if (GVSym->getName()[0] != '$') - O << *GVSym; - else - O << '(' << *GVSym << ')'; - printOffset(MO.getOffset(), O); - break; - } - case MachineOperand::MO_ExternalSymbol: { - const MCSymbol *SymToPrint; - if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) { - SmallString<128> TempNameStr; - TempNameStr += StringRef(MO.getSymbolName()); - TempNameStr += StringRef("$stub"); - - MCSymbol *Sym = GetExternalSymbolSymbol(TempNameStr.str()); - MachineModuleInfoImpl::StubValueTy &StubSym = - MMI->getObjFileInfo().getFnStubEntry(Sym); - if (StubSym.getPointer() == 0) { - TempNameStr.erase(TempNameStr.end()-5, TempNameStr.end()); - StubSym = MachineModuleInfoImpl:: - StubValueTy(OutContext.GetOrCreateSymbol(TempNameStr.str()), - true); - } - SymToPrint = StubSym.getPointer(); - } else { - SymToPrint = GetExternalSymbolSymbol(MO.getSymbolName()); - } - - // If the name begins with a dollar-sign, enclose it in parens. We do this - // to avoid having it look like an integer immediate to the assembler. - if (SymToPrint->getName()[0] != '$') - O << *SymToPrint; - else - O << '(' << *SymToPrint << '('; - break; - } - } - - switch (MO.getTargetFlags()) { - default: - llvm_unreachable("Unknown target flag on GV operand"); - case X86II::MO_NO_FLAG: // No flag. - break; - case X86II::MO_DARWIN_NONLAZY: - case X86II::MO_DLLIMPORT: - case X86II::MO_DARWIN_STUB: - // These affect the name of the symbol, not any suffix. - break; - case X86II::MO_GOT_ABSOLUTE_ADDRESS: - O << " + [.-"; - PrintPICBaseSymbol(O); - O << ']'; - break; - case X86II::MO_PIC_BASE_OFFSET: - case X86II::MO_DARWIN_NONLAZY_PIC_BASE: - case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: - O << '-'; - PrintPICBaseSymbol(O); - break; - case X86II::MO_TLSGD: O << "@TLSGD"; break; - case X86II::MO_GOTTPOFF: O << "@GOTTPOFF"; break; - case X86II::MO_INDNTPOFF: O << "@INDNTPOFF"; break; - case X86II::MO_TPOFF: O << "@TPOFF"; break; - case X86II::MO_NTPOFF: O << "@NTPOFF"; break; - case X86II::MO_GOTPCREL: O << "@GOTPCREL"; break; - case X86II::MO_GOT: O << "@GOT"; break; - case X86II::MO_GOTOFF: O << "@GOTOFF"; break; - case X86II::MO_PLT: O << "@PLT"; break; - case X86II::MO_TLVP: O << "@TLVP"; break; - case X86II::MO_TLVP_PIC_BASE: - O << "@TLVP" << '-'; - PrintPICBaseSymbol(O); - break; - } -} - -/// print_pcrel_imm - This is used to print an immediate value that ends up -/// being encoded as a pc-relative value. These print slightly differently, for -/// example, a $ is not emitted. -void X86AsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo, - raw_ostream &O) { - const MachineOperand &MO = MI->getOperand(OpNo); - switch (MO.getType()) { - default: llvm_unreachable("Unknown pcrel immediate operand"); - case MachineOperand::MO_Register: - // pc-relativeness was handled when computing the value in the reg. - printOperand(MI, OpNo, O); - return; - case MachineOperand::MO_Immediate: - O << MO.getImm(); - return; - case MachineOperand::MO_MachineBasicBlock: - O << *MO.getMBB()->getSymbol(); - return; - case MachineOperand::MO_GlobalAddress: - case MachineOperand::MO_ExternalSymbol: - printSymbolOperand(MO, O); - return; - } -} - - -void X86AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, - raw_ostream &O, const char *Modifier) { - const MachineOperand &MO = MI->getOperand(OpNo); - switch (MO.getType()) { - default: llvm_unreachable("unknown operand type!"); - case MachineOperand::MO_Register: { - O << '%'; - unsigned Reg = MO.getReg(); - if (Modifier && strncmp(Modifier, "subreg", strlen("subreg")) == 0) { - EVT VT = (strcmp(Modifier+6,"64") == 0) ? - MVT::i64 : ((strcmp(Modifier+6, "32") == 0) ? MVT::i32 : - ((strcmp(Modifier+6,"16") == 0) ? MVT::i16 : MVT::i8)); - Reg = getX86SubSuperRegister(Reg, VT); - } - O << X86ATTInstPrinter::getRegisterName(Reg); - return; - } - - case MachineOperand::MO_Immediate: - O << '$' << MO.getImm(); - return; - - case MachineOperand::MO_JumpTableIndex: - case MachineOperand::MO_ConstantPoolIndex: - case MachineOperand::MO_GlobalAddress: - case MachineOperand::MO_ExternalSymbol: { - O << '$'; - printSymbolOperand(MO, O); - break; - } - } -} - -void X86AsmPrinter::printSSECC(const MachineInstr *MI, unsigned Op, - raw_ostream &O) { - unsigned char value = MI->getOperand(Op).getImm(); - assert(value <= 7 && "Invalid ssecc argument!"); - switch (value) { - case 0: O << "eq"; break; - case 1: O << "lt"; break; - case 2: O << "le"; break; - case 3: O << "unord"; break; - case 4: O << "neq"; break; - case 5: O << "nlt"; break; - case 6: O << "nle"; break; - case 7: O << "ord"; break; - } -} - -void X86AsmPrinter::printLeaMemReference(const MachineInstr *MI, unsigned Op, - raw_ostream &O, const char *Modifier) { - const MachineOperand &BaseReg = MI->getOperand(Op); - const MachineOperand &IndexReg = MI->getOperand(Op+2); - const MachineOperand &DispSpec = MI->getOperand(Op+3); - - // If we really don't want to print out (rip), don't. - bool HasBaseReg = BaseReg.getReg() != 0; - if (HasBaseReg && Modifier && !strcmp(Modifier, "no-rip") && - BaseReg.getReg() == X86::RIP) - HasBaseReg = false; - - // HasParenPart - True if we will print out the () part of the mem ref. - bool HasParenPart = IndexReg.getReg() || HasBaseReg; - - if (DispSpec.isImm()) { - int DispVal = DispSpec.getImm(); - if (DispVal || !HasParenPart) - O << DispVal; - } else { - assert(DispSpec.isGlobal() || DispSpec.isCPI() || - DispSpec.isJTI() || DispSpec.isSymbol()); - printSymbolOperand(MI->getOperand(Op+3), O); - } - - if (HasParenPart) { - assert(IndexReg.getReg() != X86::ESP && - "X86 doesn't allow scaling by ESP"); - - O << '('; - if (HasBaseReg) - printOperand(MI, Op, O, Modifier); - - if (IndexReg.getReg()) { - O << ','; - printOperand(MI, Op+2, O, Modifier); - unsigned ScaleVal = MI->getOperand(Op+1).getImm(); - if (ScaleVal != 1) - O << ',' << ScaleVal; - } - O << ')'; - } -} - -void X86AsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op, - raw_ostream &O, const char *Modifier) { - assert(isMem(MI, Op) && "Invalid memory reference!"); - const MachineOperand &Segment = MI->getOperand(Op+4); - if (Segment.getReg()) { - printOperand(MI, Op+4, O, Modifier); - O << ':'; - } - printLeaMemReference(MI, Op, O, Modifier); -} - -void X86AsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op, - raw_ostream &O) { - PrintPICBaseSymbol(O); - O << '\n'; - PrintPICBaseSymbol(O); - O << ':'; -} - -bool X86AsmPrinter::printAsmMRegister(const MachineOperand &MO, char Mode, - raw_ostream &O) { - unsigned Reg = MO.getReg(); - switch (Mode) { - default: return true; // Unknown mode. - case 'b': // Print QImode register - Reg = getX86SubSuperRegister(Reg, MVT::i8); - break; - case 'h': // Print QImode high register - Reg = getX86SubSuperRegister(Reg, MVT::i8, true); - break; - case 'w': // Print HImode register - Reg = getX86SubSuperRegister(Reg, MVT::i16); - break; - case 'k': // Print SImode register - Reg = getX86SubSuperRegister(Reg, MVT::i32); - break; - case 'q': // Print DImode register - Reg = getX86SubSuperRegister(Reg, MVT::i64); - break; - } - - O << '%' << X86ATTInstPrinter::getRegisterName(Reg); - return false; -} - -/// PrintAsmOperand - Print out an operand for an inline asm expression. -/// -bool X86AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, - unsigned AsmVariant, - const char *ExtraCode, raw_ostream &O) { - // Does this asm operand have a single letter operand modifier? - if (ExtraCode && ExtraCode[0]) { - if (ExtraCode[1] != 0) return true; // Unknown modifier. - - const MachineOperand &MO = MI->getOperand(OpNo); - - switch (ExtraCode[0]) { - default: return true; // Unknown modifier. - case 'a': // This is an address. Currently only 'i' and 'r' are expected. - if (MO.isImm()) { - O << MO.getImm(); - return false; - } - if (MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isSymbol()) { - printSymbolOperand(MO, O); - if (Subtarget->isPICStyleRIPRel()) - O << "(%rip)"; - return false; - } - if (MO.isReg()) { - O << '('; - printOperand(MI, OpNo, O); - O << ')'; - return false; - } - return true; - - case 'c': // Don't print "$" before a global var name or constant. - if (MO.isImm()) - O << MO.getImm(); - else if (MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isSymbol()) - printSymbolOperand(MO, O); - else - printOperand(MI, OpNo, O); - return false; - - case 'A': // Print '*' before a register (it must be a register) - if (MO.isReg()) { - O << '*'; - printOperand(MI, OpNo, O); - return false; - } - return true; - - case 'b': // Print QImode register - case 'h': // Print QImode high register - case 'w': // Print HImode register - case 'k': // Print SImode register - case 'q': // Print DImode register - if (MO.isReg()) - return printAsmMRegister(MO, ExtraCode[0], O); - printOperand(MI, OpNo, O); - return false; - - case 'P': // This is the operand of a call, treat specially. - print_pcrel_imm(MI, OpNo, O); - return false; - - case 'n': // Negate the immediate or print a '-' before the operand. - // Note: this is a temporary solution. It should be handled target - // independently as part of the 'MC' work. - if (MO.isImm()) { - O << -MO.getImm(); - return false; - } - O << '-'; - } - } - - printOperand(MI, OpNo, O); - return false; -} - -bool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, - unsigned OpNo, unsigned AsmVariant, - const char *ExtraCode, - raw_ostream &O) { - if (ExtraCode && ExtraCode[0]) { - if (ExtraCode[1] != 0) return true; // Unknown modifier. - - switch (ExtraCode[0]) { - default: return true; // Unknown modifier. - case 'b': // Print QImode register - case 'h': // Print QImode high register - case 'w': // Print HImode register - case 'k': // Print SImode register - case 'q': // Print SImode register - // These only apply to registers, ignore on mem. - break; - case 'P': // Don't print @PLT, but do print as memory. - printMemReference(MI, OpNo, O, "no-rip"); - return false; - } - } - printMemReference(MI, OpNo, O); - return false; -} - -void X86AsmPrinter::EmitStartOfAsmFile(Module &M) { - if (Subtarget->isTargetDarwin()) - OutStreamer.SwitchSection(getObjFileLowering().getTextSection()); -} - - -void X86AsmPrinter::EmitEndOfAsmFile(Module &M) { - if (Subtarget->isTargetDarwin()) { - // All darwin targets use mach-o. - MachineModuleInfoMachO &MMIMacho = - MMI->getObjFileInfo(); - - // Output stubs for dynamically-linked functions. - MachineModuleInfoMachO::SymbolListTy Stubs; - - Stubs = MMIMacho.GetFnStubList(); - if (!Stubs.empty()) { - const MCSection *TheSection = - OutContext.getMachOSection("__IMPORT", "__jump_table", - MCSectionMachO::S_SYMBOL_STUBS | - MCSectionMachO::S_ATTR_SELF_MODIFYING_CODE | - MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, - 5, SectionKind::getMetadata()); - OutStreamer.SwitchSection(TheSection); - - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - // L_foo$stub: - OutStreamer.EmitLabel(Stubs[i].first); - // .indirect_symbol _foo - OutStreamer.EmitSymbolAttribute(Stubs[i].second.getPointer(), - MCSA_IndirectSymbol); - // hlt; hlt; hlt; hlt; hlt hlt = 0xf4 = -12. - const char HltInsts[] = { -12, -12, -12, -12, -12 }; - OutStreamer.EmitBytes(StringRef(HltInsts, 5), 0/*addrspace*/); - } - - Stubs.clear(); - OutStreamer.AddBlankLine(); - } - - // Output stubs for external and common global variables. - Stubs = MMIMacho.GetGVStubList(); - if (!Stubs.empty()) { - const MCSection *TheSection = - OutContext.getMachOSection("__IMPORT", "__pointers", - MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, - SectionKind::getMetadata()); - OutStreamer.SwitchSection(TheSection); - - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - // L_foo$non_lazy_ptr: - OutStreamer.EmitLabel(Stubs[i].first); - // .indirect_symbol _foo - MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second; - OutStreamer.EmitSymbolAttribute(MCSym.getPointer(), - MCSA_IndirectSymbol); - // .long 0 - if (MCSym.getInt()) - // External to current translation unit. - OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/); - else - // Internal to current translation unit. - // - // When we place the LSDA into the TEXT section, the type info - // pointers need to be indirect and pc-rel. We accomplish this by - // using NLPs. However, sometimes the types are local to the file. So - // we need to fill in the value for the NLP in those cases. - OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(), - OutContext), - 4/*size*/, 0/*addrspace*/); - } - Stubs.clear(); - OutStreamer.AddBlankLine(); - } - - Stubs = MMIMacho.GetHiddenGVStubList(); - if (!Stubs.empty()) { - OutStreamer.SwitchSection(getObjFileLowering().getDataSection()); - EmitAlignment(2); - - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - // L_foo$non_lazy_ptr: - OutStreamer.EmitLabel(Stubs[i].first); - // .long _foo - OutStreamer.EmitValue(MCSymbolRefExpr:: - Create(Stubs[i].second.getPointer(), - OutContext), - 4/*size*/, 0/*addrspace*/); - } - Stubs.clear(); - OutStreamer.AddBlankLine(); - } - - // Funny Darwin hack: This flag tells the linker that no global symbols - // contain code that falls through to other global symbols (e.g. the obvious - // implementation of multiple entry points). If this doesn't occur, the - // linker can safely perform dead code stripping. Since LLVM never - // generates code that does this, it is always safe to set. - OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols); - } - - if (Subtarget->isTargetCOFF()) { - X86COFFMachineModuleInfo &COFFMMI = - MMI->getObjFileInfo(); - - // Emit type information for external functions - typedef X86COFFMachineModuleInfo::externals_iterator externals_iterator; - for (externals_iterator I = COFFMMI.externals_begin(), - E = COFFMMI.externals_end(); - I != E; ++I) { - OutStreamer.BeginCOFFSymbolDef(CurrentFnSym); - OutStreamer.EmitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_EXTERNAL); - OutStreamer.EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_FUNCTION - << COFF::SCT_COMPLEX_TYPE_SHIFT); - OutStreamer.EndCOFFSymbolDef(); - } - - // Necessary for dllexport support - std::vector DLLExportedFns, DLLExportedGlobals; - - const TargetLoweringObjectFileCOFF &TLOFCOFF = - static_cast(getObjFileLowering()); - - for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) - if (I->hasDLLExportLinkage()) - DLLExportedFns.push_back(Mang->getSymbol(I)); - - for (Module::const_global_iterator I = M.global_begin(), - E = M.global_end(); I != E; ++I) - if (I->hasDLLExportLinkage()) - DLLExportedGlobals.push_back(Mang->getSymbol(I)); - - // Output linker support code for dllexported globals on windows. - if (!DLLExportedGlobals.empty() || !DLLExportedFns.empty()) { - OutStreamer.SwitchSection(TLOFCOFF.getDrectveSection()); - SmallString<128> name; - for (unsigned i = 0, e = DLLExportedGlobals.size(); i != e; ++i) { - if (Subtarget->isTargetWindows()) - name = " /EXPORT:"; - else - name = " -export:"; - name += DLLExportedGlobals[i]->getName(); - if (Subtarget->isTargetWindows()) - name += ",DATA"; - else - name += ",data"; - OutStreamer.EmitBytes(name, 0); - } - - for (unsigned i = 0, e = DLLExportedFns.size(); i != e; ++i) { - if (Subtarget->isTargetWindows()) - name = " /EXPORT:"; - else - name = " -export:"; - name += DLLExportedFns[i]->getName(); - OutStreamer.EmitBytes(name, 0); - } - } - } - - if (Subtarget->isTargetELF()) { - const TargetLoweringObjectFileELF &TLOFELF = - static_cast(getObjFileLowering()); - - MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo(); - - // Output stubs for external and common global variables. - MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList(); - if (!Stubs.empty()) { - OutStreamer.SwitchSection(TLOFELF.getDataRelSection()); - const TargetData *TD = TM.getTargetData(); - - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - OutStreamer.EmitLabel(Stubs[i].first); - OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), - TD->getPointerSize(), 0); - } - Stubs.clear(); - } - } -} - - -//===----------------------------------------------------------------------===// -// Target Registry Stuff -//===----------------------------------------------------------------------===// - -static MCInstPrinter *createX86MCInstPrinter(const Target &T, - unsigned SyntaxVariant, - const MCAsmInfo &MAI) { - if (SyntaxVariant == 0) - return new X86ATTInstPrinter(MAI); - if (SyntaxVariant == 1) - return new X86IntelInstPrinter(MAI); - return 0; -} - -// Force static initialization. -extern "C" void LLVMInitializeX86AsmPrinter() { - RegisterAsmPrinter X(TheX86_32Target); - RegisterAsmPrinter Y(TheX86_64Target); - - TargetRegistry::RegisterMCInstPrinter(TheX86_32Target,createX86MCInstPrinter); - TargetRegistry::RegisterMCInstPrinter(TheX86_64Target,createX86MCInstPrinter); -} Removed: llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h?rev=108781&view=auto ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h (removed) @@ -1,89 +0,0 @@ -//===-- X86AsmPrinter.h - Convert X86 LLVM code to assembly -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// AT&T assembly code printer class. -// -//===----------------------------------------------------------------------===// - -#ifndef X86ASMPRINTER_H -#define X86ASMPRINTER_H - -#include "../X86.h" -#include "../X86MachineFunctionInfo.h" -#include "../X86TargetMachine.h" -#include "llvm/ADT/StringSet.h" -#include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/MachineModuleInfo.h" -#include "llvm/CodeGen/ValueTypes.h" -#include "llvm/Support/Compiler.h" - -namespace llvm { - -class MachineJumpTableInfo; -class MCContext; -class MCInst; -class MCStreamer; -class MCSymbol; - -class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter { - const X86Subtarget *Subtarget; - public: - explicit X86AsmPrinter(TargetMachine &TM, MCStreamer &Streamer) - : AsmPrinter(TM, Streamer) { - Subtarget = &TM.getSubtarget(); - } - - virtual const char *getPassName() const { - return "X86 AT&T-Style Assembly Printer"; - } - - const X86Subtarget &getSubtarget() const { return *Subtarget; } - - virtual void EmitStartOfAsmFile(Module &M); - - virtual void EmitEndOfAsmFile(Module &M); - - virtual void EmitInstruction(const MachineInstr *MI); - - void printSymbolOperand(const MachineOperand &MO, raw_ostream &O); - - // These methods are used by the tablegen'erated instruction printer. - void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O, - const char *Modifier = 0); - void print_pcrel_imm(const MachineInstr *MI, unsigned OpNo, raw_ostream &O); - - bool printAsmMRegister(const MachineOperand &MO, char Mode, raw_ostream &O); - bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &OS); - bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &OS); - - void printMachineInstruction(const MachineInstr *MI); - void printSSECC(const MachineInstr *MI, unsigned Op, raw_ostream &O); - void printMemReference(const MachineInstr *MI, unsigned Op, raw_ostream &O, - const char *Modifier=NULL); - void printLeaMemReference(const MachineInstr *MI, unsigned Op, raw_ostream &O, - const char *Modifier=NULL); - - void printPICLabel(const MachineInstr *MI, unsigned Op, raw_ostream &O); - - void PrintPICBaseSymbol(raw_ostream &O) const; - - bool runOnMachineFunction(MachineFunction &F); - - void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); - - MachineLocation getDebugValueLocation(const MachineInstr *MI) const; -}; - -} // end namespace llvm - -#endif Removed: llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp?rev=108781&view=auto ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp (removed) @@ -1,632 +0,0 @@ -//===-- X86MCInstLower.cpp - Convert X86 MachineInstr to an MCInst --------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains code to lower X86 MachineInstrs to their corresponding -// MCInst records. -// -//===----------------------------------------------------------------------===// - -#include "X86MCInstLower.h" -#include "X86AsmPrinter.h" -#include "X86COFFMachineModuleInfo.h" -#include "X86MCAsmInfo.h" -#include "llvm/Analysis/DebugInfo.h" -#include "llvm/CodeGen/MachineModuleInfoImpls.h" -#include "llvm/MC/MCContext.h" -#include "llvm/MC/MCExpr.h" -#include "llvm/MC/MCInst.h" -#include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCSymbol.h" -#include "llvm/Target/Mangler.h" -#include "llvm/Support/FormattedStream.h" -#include "llvm/ADT/SmallString.h" -#include "llvm/Type.h" -using namespace llvm; - - -const X86Subtarget &X86MCInstLower::getSubtarget() const { - return AsmPrinter.getSubtarget(); -} - -MachineModuleInfoMachO &X86MCInstLower::getMachOMMI() const { - assert(getSubtarget().isTargetDarwin() &&"Can only get MachO info on darwin"); - return AsmPrinter.MMI->getObjFileInfo(); -} - - -MCSymbol *X86MCInstLower::GetPICBaseSymbol() const { - const TargetLowering *TLI = AsmPrinter.TM.getTargetLowering(); - return static_cast(TLI)-> - getPICBaseSymbol(AsmPrinter.MF, Ctx); -} - -/// GetSymbolFromOperand - Lower an MO_GlobalAddress or MO_ExternalSymbol -/// operand to an MCSymbol. -MCSymbol *X86MCInstLower:: -GetSymbolFromOperand(const MachineOperand &MO) const { - assert((MO.isGlobal() || MO.isSymbol()) && "Isn't a symbol reference"); - - SmallString<128> Name; - - if (!MO.isGlobal()) { - assert(MO.isSymbol()); - Name += AsmPrinter.MAI->getGlobalPrefix(); - Name += MO.getSymbolName(); - } else { - const GlobalValue *GV = MO.getGlobal(); - bool isImplicitlyPrivate = false; - if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB || - MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || - MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE || - MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) - isImplicitlyPrivate = true; - - Mang->getNameWithPrefix(Name, GV, isImplicitlyPrivate); - } - - // If the target flags on the operand changes the name of the symbol, do that - // before we return the symbol. - switch (MO.getTargetFlags()) { - default: break; - case X86II::MO_DLLIMPORT: { - // Handle dllimport linkage. - const char *Prefix = "__imp_"; - Name.insert(Name.begin(), Prefix, Prefix+strlen(Prefix)); - break; - } - case X86II::MO_DARWIN_NONLAZY: - case X86II::MO_DARWIN_NONLAZY_PIC_BASE: { - Name += "$non_lazy_ptr"; - MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str()); - - MachineModuleInfoImpl::StubValueTy &StubSym = - getMachOMMI().getGVStubEntry(Sym); - if (StubSym.getPointer() == 0) { - assert(MO.isGlobal() && "Extern symbol not handled yet"); - StubSym = - MachineModuleInfoImpl:: - StubValueTy(AsmPrinter.Mang->getSymbol(MO.getGlobal()), - !MO.getGlobal()->hasInternalLinkage()); - } - return Sym; - } - case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: { - Name += "$non_lazy_ptr"; - MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str()); - MachineModuleInfoImpl::StubValueTy &StubSym = - getMachOMMI().getHiddenGVStubEntry(Sym); - if (StubSym.getPointer() == 0) { - assert(MO.isGlobal() && "Extern symbol not handled yet"); - StubSym = - MachineModuleInfoImpl:: - StubValueTy(AsmPrinter.Mang->getSymbol(MO.getGlobal()), - !MO.getGlobal()->hasInternalLinkage()); - } - return Sym; - } - case X86II::MO_DARWIN_STUB: { - Name += "$stub"; - MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str()); - MachineModuleInfoImpl::StubValueTy &StubSym = - getMachOMMI().getFnStubEntry(Sym); - if (StubSym.getPointer()) - return Sym; - - if (MO.isGlobal()) { - StubSym = - MachineModuleInfoImpl:: - StubValueTy(AsmPrinter.Mang->getSymbol(MO.getGlobal()), - !MO.getGlobal()->hasInternalLinkage()); - } else { - Name.erase(Name.end()-5, Name.end()); - StubSym = - MachineModuleInfoImpl:: - StubValueTy(Ctx.GetOrCreateSymbol(Name.str()), false); - } - return Sym; - } - } - - return Ctx.GetOrCreateSymbol(Name.str()); -} - -MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO, - MCSymbol *Sym) const { - // FIXME: We would like an efficient form for this, so we don't have to do a - // lot of extra uniquing. - const MCExpr *Expr = 0; - MCSymbolRefExpr::VariantKind RefKind = MCSymbolRefExpr::VK_None; - - switch (MO.getTargetFlags()) { - default: llvm_unreachable("Unknown target flag on GV operand"); - case X86II::MO_NO_FLAG: // No flag. - // These affect the name of the symbol, not any suffix. - case X86II::MO_DARWIN_NONLAZY: - case X86II::MO_DLLIMPORT: - case X86II::MO_DARWIN_STUB: - break; - - case X86II::MO_TLVP: RefKind = MCSymbolRefExpr::VK_TLVP; break; - case X86II::MO_TLVP_PIC_BASE: - Expr = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_TLVP, Ctx); - // Subtract the pic base. - Expr = MCBinaryExpr::CreateSub(Expr, - MCSymbolRefExpr::Create(GetPICBaseSymbol(), - Ctx), - Ctx); - break; - case X86II::MO_TLSGD: RefKind = MCSymbolRefExpr::VK_TLSGD; break; - case X86II::MO_GOTTPOFF: RefKind = MCSymbolRefExpr::VK_GOTTPOFF; break; - case X86II::MO_INDNTPOFF: RefKind = MCSymbolRefExpr::VK_INDNTPOFF; break; - case X86II::MO_TPOFF: RefKind = MCSymbolRefExpr::VK_TPOFF; break; - case X86II::MO_NTPOFF: RefKind = MCSymbolRefExpr::VK_NTPOFF; break; - case X86II::MO_GOTPCREL: RefKind = MCSymbolRefExpr::VK_GOTPCREL; break; - case X86II::MO_GOT: RefKind = MCSymbolRefExpr::VK_GOT; break; - case X86II::MO_GOTOFF: RefKind = MCSymbolRefExpr::VK_GOTOFF; break; - case X86II::MO_PLT: RefKind = MCSymbolRefExpr::VK_PLT; break; - case X86II::MO_PIC_BASE_OFFSET: - case X86II::MO_DARWIN_NONLAZY_PIC_BASE: - case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: - Expr = MCSymbolRefExpr::Create(Sym, Ctx); - // Subtract the pic base. - Expr = MCBinaryExpr::CreateSub(Expr, - MCSymbolRefExpr::Create(GetPICBaseSymbol(), Ctx), - Ctx); - if (MO.isJTI() && AsmPrinter.MAI->hasSetDirective()) { - // If .set directive is supported, use it to reduce the number of - // relocations the assembler will generate for differences between - // local labels. This is only safe when the symbols are in the same - // section so we are restricting it to jumptable references. - MCSymbol *Label = Ctx.CreateTempSymbol(); - AsmPrinter.OutStreamer.EmitAssignment(Label, Expr); - Expr = MCSymbolRefExpr::Create(Label, Ctx); - } - break; - } - - if (Expr == 0) - Expr = MCSymbolRefExpr::Create(Sym, RefKind, Ctx); - - if (!MO.isJTI() && MO.getOffset()) - Expr = MCBinaryExpr::CreateAdd(Expr, - MCConstantExpr::Create(MO.getOffset(), Ctx), - Ctx); - return MCOperand::CreateExpr(Expr); -} - - - -static void lower_subreg32(MCInst *MI, unsigned OpNo) { - // Convert registers in the addr mode according to subreg32. - unsigned Reg = MI->getOperand(OpNo).getReg(); - if (Reg != 0) - MI->getOperand(OpNo).setReg(getX86SubSuperRegister(Reg, MVT::i32)); -} - -static void lower_lea64_32mem(MCInst *MI, unsigned OpNo) { - // Convert registers in the addr mode according to subreg64. - for (unsigned i = 0; i != 4; ++i) { - if (!MI->getOperand(OpNo+i).isReg()) continue; - - unsigned Reg = MI->getOperand(OpNo+i).getReg(); - if (Reg == 0) continue; - - MI->getOperand(OpNo+i).setReg(getX86SubSuperRegister(Reg, MVT::i64)); - } -} - -/// LowerSubReg32_Op0 - Things like MOVZX16rr8 -> MOVZX32rr8. -static void LowerSubReg32_Op0(MCInst &OutMI, unsigned NewOpc) { - OutMI.setOpcode(NewOpc); - lower_subreg32(&OutMI, 0); -} -/// LowerUnaryToTwoAddr - R = setb -> R = sbb R, R -static void LowerUnaryToTwoAddr(MCInst &OutMI, unsigned NewOpc) { - OutMI.setOpcode(NewOpc); - OutMI.addOperand(OutMI.getOperand(0)); - OutMI.addOperand(OutMI.getOperand(0)); -} - -/// \brief Simplify FOO $imm, %{al,ax,eax,rax} to FOO $imm, for instruction with -/// a short fixed-register form. -static void SimplifyShortImmForm(MCInst &Inst, unsigned Opcode) { - unsigned ImmOp = Inst.getNumOperands() - 1; - assert(Inst.getOperand(0).isReg() && Inst.getOperand(ImmOp).isImm() && - ((Inst.getNumOperands() == 3 && Inst.getOperand(1).isReg() && - Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg()) || - Inst.getNumOperands() == 2) && "Unexpected instruction!"); - - // Check whether the destination register can be fixed. - unsigned Reg = Inst.getOperand(0).getReg(); - if (Reg != X86::AL && Reg != X86::AX && Reg != X86::EAX && Reg != X86::RAX) - return; - - // If so, rewrite the instruction. - MCOperand Saved = Inst.getOperand(ImmOp); - Inst = MCInst(); - Inst.setOpcode(Opcode); - Inst.addOperand(Saved); -} - -/// \brief Simplify things like MOV32rm to MOV32o32a. -static void SimplifyShortMoveForm(MCInst &Inst, unsigned Opcode) { - bool IsStore = Inst.getOperand(0).isReg() && Inst.getOperand(1).isReg(); - unsigned AddrBase = IsStore; - unsigned RegOp = IsStore ? 0 : 5; - unsigned AddrOp = AddrBase + 3; - assert(Inst.getNumOperands() == 6 && Inst.getOperand(RegOp).isReg() && - Inst.getOperand(AddrBase + 0).isReg() && // base - Inst.getOperand(AddrBase + 1).isImm() && // scale - Inst.getOperand(AddrBase + 2).isReg() && // index register - (Inst.getOperand(AddrOp).isExpr() || // address - Inst.getOperand(AddrOp).isImm())&& - Inst.getOperand(AddrBase + 4).isReg() && // segment - "Unexpected instruction!"); - - // Check whether the destination register can be fixed. - unsigned Reg = Inst.getOperand(RegOp).getReg(); - if (Reg != X86::AL && Reg != X86::AX && Reg != X86::EAX && Reg != X86::RAX) - return; - - // Check whether this is an absolute address. - // FIXME: We know TLVP symbol refs aren't, but there should be a better way - // to do this here. - bool Absolute = true; - if (Inst.getOperand(AddrOp).isExpr()) { - const MCExpr *MCE = Inst.getOperand(AddrOp).getExpr(); - if (const MCSymbolRefExpr *SRE = dyn_cast(MCE)) - if (SRE->getKind() == MCSymbolRefExpr::VK_TLVP) - Absolute = false; - } - - if (Absolute && - (Inst.getOperand(AddrBase + 0).getReg() != 0 || - Inst.getOperand(AddrBase + 2).getReg() != 0 || - Inst.getOperand(AddrBase + 4).getReg() != 0 || - Inst.getOperand(AddrBase + 1).getImm() != 1)) - return; - - // If so, rewrite the instruction. - MCOperand Saved = Inst.getOperand(AddrOp); - Inst = MCInst(); - Inst.setOpcode(Opcode); - Inst.addOperand(Saved); -} - -void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { - OutMI.setOpcode(MI->getOpcode()); - - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - const MachineOperand &MO = MI->getOperand(i); - - MCOperand MCOp; - switch (MO.getType()) { - default: - MI->dump(); - llvm_unreachable("unknown operand type"); - case MachineOperand::MO_Register: - // Ignore all implicit register operands. - if (MO.isImplicit()) continue; - MCOp = MCOperand::CreateReg(MO.getReg()); - break; - case MachineOperand::MO_Immediate: - MCOp = MCOperand::CreateImm(MO.getImm()); - break; - case MachineOperand::MO_MachineBasicBlock: - MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create( - MO.getMBB()->getSymbol(), Ctx)); - break; - case MachineOperand::MO_GlobalAddress: - MCOp = LowerSymbolOperand(MO, GetSymbolFromOperand(MO)); - break; - case MachineOperand::MO_ExternalSymbol: - MCOp = LowerSymbolOperand(MO, GetSymbolFromOperand(MO)); - break; - case MachineOperand::MO_JumpTableIndex: - MCOp = LowerSymbolOperand(MO, AsmPrinter.GetJTISymbol(MO.getIndex())); - break; - case MachineOperand::MO_ConstantPoolIndex: - MCOp = LowerSymbolOperand(MO, AsmPrinter.GetCPISymbol(MO.getIndex())); - break; - case MachineOperand::MO_BlockAddress: - MCOp = LowerSymbolOperand(MO, - AsmPrinter.GetBlockAddressSymbol(MO.getBlockAddress())); - break; - } - - OutMI.addOperand(MCOp); - } - - // Handle a few special cases to eliminate operand modifiers. - switch (OutMI.getOpcode()) { - case X86::LEA64_32r: // Handle 'subreg rewriting' for the lea64_32mem operand. - lower_lea64_32mem(&OutMI, 1); - // FALL THROUGH. - case X86::LEA64r: - case X86::LEA16r: - case X86::LEA32r: - // LEA should have a segment register, but it must be empty. - assert(OutMI.getNumOperands() == 1+X86::AddrNumOperands && - "Unexpected # of LEA operands"); - assert(OutMI.getOperand(1+X86::AddrSegmentReg).getReg() == 0 && - "LEA has segment specified!"); - break; - case X86::MOVZX16rr8: LowerSubReg32_Op0(OutMI, X86::MOVZX32rr8); break; - case X86::MOVZX16rm8: LowerSubReg32_Op0(OutMI, X86::MOVZX32rm8); break; - case X86::MOVSX16rr8: LowerSubReg32_Op0(OutMI, X86::MOVSX32rr8); break; - case X86::MOVSX16rm8: LowerSubReg32_Op0(OutMI, X86::MOVSX32rm8); break; - case X86::MOVZX64rr32: LowerSubReg32_Op0(OutMI, X86::MOV32rr); break; - case X86::MOVZX64rm32: LowerSubReg32_Op0(OutMI, X86::MOV32rm); break; - case X86::MOV64ri64i32: LowerSubReg32_Op0(OutMI, X86::MOV32ri); break; - case X86::MOVZX64rr8: LowerSubReg32_Op0(OutMI, X86::MOVZX32rr8); break; - case X86::MOVZX64rm8: LowerSubReg32_Op0(OutMI, X86::MOVZX32rm8); break; - case X86::MOVZX64rr16: LowerSubReg32_Op0(OutMI, X86::MOVZX32rr16); break; - case X86::MOVZX64rm16: LowerSubReg32_Op0(OutMI, X86::MOVZX32rm16); break; - case X86::SETB_C8r: LowerUnaryToTwoAddr(OutMI, X86::SBB8rr); break; - case X86::SETB_C16r: LowerUnaryToTwoAddr(OutMI, X86::SBB16rr); break; - case X86::SETB_C32r: LowerUnaryToTwoAddr(OutMI, X86::SBB32rr); break; - case X86::SETB_C64r: LowerUnaryToTwoAddr(OutMI, X86::SBB64rr); break; - case X86::MOV8r0: LowerUnaryToTwoAddr(OutMI, X86::XOR8rr); break; - case X86::MOV32r0: LowerUnaryToTwoAddr(OutMI, X86::XOR32rr); break; - case X86::MMX_V_SET0: LowerUnaryToTwoAddr(OutMI, X86::MMX_PXORrr); break; - case X86::MMX_V_SETALLONES: - LowerUnaryToTwoAddr(OutMI, X86::MMX_PCMPEQDrr); break; - case X86::FsFLD0SS: LowerUnaryToTwoAddr(OutMI, X86::PXORrr); break; - case X86::FsFLD0SD: LowerUnaryToTwoAddr(OutMI, X86::PXORrr); break; - case X86::V_SET0PS: LowerUnaryToTwoAddr(OutMI, X86::XORPSrr); break; - case X86::V_SET0PD: LowerUnaryToTwoAddr(OutMI, X86::XORPDrr); break; - case X86::V_SET0PI: LowerUnaryToTwoAddr(OutMI, X86::PXORrr); break; - case X86::V_SETALLONES: LowerUnaryToTwoAddr(OutMI, X86::PCMPEQDrr); break; - - case X86::MOV16r0: - LowerSubReg32_Op0(OutMI, X86::MOV32r0); // MOV16r0 -> MOV32r0 - LowerUnaryToTwoAddr(OutMI, X86::XOR32rr); // MOV32r0 -> XOR32rr - break; - case X86::MOV64r0: - LowerSubReg32_Op0(OutMI, X86::MOV32r0); // MOV64r0 -> MOV32r0 - LowerUnaryToTwoAddr(OutMI, X86::XOR32rr); // MOV32r0 -> XOR32rr - break; - - // TAILJMPr64, CALL64r, CALL64pcrel32 - These instructions have - // register inputs modeled as normal uses instead of implicit uses. As such, - // truncate off all but the first operand (the callee). FIXME: Change isel. - case X86::TAILJMPr64: - case X86::CALL64r: - case X86::CALL64pcrel32: { - unsigned Opcode = OutMI.getOpcode(); - MCOperand Saved = OutMI.getOperand(0); - OutMI = MCInst(); - OutMI.setOpcode(Opcode); - OutMI.addOperand(Saved); - break; - } - - // TAILJMPd, TAILJMPd64 - Lower to the correct jump instructions. - case X86::TAILJMPr: - case X86::TAILJMPd: - case X86::TAILJMPd64: { - unsigned Opcode; - switch (OutMI.getOpcode()) { - default: assert(0 && "Invalid opcode"); - case X86::TAILJMPr: Opcode = X86::JMP32r; break; - case X86::TAILJMPd: - case X86::TAILJMPd64: Opcode = X86::JMP_1; break; - } - - MCOperand Saved = OutMI.getOperand(0); - OutMI = MCInst(); - OutMI.setOpcode(Opcode); - OutMI.addOperand(Saved); - break; - } - - // The assembler backend wants to see branches in their small form and relax - // them to their large form. The JIT can only handle the large form because - // it does not do relaxation. For now, translate the large form to the - // small one here. - case X86::JMP_4: OutMI.setOpcode(X86::JMP_1); break; - case X86::JO_4: OutMI.setOpcode(X86::JO_1); break; - case X86::JNO_4: OutMI.setOpcode(X86::JNO_1); break; - case X86::JB_4: OutMI.setOpcode(X86::JB_1); break; - case X86::JAE_4: OutMI.setOpcode(X86::JAE_1); break; - case X86::JE_4: OutMI.setOpcode(X86::JE_1); break; - case X86::JNE_4: OutMI.setOpcode(X86::JNE_1); break; - case X86::JBE_4: OutMI.setOpcode(X86::JBE_1); break; - case X86::JA_4: OutMI.setOpcode(X86::JA_1); break; - case X86::JS_4: OutMI.setOpcode(X86::JS_1); break; - case X86::JNS_4: OutMI.setOpcode(X86::JNS_1); break; - case X86::JP_4: OutMI.setOpcode(X86::JP_1); break; - case X86::JNP_4: OutMI.setOpcode(X86::JNP_1); break; - case X86::JL_4: OutMI.setOpcode(X86::JL_1); break; - case X86::JGE_4: OutMI.setOpcode(X86::JGE_1); break; - case X86::JLE_4: OutMI.setOpcode(X86::JLE_1); break; - case X86::JG_4: OutMI.setOpcode(X86::JG_1); break; - - // We don't currently select the correct instruction form for instructions - // which have a short %eax, etc. form. Handle this by custom lowering, for - // now. - // - // Note, we are currently not handling the following instructions: - // MOV64ao8, MOV64o8a - // XCHG16ar, XCHG32ar, XCHG64ar - case X86::MOV8mr_NOREX: - case X86::MOV8mr: SimplifyShortMoveForm(OutMI, X86::MOV8ao8); break; - case X86::MOV8rm_NOREX: - case X86::MOV8rm: SimplifyShortMoveForm(OutMI, X86::MOV8o8a); break; - case X86::MOV16mr: SimplifyShortMoveForm(OutMI, X86::MOV16ao16); break; - case X86::MOV16rm: SimplifyShortMoveForm(OutMI, X86::MOV16o16a); break; - case X86::MOV32mr: SimplifyShortMoveForm(OutMI, X86::MOV32ao32); break; - case X86::MOV32rm: SimplifyShortMoveForm(OutMI, X86::MOV32o32a); break; - case X86::MOV64mr: SimplifyShortMoveForm(OutMI, X86::MOV64ao64); break; - case X86::MOV64rm: SimplifyShortMoveForm(OutMI, X86::MOV64o64a); break; - - case X86::ADC8ri: SimplifyShortImmForm(OutMI, X86::ADC8i8); break; - case X86::ADC16ri: SimplifyShortImmForm(OutMI, X86::ADC16i16); break; - case X86::ADC32ri: SimplifyShortImmForm(OutMI, X86::ADC32i32); break; - case X86::ADC64ri32: SimplifyShortImmForm(OutMI, X86::ADC64i32); break; - case X86::ADD8ri: SimplifyShortImmForm(OutMI, X86::ADD8i8); break; - case X86::ADD16ri: SimplifyShortImmForm(OutMI, X86::ADD16i16); break; - case X86::ADD32ri: SimplifyShortImmForm(OutMI, X86::ADD32i32); break; - case X86::ADD64ri32: SimplifyShortImmForm(OutMI, X86::ADD64i32); break; - case X86::AND8ri: SimplifyShortImmForm(OutMI, X86::AND8i8); break; - case X86::AND16ri: SimplifyShortImmForm(OutMI, X86::AND16i16); break; - case X86::AND32ri: SimplifyShortImmForm(OutMI, X86::AND32i32); break; - case X86::AND64ri32: SimplifyShortImmForm(OutMI, X86::AND64i32); break; - case X86::CMP8ri: SimplifyShortImmForm(OutMI, X86::CMP8i8); break; - case X86::CMP16ri: SimplifyShortImmForm(OutMI, X86::CMP16i16); break; - case X86::CMP32ri: SimplifyShortImmForm(OutMI, X86::CMP32i32); break; - case X86::CMP64ri32: SimplifyShortImmForm(OutMI, X86::CMP64i32); break; - case X86::OR8ri: SimplifyShortImmForm(OutMI, X86::OR8i8); break; - case X86::OR16ri: SimplifyShortImmForm(OutMI, X86::OR16i16); break; - case X86::OR32ri: SimplifyShortImmForm(OutMI, X86::OR32i32); break; - case X86::OR64ri32: SimplifyShortImmForm(OutMI, X86::OR64i32); break; - case X86::SBB8ri: SimplifyShortImmForm(OutMI, X86::SBB8i8); break; - case X86::SBB16ri: SimplifyShortImmForm(OutMI, X86::SBB16i16); break; - case X86::SBB32ri: SimplifyShortImmForm(OutMI, X86::SBB32i32); break; - case X86::SBB64ri32: SimplifyShortImmForm(OutMI, X86::SBB64i32); break; - case X86::SUB8ri: SimplifyShortImmForm(OutMI, X86::SUB8i8); break; - case X86::SUB16ri: SimplifyShortImmForm(OutMI, X86::SUB16i16); break; - case X86::SUB32ri: SimplifyShortImmForm(OutMI, X86::SUB32i32); break; - case X86::SUB64ri32: SimplifyShortImmForm(OutMI, X86::SUB64i32); break; - case X86::TEST8ri: SimplifyShortImmForm(OutMI, X86::TEST8i8); break; - case X86::TEST16ri: SimplifyShortImmForm(OutMI, X86::TEST16i16); break; - case X86::TEST32ri: SimplifyShortImmForm(OutMI, X86::TEST32i32); break; - case X86::TEST64ri32: SimplifyShortImmForm(OutMI, X86::TEST64i32); break; - case X86::XOR8ri: SimplifyShortImmForm(OutMI, X86::XOR8i8); break; - case X86::XOR16ri: SimplifyShortImmForm(OutMI, X86::XOR16i16); break; - case X86::XOR32ri: SimplifyShortImmForm(OutMI, X86::XOR32i32); break; - case X86::XOR64ri32: SimplifyShortImmForm(OutMI, X86::XOR64i32); break; - } -} - -void X86AsmPrinter::PrintDebugValueComment(const MachineInstr *MI, - raw_ostream &O) { - // Only the target-dependent form of DBG_VALUE should get here. - // Referencing the offset and metadata as NOps-2 and NOps-1 is - // probably portable to other targets; frame pointer location is not. - unsigned NOps = MI->getNumOperands(); - assert(NOps==7); - O << '\t' << MAI->getCommentString() << "DEBUG_VALUE: "; - // cast away const; DIetc do not take const operands for some reason. - DIVariable V(const_cast(MI->getOperand(NOps-1).getMetadata())); - if (V.getContext().isSubprogram()) - O << DISubprogram(V.getContext()).getDisplayName() << ":"; - O << V.getName(); - O << " <- "; - // Frame address. Currently handles register +- offset only. - O << '['; - if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg()) - printOperand(MI, 0, O); - else - O << "undef"; - O << '+'; printOperand(MI, 3, O); - O << ']'; - O << "+"; - printOperand(MI, NOps-2, O); -} - -MachineLocation -X86AsmPrinter::getDebugValueLocation(const MachineInstr *MI) const { - MachineLocation Location; - assert (MI->getNumOperands() == 7 && "Invalid no. of machine operands!"); - // Frame address. Currently handles register +- offset only. - - if (MI->getOperand(0).isReg() && MI->getOperand(3).isImm()) - Location.set(MI->getOperand(0).getReg(), MI->getOperand(3).getImm()); - return Location; -} - - -void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { - X86MCInstLower MCInstLowering(OutContext, Mang, *this); - switch (MI->getOpcode()) { - case TargetOpcode::DBG_VALUE: - if (isVerbose() && OutStreamer.hasRawTextSupport()) { - std::string TmpStr; - raw_string_ostream OS(TmpStr); - PrintDebugValueComment(MI, OS); - OutStreamer.EmitRawText(StringRef(OS.str())); - } - return; - - case X86::TAILJMPr: - case X86::TAILJMPd: - case X86::TAILJMPd64: - // Lower these as normal, but add some comments. - OutStreamer.AddComment("TAILCALL"); - break; - - case X86::MOVPC32r: { - MCInst TmpInst; - // This is a pseudo op for a two instruction sequence with a label, which - // looks like: - // call "L1$pb" - // "L1$pb": - // popl %esi - - // Emit the call. - MCSymbol *PICBase = MCInstLowering.GetPICBaseSymbol(); - TmpInst.setOpcode(X86::CALLpcrel32); - // FIXME: We would like an efficient form for this, so we don't have to do a - // lot of extra uniquing. - TmpInst.addOperand(MCOperand::CreateExpr(MCSymbolRefExpr::Create(PICBase, - OutContext))); - OutStreamer.EmitInstruction(TmpInst); - - // Emit the label. - OutStreamer.EmitLabel(PICBase); - - // popl $reg - TmpInst.setOpcode(X86::POP32r); - TmpInst.getOperand(0) = MCOperand::CreateReg(MI->getOperand(0).getReg()); - OutStreamer.EmitInstruction(TmpInst); - return; - } - - case X86::ADD32ri: { - // Lower the MO_GOT_ABSOLUTE_ADDRESS form of ADD32ri. - if (MI->getOperand(2).getTargetFlags() != X86II::MO_GOT_ABSOLUTE_ADDRESS) - break; - - // Okay, we have something like: - // EAX = ADD32ri EAX, MO_GOT_ABSOLUTE_ADDRESS(@MYGLOBAL) - - // For this, we want to print something like: - // MYGLOBAL + (. - PICBASE) - // However, we can't generate a ".", so just emit a new label here and refer - // to it. - MCSymbol *DotSym = OutContext.CreateTempSymbol(); - OutStreamer.EmitLabel(DotSym); - - // Now that we have emitted the label, lower the complex operand expression. - MCSymbol *OpSym = MCInstLowering.GetSymbolFromOperand(MI->getOperand(2)); - - const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext); - const MCExpr *PICBase = - MCSymbolRefExpr::Create(MCInstLowering.GetPICBaseSymbol(), OutContext); - DotExpr = MCBinaryExpr::CreateSub(DotExpr, PICBase, OutContext); - - DotExpr = MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(OpSym,OutContext), - DotExpr, OutContext); - - MCInst TmpInst; - TmpInst.setOpcode(X86::ADD32ri); - TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); - TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); - TmpInst.addOperand(MCOperand::CreateExpr(DotExpr)); - OutStreamer.EmitInstruction(TmpInst); - return; - } - } - - MCInst TmpInst; - MCInstLowering.Lower(MI, TmpInst); - OutStreamer.EmitInstruction(TmpInst); -} - Removed: llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h?rev=108781&view=auto ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h (removed) @@ -1,51 +0,0 @@ -//===-- X86MCInstLower.h - Lower MachineInstr to MCInst -------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef X86_MCINSTLOWER_H -#define X86_MCINSTLOWER_H - -#include "llvm/Support/Compiler.h" - -namespace llvm { - class MCContext; - class MCInst; - class MCOperand; - class MCSymbol; - class MachineInstr; - class MachineModuleInfoMachO; - class MachineOperand; - class Mangler; - class X86AsmPrinter; - class X86Subtarget; - -/// X86MCInstLower - This class is used to lower an MachineInstr into an MCInst. -class LLVM_LIBRARY_VISIBILITY X86MCInstLower { - MCContext &Ctx; - Mangler *Mang; - X86AsmPrinter &AsmPrinter; - - const X86Subtarget &getSubtarget() const; -public: - X86MCInstLower(MCContext &ctx, Mangler *mang, X86AsmPrinter &asmprinter) - : Ctx(ctx), Mang(mang), AsmPrinter(asmprinter) {} - - void Lower(const MachineInstr *MI, MCInst &OutMI) const; - - MCSymbol *GetPICBaseSymbol() const; - - MCSymbol *GetSymbolFromOperand(const MachineOperand &MO) const; - MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const; - -private: - MachineModuleInfoMachO &getMachOMMI() const; -}; - -} - -#endif Copied: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (from r108730, llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?p2=llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp&p1=llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp&r1=108730&r2=108782&rev=108782&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Mon Jul 19 18:41:57 2010 @@ -13,8 +13,8 @@ //===----------------------------------------------------------------------===// #include "X86AsmPrinter.h" -#include "X86ATTInstPrinter.h" -#include "X86IntelInstPrinter.h" +#include "AsmPrinter/X86ATTInstPrinter.h" +#include "AsmPrinter/X86IntelInstPrinter.h" #include "X86MCInstLower.h" #include "X86.h" #include "X86COFFMachineModuleInfo.h" Copied: llvm/trunk/lib/Target/X86/X86AsmPrinter.h (from r108730, llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.h?p2=llvm/trunk/lib/Target/X86/X86AsmPrinter.h&p1=llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h&r1=108730&r2=108782&rev=108782&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.h (original) +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.h Mon Jul 19 18:41:57 2010 @@ -14,9 +14,9 @@ #ifndef X86ASMPRINTER_H #define X86ASMPRINTER_H -#include "../X86.h" -#include "../X86MachineFunctionInfo.h" -#include "../X86TargetMachine.h" +#include "X86.h" +#include "X86MachineFunctionInfo.h" +#include "X86TargetMachine.h" #include "llvm/ADT/StringSet.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineModuleInfo.h" From sabre at nondot.org Mon Jul 19 18:44:46 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 19 Jul 2010 23:44:46 -0000 Subject: [llvm-commits] [llvm] r108783 - in /llvm/trunk/lib/Target/ARM: ARMAsmPrinter.cpp ARMMCInstLower.cpp ARMMCInstLower.h AsmPrinter/ARMAsmPrinter.cpp AsmPrinter/ARMMCInstLower.cpp AsmPrinter/ARMMCInstLower.h Message-ID: <20100719234446.CBA422A6C12C@llvm.org> Author: lattner Date: Mon Jul 19 18:44:46 2010 New Revision: 108783 URL: http://llvm.org/viewvc/llvm-project?rev=108783&view=rev Log: sink the arm implementations of ASmPrinter and MCInstLower out of the AsmPrinter directory into libarm. Now the ARM InstPrinters depend jsut on the MC stuff, not on vmcore or codegen. Added: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp - copied, changed from r108781, llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp - copied unchanged from r108781, llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp llvm/trunk/lib/Target/ARM/ARMMCInstLower.h - copied unchanged from r108781, llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h Removed: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h Copied: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (from r108781, llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?p2=llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp&p1=llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp&r1=108781&r2=108783&rev=108783&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Jul 19 18:44:46 2010 @@ -17,7 +17,7 @@ #include "ARMBuildAttrs.h" #include "ARMAddressingModes.h" #include "ARMConstantPoolValue.h" -#include "ARMInstPrinter.h" +#include "AsmPrinter/ARMInstPrinter.h" #include "ARMMachineFunctionInfo.h" #include "ARMMCInstLower.h" #include "ARMTargetMachine.h" Removed: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp?rev=108782&view=auto ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (removed) @@ -1,1438 +0,0 @@ -//===-- ARMAsmPrinter.cpp - Print machine code to an ARM .s file ----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains a printer that converts from our internal representation -// of machine-dependent LLVM code to GAS-format ARM assembly language. -// -//===----------------------------------------------------------------------===// - -#define DEBUG_TYPE "asm-printer" -#include "ARM.h" -#include "ARMBuildAttrs.h" -#include "ARMAddressingModes.h" -#include "ARMConstantPoolValue.h" -#include "ARMInstPrinter.h" -#include "ARMMachineFunctionInfo.h" -#include "ARMMCInstLower.h" -#include "ARMTargetMachine.h" -#include "llvm/Analysis/DebugInfo.h" -#include "llvm/Constants.h" -#include "llvm/Module.h" -#include "llvm/Type.h" -#include "llvm/Assembly/Writer.h" -#include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/MachineModuleInfoImpls.h" -#include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/CodeGen/MachineJumpTableInfo.h" -#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" -#include "llvm/MC/MCAsmInfo.h" -#include "llvm/MC/MCContext.h" -#include "llvm/MC/MCExpr.h" -#include "llvm/MC/MCInst.h" -#include "llvm/MC/MCSectionMachO.h" -#include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCSymbol.h" -#include "llvm/Target/Mangler.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetRegistry.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallString.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/raw_ostream.h" -#include -using namespace llvm; - -static cl::opt -EnableMCInst("enable-arm-mcinst-printer", cl::Hidden, - cl::desc("enable experimental asmprinter gunk in the arm backend")); - -namespace { - class ARMAsmPrinter : public AsmPrinter { - - /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can - /// make the right decision when printing asm code for different targets. - const ARMSubtarget *Subtarget; - - /// AFI - Keep a pointer to ARMFunctionInfo for the current - /// MachineFunction. - ARMFunctionInfo *AFI; - - /// MCP - Keep a pointer to constantpool entries of the current - /// MachineFunction. - const MachineConstantPool *MCP; - - public: - explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) - : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL) { - Subtarget = &TM.getSubtarget(); - } - - virtual const char *getPassName() const { - return "ARM Assembly Printer"; - } - - void printInstructionThroughMCStreamer(const MachineInstr *MI); - - - void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, - const char *Modifier = 0); - void printSOImmOperand(const MachineInstr *MI, int OpNum, raw_ostream &O); - void printSOImm2PartOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printSORegOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrMode2Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrMode2OffsetOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrMode3Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrMode3OffsetOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrMode4Operand(const MachineInstr *MI, int OpNum,raw_ostream &O, - const char *Modifier = 0); - void printAddrMode5Operand(const MachineInstr *MI, int OpNum,raw_ostream &O, - const char *Modifier = 0); - void printAddrMode6Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrMode6OffsetOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printAddrModePCOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O, - const char *Modifier = 0); - void printBitfieldInvMaskImmOperand (const MachineInstr *MI, int OpNum, - raw_ostream &O); - - void printThumbS4ImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printThumbITMask(const MachineInstr *MI, int OpNum, raw_ostream &O); - void printThumbAddrModeRROperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printThumbAddrModeRI5Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O, - unsigned Scale); - void printThumbAddrModeS1Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printThumbAddrModeS2Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printThumbAddrModeS4Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printThumbAddrModeSPOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - - void printT2SOOperand(const MachineInstr *MI, int OpNum, raw_ostream &O); - void printT2AddrModeImm12Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printT2AddrModeImm8Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printT2AddrModeImm8s4Operand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printT2AddrModeImm8OffsetOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printT2AddrModeImm8s4OffsetOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) {} - void printT2AddrModeSoRegOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - - void printCPSOptionOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) {} - void printMSRMaskOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) {} - void printNegZeroOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) {} - void printPredicateOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printMandatoryPredicateOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printSBitModifierOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printPCLabel(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printRegisterList(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printCPInstOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O, - const char *Modifier); - void printJTBlockOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printJT2BlockOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printTBAddrMode(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printNoHashImmediate(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printVFPf32ImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printVFPf64ImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - void printNEONModImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O); - - virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &O); - virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, - unsigned AsmVariant, - const char *ExtraCode, raw_ostream &O); - - void printInstruction(const MachineInstr *MI, raw_ostream &O); // autogen - static const char *getRegisterName(unsigned RegNo); - - virtual void EmitInstruction(const MachineInstr *MI); - bool runOnMachineFunction(MachineFunction &F); - - virtual void EmitConstantPool() {} // we emit constant pools customly! - virtual void EmitFunctionEntryLabel(); - void EmitStartOfAsmFile(Module &M); - void EmitEndOfAsmFile(Module &M); - - MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, - const MachineBasicBlock *MBB) const; - MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const; - - /// EmitMachineConstantPoolValue - Print a machine constantpool value to - /// the .s file. - virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { - SmallString<128> Str; - raw_svector_ostream OS(Str); - EmitMachineConstantPoolValue(MCPV, OS); - OutStreamer.EmitRawText(OS.str()); - } - - void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV, - raw_ostream &O) { - switch (TM.getTargetData()->getTypeAllocSize(MCPV->getType())) { - case 1: O << MAI->getData8bitsDirective(0); break; - case 2: O << MAI->getData16bitsDirective(0); break; - case 4: O << MAI->getData32bitsDirective(0); break; - default: assert(0 && "Unknown CPV size"); - } - - ARMConstantPoolValue *ACPV = static_cast(MCPV); - - if (ACPV->isLSDA()) { - O << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber(); - } else if (ACPV->isBlockAddress()) { - O << *GetBlockAddressSymbol(ACPV->getBlockAddress()); - } else if (ACPV->isGlobalValue()) { - const GlobalValue *GV = ACPV->getGV(); - bool isIndirect = Subtarget->isTargetDarwin() && - Subtarget->GVIsIndirectSymbol(GV, TM.getRelocationModel()); - if (!isIndirect) - O << *Mang->getSymbol(GV); - else { - // FIXME: Remove this when Darwin transition to @GOT like syntax. - MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); - O << *Sym; - - MachineModuleInfoMachO &MMIMachO = - MMI->getObjFileInfo(); - MachineModuleInfoImpl::StubValueTy &StubSym = - GV->hasHiddenVisibility() ? MMIMachO.getHiddenGVStubEntry(Sym) : - MMIMachO.getGVStubEntry(Sym); - if (StubSym.getPointer() == 0) - StubSym = MachineModuleInfoImpl:: - StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); - } - } else { - assert(ACPV->isExtSymbol() && "unrecognized constant pool value"); - O << *GetExternalSymbolSymbol(ACPV->getSymbol()); - } - - if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")"; - if (ACPV->getPCAdjustment() != 0) { - O << "-(" << MAI->getPrivateGlobalPrefix() << "PC" - << getFunctionNumber() << "_" << ACPV->getLabelId() - << "+" << (unsigned)ACPV->getPCAdjustment(); - if (ACPV->mustAddCurrentAddress()) - O << "-."; - O << ')'; - } - } - }; -} // end of anonymous namespace - -#include "ARMGenAsmWriter.inc" - -void ARMAsmPrinter::EmitFunctionEntryLabel() { - if (AFI->isThumbFunction()) { - OutStreamer.EmitRawText(StringRef("\t.code\t16")); - if (!Subtarget->isTargetDarwin()) - OutStreamer.EmitRawText(StringRef("\t.thumb_func")); - else { - // This needs to emit to a temporary string to get properly quoted - // MCSymbols when they have spaces in them. - SmallString<128> Tmp; - raw_svector_ostream OS(Tmp); - OS << "\t.thumb_func\t" << *CurrentFnSym; - OutStreamer.EmitRawText(OS.str()); - } - } - - OutStreamer.EmitLabel(CurrentFnSym); -} - -/// runOnMachineFunction - This uses the printInstruction() -/// method to print assembly for each instruction. -/// -bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - AFI = MF.getInfo(); - MCP = MF.getConstantPool(); - - return AsmPrinter::runOnMachineFunction(MF); -} - -void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O, const char *Modifier) { - const MachineOperand &MO = MI->getOperand(OpNum); - unsigned TF = MO.getTargetFlags(); - - switch (MO.getType()) { - default: - assert(0 && ""); - case MachineOperand::MO_Register: { - unsigned Reg = MO.getReg(); - assert(TargetRegisterInfo::isPhysicalRegister(Reg)); - if (Modifier && strcmp(Modifier, "dregpair") == 0) { - unsigned DRegLo = TM.getRegisterInfo()->getSubReg(Reg, ARM::dsub_0); - unsigned DRegHi = TM.getRegisterInfo()->getSubReg(Reg, ARM::dsub_1); - O << '{' - << getRegisterName(DRegLo) << ", " << getRegisterName(DRegHi) - << '}'; - } else if (Modifier && strcmp(Modifier, "lane") == 0) { - unsigned RegNum = ARMRegisterInfo::getRegisterNumbering(Reg); - unsigned DReg = - TM.getRegisterInfo()->getMatchingSuperReg(Reg, - RegNum & 1 ? ARM::ssub_1 : ARM::ssub_0, &ARM::DPR_VFP2RegClass); - O << getRegisterName(DReg) << '[' << (RegNum & 1) << ']'; - } else { - assert(!MO.getSubReg() && "Subregs should be eliminated!"); - O << getRegisterName(Reg); - } - break; - } - case MachineOperand::MO_Immediate: { - int64_t Imm = MO.getImm(); - O << '#'; - if ((Modifier && strcmp(Modifier, "lo16") == 0) || - (TF & ARMII::MO_LO16)) - O << ":lower16:"; - else if ((Modifier && strcmp(Modifier, "hi16") == 0) || - (TF & ARMII::MO_HI16)) - O << ":upper16:"; - O << Imm; - break; - } - case MachineOperand::MO_MachineBasicBlock: - O << *MO.getMBB()->getSymbol(); - return; - case MachineOperand::MO_GlobalAddress: { - bool isCallOp = Modifier && !strcmp(Modifier, "call"); - const GlobalValue *GV = MO.getGlobal(); - - if ((Modifier && strcmp(Modifier, "lo16") == 0) || - (TF & ARMII::MO_LO16)) - O << ":lower16:"; - else if ((Modifier && strcmp(Modifier, "hi16") == 0) || - (TF & ARMII::MO_HI16)) - O << ":upper16:"; - O << *Mang->getSymbol(GV); - - printOffset(MO.getOffset(), O); - - if (isCallOp && Subtarget->isTargetELF() && - TM.getRelocationModel() == Reloc::PIC_) - O << "(PLT)"; - break; - } - case MachineOperand::MO_ExternalSymbol: { - bool isCallOp = Modifier && !strcmp(Modifier, "call"); - O << *GetExternalSymbolSymbol(MO.getSymbolName()); - - if (isCallOp && Subtarget->isTargetELF() && - TM.getRelocationModel() == Reloc::PIC_) - O << "(PLT)"; - break; - } - case MachineOperand::MO_ConstantPoolIndex: - O << *GetCPISymbol(MO.getIndex()); - break; - case MachineOperand::MO_JumpTableIndex: - O << *GetJTISymbol(MO.getIndex()); - break; - } -} - -static void printSOImm(raw_ostream &O, int64_t V, bool VerboseAsm, - const MCAsmInfo *MAI) { - // Break it up into two parts that make up a shifter immediate. - V = ARM_AM::getSOImmVal(V); - assert(V != -1 && "Not a valid so_imm value!"); - - unsigned Imm = ARM_AM::getSOImmValImm(V); - unsigned Rot = ARM_AM::getSOImmValRot(V); - - // Print low-level immediate formation info, per - // A5.1.3: "Data-processing operands - Immediate". - if (Rot) { - O << "#" << Imm << ", " << Rot; - // Pretty printed version. - if (VerboseAsm) { - O << "\t" << MAI->getCommentString() << ' '; - O << (int)ARM_AM::rotr32(Imm, Rot); - } - } else { - O << "#" << Imm; - } -} - -/// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit -/// immediate in bits 0-7. -void ARMAsmPrinter::printSOImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - const MachineOperand &MO = MI->getOperand(OpNum); - assert(MO.isImm() && "Not a valid so_imm value!"); - printSOImm(O, MO.getImm(), isVerbose(), MAI); -} - -/// printSOImm2PartOperand - SOImm is broken into two pieces using a 'mov' -/// followed by an 'orr' to materialize. -void ARMAsmPrinter::printSOImm2PartOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - const MachineOperand &MO = MI->getOperand(OpNum); - assert(MO.isImm() && "Not a valid so_imm value!"); - unsigned V1 = ARM_AM::getSOImmTwoPartFirst(MO.getImm()); - unsigned V2 = ARM_AM::getSOImmTwoPartSecond(MO.getImm()); - printSOImm(O, V1, isVerbose(), MAI); - O << "\n\torr"; - printPredicateOperand(MI, 2, O); - O << "\t"; - printOperand(MI, 0, O); - O << ", "; - printOperand(MI, 0, O); - O << ", "; - printSOImm(O, V2, isVerbose(), MAI); -} - -// so_reg is a 4-operand unit corresponding to register forms of the A5.1 -// "Addressing Mode 1 - Data-processing operands" forms. This includes: -// REG 0 0 - e.g. R5 -// REG REG 0,SH_OPC - e.g. R5, ROR R3 -// REG 0 IMM,SH_OPC - e.g. R5, LSL #3 -void ARMAsmPrinter::printSORegOperand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - const MachineOperand &MO3 = MI->getOperand(Op+2); - - O << getRegisterName(MO1.getReg()); - - // Print the shift opc. - O << ", " - << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3.getImm())) - << " "; - - if (MO2.getReg()) { - O << getRegisterName(MO2.getReg()); - assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0); - } else { - O << "#" << ARM_AM::getSORegOffset(MO3.getImm()); - } -} - -void ARMAsmPrinter::printAddrMode2Operand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - const MachineOperand &MO3 = MI->getOperand(Op+2); - - if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right. - printOperand(MI, Op, O); - return; - } - - O << "[" << getRegisterName(MO1.getReg()); - - if (!MO2.getReg()) { - if (ARM_AM::getAM2Offset(MO3.getImm())) // Don't print +0. - O << ", #" - << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm())) - << ARM_AM::getAM2Offset(MO3.getImm()); - O << "]"; - return; - } - - O << ", " - << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm())) - << getRegisterName(MO2.getReg()); - - if (unsigned ShImm = ARM_AM::getAM2Offset(MO3.getImm())) - O << ", " - << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO3.getImm())) - << " #" << ShImm; - O << "]"; -} - -void ARMAsmPrinter::printAddrMode2OffsetOperand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - - if (!MO1.getReg()) { - unsigned ImmOffs = ARM_AM::getAM2Offset(MO2.getImm()); - O << "#" - << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm())) - << ImmOffs; - return; - } - - O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm())) - << getRegisterName(MO1.getReg()); - - if (unsigned ShImm = ARM_AM::getAM2Offset(MO2.getImm())) - O << ", " - << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO2.getImm())) - << " #" << ShImm; -} - -void ARMAsmPrinter::printAddrMode3Operand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - const MachineOperand &MO3 = MI->getOperand(Op+2); - - assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg())); - O << "[" << getRegisterName(MO1.getReg()); - - if (MO2.getReg()) { - O << ", " - << (char)ARM_AM::getAM3Op(MO3.getImm()) - << getRegisterName(MO2.getReg()) - << "]"; - return; - } - - if (unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm())) - O << ", #" - << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm())) - << ImmOffs; - O << "]"; -} - -void ARMAsmPrinter::printAddrMode3OffsetOperand(const MachineInstr *MI, int Op, - raw_ostream &O){ - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - - if (MO1.getReg()) { - O << (char)ARM_AM::getAM3Op(MO2.getImm()) - << getRegisterName(MO1.getReg()); - return; - } - - unsigned ImmOffs = ARM_AM::getAM3Offset(MO2.getImm()); - O << "#" - << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm())) - << ImmOffs; -} - -void ARMAsmPrinter::printAddrMode4Operand(const MachineInstr *MI, int Op, - raw_ostream &O, - const char *Modifier) { - const MachineOperand &MO2 = MI->getOperand(Op+1); - ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MO2.getImm()); - if (Modifier && strcmp(Modifier, "submode") == 0) { - O << ARM_AM::getAMSubModeStr(Mode); - } else if (Modifier && strcmp(Modifier, "wide") == 0) { - ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MO2.getImm()); - if (Mode == ARM_AM::ia) - O << ".w"; - } else { - printOperand(MI, Op, O); - } -} - -void ARMAsmPrinter::printAddrMode5Operand(const MachineInstr *MI, int Op, - raw_ostream &O, - const char *Modifier) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - - if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right. - printOperand(MI, Op, O); - return; - } - - assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg())); - - if (Modifier && strcmp(Modifier, "submode") == 0) { - ARM_AM::AMSubMode Mode = ARM_AM::getAM5SubMode(MO2.getImm()); - O << ARM_AM::getAMSubModeStr(Mode); - return; - } else if (Modifier && strcmp(Modifier, "base") == 0) { - // Used for FSTM{D|S} and LSTM{D|S} operations. - O << getRegisterName(MO1.getReg()); - return; - } - - O << "[" << getRegisterName(MO1.getReg()); - - if (unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm())) { - O << ", #" - << ARM_AM::getAddrOpcStr(ARM_AM::getAM5Op(MO2.getImm())) - << ImmOffs*4; - } - O << "]"; -} - -void ARMAsmPrinter::printAddrMode6Operand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - - O << "[" << getRegisterName(MO1.getReg()); - if (MO2.getImm()) { - // FIXME: Both darwin as and GNU as violate ARM docs here. - O << ", :" << (MO2.getImm() << 3); - } - O << "]"; -} - -void ARMAsmPrinter::printAddrMode6OffsetOperand(const MachineInstr *MI, int Op, - raw_ostream &O){ - const MachineOperand &MO = MI->getOperand(Op); - if (MO.getReg() == 0) - O << "!"; - else - O << ", " << getRegisterName(MO.getReg()); -} - -void ARMAsmPrinter::printAddrModePCOperand(const MachineInstr *MI, int Op, - raw_ostream &O, - const char *Modifier) { - if (Modifier && strcmp(Modifier, "label") == 0) { - printPCLabel(MI, Op+1, O); - return; - } - - const MachineOperand &MO1 = MI->getOperand(Op); - assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg())); - O << "[pc, " << getRegisterName(MO1.getReg()) << "]"; -} - -void -ARMAsmPrinter::printBitfieldInvMaskImmOperand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO = MI->getOperand(Op); - uint32_t v = ~MO.getImm(); - int32_t lsb = CountTrailingZeros_32(v); - int32_t width = (32 - CountLeadingZeros_32 (v)) - lsb; - assert(MO.isImm() && "Not a valid bf_inv_mask_imm value!"); - O << "#" << lsb << ", #" << width; -} - -//===--------------------------------------------------------------------===// - -void ARMAsmPrinter::printThumbS4ImmOperand(const MachineInstr *MI, int Op, - raw_ostream &O) { - O << "#" << MI->getOperand(Op).getImm() * 4; -} - -void -ARMAsmPrinter::printThumbITMask(const MachineInstr *MI, int Op, - raw_ostream &O) { - // (3 - the number of trailing zeros) is the number of then / else. - unsigned Mask = MI->getOperand(Op).getImm(); - unsigned CondBit0 = Mask >> 4 & 1; - unsigned NumTZ = CountTrailingZeros_32(Mask); - assert(NumTZ <= 3 && "Invalid IT mask!"); - for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) { - bool T = ((Mask >> Pos) & 1) == CondBit0; - if (T) - O << 't'; - else - O << 'e'; - } -} - -void -ARMAsmPrinter::printThumbAddrModeRROperand(const MachineInstr *MI, int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - O << "[" << getRegisterName(MO1.getReg()); - O << ", " << getRegisterName(MO2.getReg()) << "]"; -} - -void -ARMAsmPrinter::printThumbAddrModeRI5Operand(const MachineInstr *MI, int Op, - raw_ostream &O, - unsigned Scale) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - const MachineOperand &MO3 = MI->getOperand(Op+2); - - if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right. - printOperand(MI, Op, O); - return; - } - - O << "[" << getRegisterName(MO1.getReg()); - if (MO3.getReg()) - O << ", " << getRegisterName(MO3.getReg()); - else if (unsigned ImmOffs = MO2.getImm()) - O << ", #" << ImmOffs * Scale; - O << "]"; -} - -void -ARMAsmPrinter::printThumbAddrModeS1Operand(const MachineInstr *MI, int Op, - raw_ostream &O) { - printThumbAddrModeRI5Operand(MI, Op, O, 1); -} -void -ARMAsmPrinter::printThumbAddrModeS2Operand(const MachineInstr *MI, int Op, - raw_ostream &O) { - printThumbAddrModeRI5Operand(MI, Op, O, 2); -} -void -ARMAsmPrinter::printThumbAddrModeS4Operand(const MachineInstr *MI, int Op, - raw_ostream &O) { - printThumbAddrModeRI5Operand(MI, Op, O, 4); -} - -void ARMAsmPrinter::printThumbAddrModeSPOperand(const MachineInstr *MI,int Op, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(Op); - const MachineOperand &MO2 = MI->getOperand(Op+1); - O << "[" << getRegisterName(MO1.getReg()); - if (unsigned ImmOffs = MO2.getImm()) - O << ", #" << ImmOffs*4; - O << "]"; -} - -//===--------------------------------------------------------------------===// - -// Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2 -// register with shift forms. -// REG 0 0 - e.g. R5 -// REG IMM, SH_OPC - e.g. R5, LSL #3 -void ARMAsmPrinter::printT2SOOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); - - unsigned Reg = MO1.getReg(); - assert(TargetRegisterInfo::isPhysicalRegister(Reg)); - O << getRegisterName(Reg); - - // Print the shift opc. - O << ", " - << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO2.getImm())) - << " "; - - assert(MO2.isImm() && "Not a valid t2_so_reg value!"); - O << "#" << ARM_AM::getSORegOffset(MO2.getImm()); -} - -void ARMAsmPrinter::printT2AddrModeImm12Operand(const MachineInstr *MI, - int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); - - O << "[" << getRegisterName(MO1.getReg()); - - unsigned OffImm = MO2.getImm(); - if (OffImm) // Don't print +0. - O << ", #" << OffImm; - O << "]"; -} - -void ARMAsmPrinter::printT2AddrModeImm8Operand(const MachineInstr *MI, - int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); - - O << "[" << getRegisterName(MO1.getReg()); - - int32_t OffImm = (int32_t)MO2.getImm(); - // Don't print +0. - if (OffImm < 0) - O << ", #-" << -OffImm; - else if (OffImm > 0) - O << ", #" << OffImm; - O << "]"; -} - -void ARMAsmPrinter::printT2AddrModeImm8s4Operand(const MachineInstr *MI, - int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); - - O << "[" << getRegisterName(MO1.getReg()); - - int32_t OffImm = (int32_t)MO2.getImm() / 4; - // Don't print +0. - if (OffImm < 0) - O << ", #-" << -OffImm * 4; - else if (OffImm > 0) - O << ", #" << OffImm * 4; - O << "]"; -} - -void ARMAsmPrinter::printT2AddrModeImm8OffsetOperand(const MachineInstr *MI, - int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - int32_t OffImm = (int32_t)MO1.getImm(); - // Don't print +0. - if (OffImm < 0) - O << "#-" << -OffImm; - else if (OffImm > 0) - O << "#" << OffImm; -} - -void ARMAsmPrinter::printT2AddrModeSoRegOperand(const MachineInstr *MI, - int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); - const MachineOperand &MO3 = MI->getOperand(OpNum+2); - - O << "[" << getRegisterName(MO1.getReg()); - - assert(MO2.getReg() && "Invalid so_reg load / store address!"); - O << ", " << getRegisterName(MO2.getReg()); - - unsigned ShAmt = MO3.getImm(); - if (ShAmt) { - assert(ShAmt <= 3 && "Not a valid Thumb2 addressing mode!"); - O << ", lsl #" << ShAmt; - } - O << "]"; -} - - -//===--------------------------------------------------------------------===// - -void ARMAsmPrinter::printPredicateOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm(); - if (CC != ARMCC::AL) - O << ARMCondCodeToString(CC); -} - -void ARMAsmPrinter::printMandatoryPredicateOperand(const MachineInstr *MI, - int OpNum, - raw_ostream &O) { - ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm(); - O << ARMCondCodeToString(CC); -} - -void ARMAsmPrinter::printSBitModifierOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O){ - unsigned Reg = MI->getOperand(OpNum).getReg(); - if (Reg) { - assert(Reg == ARM::CPSR && "Expect ARM CPSR register!"); - O << 's'; - } -} - -void ARMAsmPrinter::printPCLabel(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - int Id = (int)MI->getOperand(OpNum).getImm(); - O << MAI->getPrivateGlobalPrefix() - << "PC" << getFunctionNumber() << "_" << Id; -} - -void ARMAsmPrinter::printRegisterList(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - O << "{"; - for (unsigned i = OpNum, e = MI->getNumOperands(); i != e; ++i) { - if (MI->getOperand(i).isImplicit()) - continue; - if ((int)i != OpNum) O << ", "; - printOperand(MI, i, O); - } - O << "}"; -} - -void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O, const char *Modifier) { - assert(Modifier && "This operand only works with a modifier!"); - // There are two aspects to a CONSTANTPOOL_ENTRY operand, the label and the - // data itself. - if (!strcmp(Modifier, "label")) { - unsigned ID = MI->getOperand(OpNum).getImm(); - OutStreamer.EmitLabel(GetCPISymbol(ID)); - } else { - assert(!strcmp(Modifier, "cpentry") && "Unknown modifier for CPE"); - unsigned CPI = MI->getOperand(OpNum).getIndex(); - - const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPI]; - - if (MCPE.isMachineConstantPoolEntry()) { - EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal); - } else { - EmitGlobalConstant(MCPE.Val.ConstVal); - } - } -} - -MCSymbol *ARMAsmPrinter:: -GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, - const MachineBasicBlock *MBB) const { - SmallString<60> Name; - raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() - << getFunctionNumber() << '_' << uid << '_' << uid2 - << "_set_" << MBB->getNumber(); - return OutContext.GetOrCreateSymbol(Name.str()); -} - -MCSymbol *ARMAsmPrinter:: -GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const { - SmallString<60> Name; - raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "JTI" - << getFunctionNumber() << '_' << uid << '_' << uid2; - return OutContext.GetOrCreateSymbol(Name.str()); -} - -void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - assert(!Subtarget->isThumb2() && "Thumb2 should use double-jump jumptables!"); - - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id - - unsigned JTI = MO1.getIndex(); - MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm()); - // Can't use EmitLabel until instprinter happens, label comes out in the wrong - // order. - O << *JTISymbol << ":\n"; - - const char *JTEntryDirective = MAI->getData32bitsDirective(); - - const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); - const std::vector &JT = MJTI->getJumpTables(); - const std::vector &JTBBs = JT[JTI].MBBs; - bool UseSet= MAI->hasSetDirective() && TM.getRelocationModel() == Reloc::PIC_; - SmallPtrSet JTSets; - for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) { - MachineBasicBlock *MBB = JTBBs[i]; - bool isNew = JTSets.insert(MBB); - - if (UseSet && isNew) { - O << "\t.set\t" - << *GetARMSetPICJumpTableLabel2(JTI, MO2.getImm(), MBB) << ',' - << *MBB->getSymbol() << '-' << *JTISymbol << '\n'; - } - - O << JTEntryDirective << ' '; - if (UseSet) - O << *GetARMSetPICJumpTableLabel2(JTI, MO2.getImm(), MBB); - else if (TM.getRelocationModel() == Reloc::PIC_) - O << *MBB->getSymbol() << '-' << *JTISymbol; - else - O << *MBB->getSymbol(); - - if (i != e-1) - O << '\n'; - } -} - -void ARMAsmPrinter::printJT2BlockOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - const MachineOperand &MO1 = MI->getOperand(OpNum); - const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id - unsigned JTI = MO1.getIndex(); - - MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm()); - - // Can't use EmitLabel until instprinter happens, label comes out in the wrong - // order. - O << *JTISymbol << ":\n"; - - const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); - const std::vector &JT = MJTI->getJumpTables(); - const std::vector &JTBBs = JT[JTI].MBBs; - bool ByteOffset = false, HalfWordOffset = false; - if (MI->getOpcode() == ARM::t2TBB) - ByteOffset = true; - else if (MI->getOpcode() == ARM::t2TBH) - HalfWordOffset = true; - - for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) { - MachineBasicBlock *MBB = JTBBs[i]; - if (ByteOffset) - O << MAI->getData8bitsDirective(); - else if (HalfWordOffset) - O << MAI->getData16bitsDirective(); - - if (ByteOffset || HalfWordOffset) - O << '(' << *MBB->getSymbol() << "-" << *JTISymbol << ")/2"; - else - O << "\tb.w " << *MBB->getSymbol(); - - if (i != e-1) - O << '\n'; - } -} - -void ARMAsmPrinter::printTBAddrMode(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - O << "[pc, " << getRegisterName(MI->getOperand(OpNum).getReg()); - if (MI->getOpcode() == ARM::t2TBH) - O << ", lsl #1"; - O << ']'; -} - -void ARMAsmPrinter::printNoHashImmediate(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - O << MI->getOperand(OpNum).getImm(); -} - -void ARMAsmPrinter::printVFPf32ImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - const ConstantFP *FP = MI->getOperand(OpNum).getFPImm(); - O << '#' << FP->getValueAPF().convertToFloat(); - if (isVerbose()) { - O << "\t\t" << MAI->getCommentString() << ' '; - WriteAsOperand(O, FP, /*PrintType=*/false); - } -} - -void ARMAsmPrinter::printVFPf64ImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - const ConstantFP *FP = MI->getOperand(OpNum).getFPImm(); - O << '#' << FP->getValueAPF().convertToDouble(); - if (isVerbose()) { - O << "\t\t" << MAI->getCommentString() << ' '; - WriteAsOperand(O, FP, /*PrintType=*/false); - } -} - -void ARMAsmPrinter::printNEONModImmOperand(const MachineInstr *MI, int OpNum, - raw_ostream &O) { - unsigned EncodedImm = MI->getOperand(OpNum).getImm(); - unsigned EltBits; - uint64_t Val = ARM_AM::decodeNEONModImm(EncodedImm, EltBits); - O << "#0x" << utohexstr(Val); -} - -bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &O) { - // Does this asm operand have a single letter operand modifier? - if (ExtraCode && ExtraCode[0]) { - if (ExtraCode[1] != 0) return true; // Unknown modifier. - - switch (ExtraCode[0]) { - default: return true; // Unknown modifier. - case 'a': // Print as a memory address. - if (MI->getOperand(OpNum).isReg()) { - O << "[" << getRegisterName(MI->getOperand(OpNum).getReg()) << "]"; - return false; - } - // Fallthrough - case 'c': // Don't print "#" before an immediate operand. - if (!MI->getOperand(OpNum).isImm()) - return true; - printNoHashImmediate(MI, OpNum, O); - return false; - case 'P': // Print a VFP double precision register. - case 'q': // Print a NEON quad precision register. - printOperand(MI, OpNum, O); - return false; - case 'Q': - case 'R': - case 'H': - report_fatal_error("llvm does not support 'Q', 'R', and 'H' modifiers!"); - return true; - } - } - - printOperand(MI, OpNum, O); - return false; -} - -bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, - unsigned OpNum, unsigned AsmVariant, - const char *ExtraCode, - raw_ostream &O) { - if (ExtraCode && ExtraCode[0]) - return true; // Unknown modifier. - - const MachineOperand &MO = MI->getOperand(OpNum); - assert(MO.isReg() && "unexpected inline asm memory operand"); - O << "[" << getRegisterName(MO.getReg()) << "]"; - return false; -} - -void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) { - if (EnableMCInst) { - printInstructionThroughMCStreamer(MI); - return; - } - - if (MI->getOpcode() == ARM::CONSTPOOL_ENTRY) - EmitAlignment(2); - - SmallString<128> Str; - raw_svector_ostream OS(Str); - if (MI->getOpcode() == ARM::DBG_VALUE) { - unsigned NOps = MI->getNumOperands(); - assert(NOps==4); - OS << '\t' << MAI->getCommentString() << "DEBUG_VALUE: "; - // cast away const; DIetc do not take const operands for some reason. - DIVariable V(const_cast(MI->getOperand(NOps-1).getMetadata())); - OS << V.getName(); - OS << " <- "; - // Frame address. Currently handles register +- offset only. - assert(MI->getOperand(0).isReg() && MI->getOperand(1).isImm()); - OS << '['; printOperand(MI, 0, OS); OS << '+'; printOperand(MI, 1, OS); - OS << ']'; - OS << "+"; - printOperand(MI, NOps-2, OS); - OutStreamer.EmitRawText(OS.str()); - return; - } - - printInstruction(MI, OS); - OutStreamer.EmitRawText(OS.str()); - - // Make sure the instruction that follows TBB is 2-byte aligned. - // FIXME: Constant island pass should insert an "ALIGN" instruction instead. - if (MI->getOpcode() == ARM::t2TBB) - EmitAlignment(1); -} - -void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) { - if (Subtarget->isTargetDarwin()) { - Reloc::Model RelocM = TM.getRelocationModel(); - if (RelocM == Reloc::PIC_ || RelocM == Reloc::DynamicNoPIC) { - // Declare all the text sections up front (before the DWARF sections - // emitted by AsmPrinter::doInitialization) so the assembler will keep - // them together at the beginning of the object file. This helps - // avoid out-of-range branches that are due a fundamental limitation of - // the way symbol offsets are encoded with the current Darwin ARM - // relocations. - const TargetLoweringObjectFileMachO &TLOFMacho = - static_cast( - getObjFileLowering()); - OutStreamer.SwitchSection(TLOFMacho.getTextSection()); - OutStreamer.SwitchSection(TLOFMacho.getTextCoalSection()); - OutStreamer.SwitchSection(TLOFMacho.getConstTextCoalSection()); - if (RelocM == Reloc::DynamicNoPIC) { - const MCSection *sect = - OutContext.getMachOSection("__TEXT", "__symbol_stub4", - MCSectionMachO::S_SYMBOL_STUBS, - 12, SectionKind::getText()); - OutStreamer.SwitchSection(sect); - } else { - const MCSection *sect = - OutContext.getMachOSection("__TEXT", "__picsymbolstub4", - MCSectionMachO::S_SYMBOL_STUBS, - 16, SectionKind::getText()); - OutStreamer.SwitchSection(sect); - } - } - } - - // Use unified assembler syntax. - OutStreamer.EmitRawText(StringRef("\t.syntax unified")); - - // Emit ARM Build Attributes - if (Subtarget->isTargetELF()) { - // CPU Type - std::string CPUString = Subtarget->getCPUString(); - if (CPUString != "generic") - OutStreamer.EmitRawText("\t.cpu " + Twine(CPUString)); - - // FIXME: Emit FPU type - if (Subtarget->hasVFP2()) - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::VFP_arch) + ", 2"); - - // Signal various FP modes. - if (!UnsafeFPMath) { - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_FP_denormal) + ", 1"); - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_FP_exceptions) + ", 1"); - } - - if (NoInfsFPMath && NoNaNsFPMath) - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_FP_number_model)+ ", 1"); - else - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_FP_number_model)+ ", 3"); - - // 8-bytes alignment stuff. - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_align8_needed) + ", 1"); - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_align8_preserved) + ", 1"); - - // Hard float. Use both S and D registers and conform to AAPCS-VFP. - if (Subtarget->isAAPCS_ABI() && FloatABIType == FloatABI::Hard) { - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_HardFP_use) + ", 3"); - OutStreamer.EmitRawText("\t.eabi_attribute " + - Twine(ARMBuildAttrs::ABI_VFP_args) + ", 1"); - } - // FIXME: Should we signal R9 usage? - } -} - - -void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) { - if (Subtarget->isTargetDarwin()) { - // All darwin targets use mach-o. - const TargetLoweringObjectFileMachO &TLOFMacho = - static_cast(getObjFileLowering()); - MachineModuleInfoMachO &MMIMacho = - MMI->getObjFileInfo(); - - // Output non-lazy-pointers for external and common global variables. - MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetGVStubList(); - - if (!Stubs.empty()) { - // Switch with ".non_lazy_symbol_pointer" directive. - OutStreamer.SwitchSection(TLOFMacho.getNonLazySymbolPointerSection()); - EmitAlignment(2); - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - // L_foo$stub: - OutStreamer.EmitLabel(Stubs[i].first); - // .indirect_symbol _foo - MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second; - OutStreamer.EmitSymbolAttribute(MCSym.getPointer(),MCSA_IndirectSymbol); - - if (MCSym.getInt()) - // External to current translation unit. - OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/); - else - // Internal to current translation unit. - // - // When we place the LSDA into the TEXT section, the type info pointers - // need to be indirect and pc-rel. We accomplish this by using NLPs. - // However, sometimes the types are local to the file. So we need to - // fill in the value for the NLP in those cases. - OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(), - OutContext), - 4/*size*/, 0/*addrspace*/); - } - - Stubs.clear(); - OutStreamer.AddBlankLine(); - } - - Stubs = MMIMacho.GetHiddenGVStubList(); - if (!Stubs.empty()) { - OutStreamer.SwitchSection(getObjFileLowering().getDataSection()); - EmitAlignment(2); - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - // L_foo$stub: - OutStreamer.EmitLabel(Stubs[i].first); - // .long _foo - OutStreamer.EmitValue(MCSymbolRefExpr:: - Create(Stubs[i].second.getPointer(), - OutContext), - 4/*size*/, 0/*addrspace*/); - } - - Stubs.clear(); - OutStreamer.AddBlankLine(); - } - - // Funny Darwin hack: This flag tells the linker that no global symbols - // contain code that falls through to other global symbols (e.g. the obvious - // implementation of multiple entry points). If this doesn't occur, the - // linker can safely perform dead code stripping. Since LLVM never - // generates code that does this, it is always safe to set. - OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols); - } -} - -//===----------------------------------------------------------------------===// - -void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) { - ARMMCInstLower MCInstLowering(OutContext, *Mang, *this); - switch (MI->getOpcode()) { - case ARM::t2MOVi32imm: - assert(0 && "Should be lowered by thumb2it pass"); - default: break; - case ARM::PICADD: { // FIXME: Remove asm string from td file. - // This is a pseudo op for a label + instruction sequence, which looks like: - // LPC0: - // add r0, pc, r0 - // This adds the address of LPC0 to r0. - - // Emit the label. - // FIXME: MOVE TO SHARED PLACE. - unsigned Id = (unsigned)MI->getOperand(2).getImm(); - const char *Prefix = MAI->getPrivateGlobalPrefix(); - MCSymbol *Label =OutContext.GetOrCreateSymbol(Twine(Prefix) - + "PC" + Twine(getFunctionNumber()) + "_" + Twine(Id)); - OutStreamer.EmitLabel(Label); - - - // Form and emit tha dd. - MCInst AddInst; - AddInst.setOpcode(ARM::ADDrr); - AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); - AddInst.addOperand(MCOperand::CreateReg(ARM::PC)); - AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); - OutStreamer.EmitInstruction(AddInst); - return; - } - case ARM::CONSTPOOL_ENTRY: { // FIXME: Remove asm string from td file. - /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool - /// in the function. The first operand is the ID# for this instruction, the - /// second is the index into the MachineConstantPool that this is, the third - /// is the size in bytes of this constant pool entry. - unsigned LabelId = (unsigned)MI->getOperand(0).getImm(); - unsigned CPIdx = (unsigned)MI->getOperand(1).getIndex(); - - EmitAlignment(2); - OutStreamer.EmitLabel(GetCPISymbol(LabelId)); - - const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPIdx]; - if (MCPE.isMachineConstantPoolEntry()) - EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal); - else - EmitGlobalConstant(MCPE.Val.ConstVal); - - return; - } - case ARM::MOVi2pieces: { // FIXME: Remove asmstring from td file. - // This is a hack that lowers as a two instruction sequence. - unsigned DstReg = MI->getOperand(0).getReg(); - unsigned ImmVal = (unsigned)MI->getOperand(1).getImm(); - - unsigned SOImmValV1 = ARM_AM::getSOImmTwoPartFirst(ImmVal); - unsigned SOImmValV2 = ARM_AM::getSOImmTwoPartSecond(ImmVal); - - { - MCInst TmpInst; - TmpInst.setOpcode(ARM::MOVi); - TmpInst.addOperand(MCOperand::CreateReg(DstReg)); - TmpInst.addOperand(MCOperand::CreateImm(SOImmValV1)); - - // Predicate. - TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm())); - TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg())); - - TmpInst.addOperand(MCOperand::CreateReg(0)); // cc_out - OutStreamer.EmitInstruction(TmpInst); - } - - { - MCInst TmpInst; - TmpInst.setOpcode(ARM::ORRri); - TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // dstreg - TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // inreg - TmpInst.addOperand(MCOperand::CreateImm(SOImmValV2)); // so_imm - // Predicate. - TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm())); - TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg())); - - TmpInst.addOperand(MCOperand::CreateReg(0)); // cc_out - OutStreamer.EmitInstruction(TmpInst); - } - return; - } - case ARM::MOVi32imm: { // FIXME: Remove asmstring from td file. - // This is a hack that lowers as a two instruction sequence. - unsigned DstReg = MI->getOperand(0).getReg(); - const MachineOperand &MO = MI->getOperand(1); - MCOperand V1, V2; - if (MO.isImm()) { - unsigned ImmVal = (unsigned)MI->getOperand(1).getImm(); - V1 = MCOperand::CreateImm(ImmVal & 65535); - V2 = MCOperand::CreateImm(ImmVal >> 16); - } else if (MO.isGlobal()) { - MCSymbol *Symbol = MCInstLowering.GetGlobalAddressSymbol(MO); - const MCSymbolRefExpr *SymRef1 = - MCSymbolRefExpr::Create(Symbol, - MCSymbolRefExpr::VK_ARM_LO16, OutContext); - const MCSymbolRefExpr *SymRef2 = - MCSymbolRefExpr::Create(Symbol, - MCSymbolRefExpr::VK_ARM_HI16, OutContext); - V1 = MCOperand::CreateExpr(SymRef1); - V2 = MCOperand::CreateExpr(SymRef2); - } else { - MI->dump(); - llvm_unreachable("cannot handle this operand"); - } - - { - MCInst TmpInst; - TmpInst.setOpcode(ARM::MOVi16); - TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // dstreg - TmpInst.addOperand(V1); // lower16(imm) - - // Predicate. - TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm())); - TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg())); - - OutStreamer.EmitInstruction(TmpInst); - } - - { - MCInst TmpInst; - TmpInst.setOpcode(ARM::MOVTi16); - TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // dstreg - TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // srcreg - TmpInst.addOperand(V2); // upper16(imm) - - // Predicate. - TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm())); - TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg())); - - OutStreamer.EmitInstruction(TmpInst); - } - - return; - } - } - - MCInst TmpInst; - MCInstLowering.Lower(MI, TmpInst); - OutStreamer.EmitInstruction(TmpInst); -} - -//===----------------------------------------------------------------------===// -// Target Registry Stuff -//===----------------------------------------------------------------------===// - -static MCInstPrinter *createARMMCInstPrinter(const Target &T, - unsigned SyntaxVariant, - const MCAsmInfo &MAI) { - if (SyntaxVariant == 0) - return new ARMInstPrinter(MAI, false); - return 0; -} - -// Force static initialization. -extern "C" void LLVMInitializeARMAsmPrinter() { - RegisterAsmPrinter X(TheARMTarget); - RegisterAsmPrinter Y(TheThumbTarget); - - TargetRegistry::RegisterMCInstPrinter(TheARMTarget, createARMMCInstPrinter); - TargetRegistry::RegisterMCInstPrinter(TheThumbTarget, createARMMCInstPrinter); -} - Removed: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp?rev=108782&view=auto ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp (original) +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp (removed) @@ -1,162 +0,0 @@ -//===-- ARMMCInstLower.cpp - Convert ARM MachineInstr to an MCInst --------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains code to lower ARM MachineInstrs to their corresponding -// MCInst records. -// -//===----------------------------------------------------------------------===// - -#include "ARMMCInstLower.h" -//#include "llvm/CodeGen/MachineModuleInfoImpls.h" -#include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/MachineBasicBlock.h" -#include "llvm/MC/MCAsmInfo.h" -#include "llvm/MC/MCContext.h" -#include "llvm/MC/MCExpr.h" -#include "llvm/MC/MCInst.h" -//#include "llvm/MC/MCStreamer.h" -#include "llvm/Target/Mangler.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/ADT/SmallString.h" -using namespace llvm; - - -#if 0 -const ARMSubtarget &ARMMCInstLower::getSubtarget() const { - return AsmPrinter.getSubtarget(); -} - -MachineModuleInfoMachO &ARMMCInstLower::getMachOMMI() const { - assert(getSubtarget().isTargetDarwin() &&"Can only get MachO info on darwin"); - return AsmPrinter.MMI->getObjFileInfo(); -} -#endif - -MCSymbol *ARMMCInstLower:: -GetGlobalAddressSymbol(const MachineOperand &MO) const { - // FIXME: HANDLE PLT references how?? - switch (MO.getTargetFlags()) { - default: assert(0 && "Unknown target flag on GV operand"); - case 0: break; - } - - return Printer.Mang->getSymbol(MO.getGlobal()); -} - -MCSymbol *ARMMCInstLower:: -GetExternalSymbolSymbol(const MachineOperand &MO) const { - // FIXME: HANDLE PLT references how?? - switch (MO.getTargetFlags()) { - default: assert(0 && "Unknown target flag on GV operand"); - case 0: break; - } - - return Printer.GetExternalSymbolSymbol(MO.getSymbolName()); -} - - - -MCSymbol *ARMMCInstLower:: -GetJumpTableSymbol(const MachineOperand &MO) const { - SmallString<256> Name; - raw_svector_ostream(Name) << Printer.MAI->getPrivateGlobalPrefix() << "JTI" - << Printer.getFunctionNumber() << '_' << MO.getIndex(); - -#if 0 - switch (MO.getTargetFlags()) { - default: llvm_unreachable("Unknown target flag on GV operand"); - } -#endif - - // Create a symbol for the name. - return Ctx.GetOrCreateSymbol(Name.str()); -} - -MCSymbol *ARMMCInstLower:: -GetConstantPoolIndexSymbol(const MachineOperand &MO) const { - SmallString<256> Name; - raw_svector_ostream(Name) << Printer.MAI->getPrivateGlobalPrefix() << "CPI" - << Printer.getFunctionNumber() << '_' << MO.getIndex(); - -#if 0 - switch (MO.getTargetFlags()) { - default: llvm_unreachable("Unknown target flag on GV operand"); - } -#endif - - // Create a symbol for the name. - return Ctx.GetOrCreateSymbol(Name.str()); -} - -MCOperand ARMMCInstLower:: -LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const { - // FIXME: We would like an efficient form for this, so we don't have to do a - // lot of extra uniquing. - const MCExpr *Expr = MCSymbolRefExpr::Create(Sym, Ctx); - -#if 0 - switch (MO.getTargetFlags()) { - default: llvm_unreachable("Unknown target flag on GV operand"); - } -#endif - - if (!MO.isJTI() && MO.getOffset()) - Expr = MCBinaryExpr::CreateAdd(Expr, - MCConstantExpr::Create(MO.getOffset(), Ctx), - Ctx); - return MCOperand::CreateExpr(Expr); -} - - -void ARMMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { - OutMI.setOpcode(MI->getOpcode()); - - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - const MachineOperand &MO = MI->getOperand(i); - - MCOperand MCOp; - switch (MO.getType()) { - default: - MI->dump(); - assert(0 && "unknown operand type"); - case MachineOperand::MO_Register: - // Ignore all implicit register operands. - if (MO.isImplicit()) continue; - assert(!MO.getSubReg() && "Subregs should be eliminated!"); - MCOp = MCOperand::CreateReg(MO.getReg()); - break; - case MachineOperand::MO_Immediate: - MCOp = MCOperand::CreateImm(MO.getImm()); - break; - case MachineOperand::MO_MachineBasicBlock: - MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create( - MO.getMBB()->getSymbol(), Ctx)); - break; - case MachineOperand::MO_GlobalAddress: - MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO)); - break; - case MachineOperand::MO_ExternalSymbol: - MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO)); - break; - case MachineOperand::MO_JumpTableIndex: - MCOp = LowerSymbolOperand(MO, GetJumpTableSymbol(MO)); - break; - case MachineOperand::MO_ConstantPoolIndex: - MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO)); - break; - case MachineOperand::MO_BlockAddress: - MCOp = LowerSymbolOperand(MO, Printer.GetBlockAddressSymbol( - MO.getBlockAddress())); - break; - } - - OutMI.addOperand(MCOp); - } - -} Removed: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h?rev=108782&view=auto ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h (original) +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h (removed) @@ -1,56 +0,0 @@ -//===-- ARMMCInstLower.h - Lower MachineInstr to MCInst -------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef ARM_MCINSTLOWER_H -#define ARM_MCINSTLOWER_H - -#include "llvm/Support/Compiler.h" - -namespace llvm { - class AsmPrinter; - class MCAsmInfo; - class MCContext; - class MCInst; - class MCOperand; - class MCSymbol; - class MachineInstr; - class MachineModuleInfoMachO; - class MachineOperand; - class Mangler; - //class ARMSubtarget; - -/// ARMMCInstLower - This class is used to lower an MachineInstr into an MCInst. -class LLVM_LIBRARY_VISIBILITY ARMMCInstLower { - MCContext &Ctx; - Mangler &Mang; - AsmPrinter &Printer; - - //const ARMSubtarget &getSubtarget() const; -public: - ARMMCInstLower(MCContext &ctx, Mangler &mang, AsmPrinter &printer) - : Ctx(ctx), Mang(mang), Printer(printer) {} - - void Lower(const MachineInstr *MI, MCInst &OutMI) const; - - //MCSymbol *GetPICBaseSymbol() const; - MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const; - MCSymbol *GetExternalSymbolSymbol(const MachineOperand &MO) const; - MCSymbol *GetJumpTableSymbol(const MachineOperand &MO) const; - MCSymbol *GetConstantPoolIndexSymbol(const MachineOperand &MO) const; - MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const; - -/* -private: - MachineModuleInfoMachO &getMachOMMI() const; - */ -}; - -} - -#endif From stuart at apple.com Mon Jul 19 18:56:30 2010 From: stuart at apple.com (Stuart Hastings) Date: Mon, 19 Jul 2010 23:56:30 -0000 Subject: [llvm-commits] [llvm] r108784 - in /llvm/trunk: include/llvm/Analysis/DebugInfo.h lib/Analysis/DebugInfo.cpp lib/CodeGen/AsmPrinter/DwarfDebug.cpp Message-ID: <20100719235630.9158F2A6C12C@llvm.org> Author: stuart Date: Mon Jul 19 18:56:30 2010 New Revision: 108784 URL: http://llvm.org/viewvc/llvm-project?rev=108784&view=rev Log: Correct line info for declarations/definitions. Radar 8063111. Modified: llvm/trunk/include/llvm/Analysis/DebugInfo.h llvm/trunk/lib/Analysis/DebugInfo.cpp llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Modified: llvm/trunk/include/llvm/Analysis/DebugInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DebugInfo.h?rev=108784&r1=108783&r2=108784&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/DebugInfo.h (original) +++ llvm/trunk/include/llvm/Analysis/DebugInfo.h Mon Jul 19 18:56:30 2010 @@ -134,7 +134,7 @@ public: explicit DICompileUnit(const MDNode *N = 0) : DIScope(N) {} - unsigned getLanguage() const { return getUnsignedField(2); } + unsigned getLanguage() const { return getUnsignedField(2); } StringRef getFilename() const { return getStringField(3); } StringRef getDirectory() const { return getStringField(4); } StringRef getProducer() const { return getStringField(5); } @@ -504,10 +504,18 @@ public: explicit DILexicalBlock(const MDNode *N = 0) : DIScope(N) {} DIScope getContext() const { return getFieldAs(1); } - StringRef getDirectory() const { return getContext().getDirectory(); } - StringRef getFilename() const { return getContext().getFilename(); } unsigned getLineNumber() const { return getUnsignedField(2); } unsigned getColumnNumber() const { return getUnsignedField(3); } + StringRef getDirectory() const { + DIFile F = getFieldAs(4); + StringRef dir = F.getDirectory(); + return !dir.empty() ? dir : getContext().getDirectory(); + } + StringRef getFilename() const { + DIFile F = getFieldAs(4); + StringRef filename = F.getFilename(); + return !filename.empty() ? filename : getContext().getFilename(); + } }; /// DINameSpace - A wrapper for a C++ style name space. @@ -694,8 +702,8 @@ /// CreateLexicalBlock - This creates a descriptor for a lexical block /// with the specified parent context. - DILexicalBlock CreateLexicalBlock(DIDescriptor Context, unsigned Line = 0, - unsigned Col = 0); + DILexicalBlock CreateLexicalBlock(DIDescriptor Context, DIFile F, + unsigned Line = 0, unsigned Col = 0); /// CreateNameSpace - This creates new descriptor for a namespace /// with the specified parent context. Modified: llvm/trunk/lib/Analysis/DebugInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DebugInfo.cpp?rev=108784&r1=108783&r2=108784&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/DebugInfo.cpp (original) +++ llvm/trunk/lib/Analysis/DebugInfo.cpp Mon Jul 19 18:56:30 2010 @@ -1107,14 +1107,19 @@ /// CreateBlock - This creates a descriptor for a lexical block with the /// specified parent VMContext. DILexicalBlock DIFactory::CreateLexicalBlock(DIDescriptor Context, - unsigned LineNo, unsigned Col) { + DIFile F, unsigned LineNo, + unsigned Col) { + // Defeat MDNode uniqing for lexical blocks. + static unsigned int unique_id = 0; Value *Elts[] = { GetTagConstant(dwarf::DW_TAG_lexical_block), Context, ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), - ConstantInt::get(Type::getInt32Ty(VMContext), Col) + ConstantInt::get(Type::getInt32Ty(VMContext), Col), + F, + ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) }; - return DILexicalBlock(MDNode::get(VMContext, &Elts[0], 4)); + return DILexicalBlock(MDNode::get(VMContext, &Elts[0], 6)); } /// CreateNameSpace - This creates new descriptor for a namespace Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=108784&r1=108783&r2=108784&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Jul 19 18:56:30 2010 @@ -2683,18 +2683,21 @@ if (FDL.isUnknown()) return; const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext()); + const MDNode *TheScope = 0; DISubprogram SP = getDISubprogram(Scope); unsigned Line, Col; if (SP.Verify()) { Line = SP.getLineNumber(); Col = 0; + TheScope = SP; } else { Line = FDL.getLine(); Col = FDL.getCol(); + TheScope = Scope; } - recordSourceLine(Line, Col, Scope); + recordSourceLine(Line, Col, TheScope); /// ProcessedArgs - Collection of arguments already processed. SmallPtrSet ProcessedArgs; @@ -2900,16 +2903,6 @@ Src = GetOrCreateSourceID(Dir, Fn); } -#if 0 - if (!Lines.empty()) { - SrcLineInfo lastSrcLineInfo = Lines.back(); - // Emitting sequential line records with the same line number (but - // different addresses) seems to confuse GDB. Avoid this. - if (lastSrcLineInfo.getLine() == Line) - return NULL; - } -#endif - MCSymbol *Label = MMI->getContext().CreateTempSymbol(); Lines.push_back(SrcLineInfo(Line, Col, Src, Label)); From stuart at apple.com Mon Jul 19 18:56:39 2010 From: stuart at apple.com (Stuart Hastings) Date: Mon, 19 Jul 2010 23:56:39 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r108786 - in /llvm-gcc-4.2/trunk/gcc: cp/pt.c llvm-convert.cpp llvm-debug.cpp Message-ID: <20100719235639.57C042A6C12C@llvm.org> Author: stuart Date: Mon Jul 19 18:56:39 2010 New Revision: 108786 URL: http://llvm.org/viewvc/llvm-project?rev=108786&view=rev Log: Correct line info for declarations/definitions. Radar 8063111. Modified: llvm-gcc-4.2/trunk/gcc/cp/pt.c llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp Modified: llvm-gcc-4.2/trunk/gcc/cp/pt.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/pt.c?rev=108786&r1=108785&r2=108786&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/cp/pt.c (original) +++ llvm-gcc-4.2/trunk/gcc/cp/pt.c Mon Jul 19 18:56:39 2010 @@ -6696,8 +6696,6 @@ template, and in any case are considered separate under the discrete model. */ r = copy_decl (t); - /* LLVM LOCAL 7514620 */ - DECL_SOURCE_LOCATION(r) = saved_loc; DECL_USE_TEMPLATE (r) = 0; TREE_TYPE (r) = type; /* Clear out the mangled name and RTL for the instantiation. */ Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=108786&r1=108785&r2=108786&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Mon Jul 19 18:56:39 2010 @@ -976,19 +976,20 @@ Value *Result = 0; + bool emitdebuginfo = EmitDebugInfo(); + + if (emitdebuginfo && EXPR_HAS_LOCATION(exp)) { + // Set new location on the way up the tree. + TheDebugInfo->setLocationFile(EXPR_FILENAME(exp)); + TheDebugInfo->setLocationLine(EXPR_LINENO(exp)); + } + // If we've just changed lexical blocks, emit any local variables // declared in the new block. TreeToLLVM::switchLexicalBlock(exp); - if (EmitDebugInfo()) { - if (EXPR_HAS_LOCATION(exp)) { - // Set new location on the way up the tree. - TheDebugInfo->setLocationFile(EXPR_FILENAME(exp)); - TheDebugInfo->setLocationLine(EXPR_LINENO(exp)); - } - + if (emitdebuginfo) TheDebugInfo->EmitStopPoint(Fn, Builder.GetInsertBlock(), Builder); - } switch (TREE_CODE(exp)) { default: Modified: llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp?rev=108786&r1=108785&r2=108786&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp Mon Jul 19 18:56:39 2010 @@ -288,13 +288,7 @@ RegionStack.pop_back(); } DebugInfo::push_regions(desired, grand); - // There's no point in declaring an empty (declares no variables) - // lexical BLOCK as the current lexical BLOCK. Locate nearest - // non-empty ancestor BLOCK and declare that. - for (t = desired; TREE_CODE(t) == BLOCK; t = BLOCK_SUPERCONTEXT(t)) - if (BLOCK_VARS(t)) - break; - setCurrentLexicalBlock(t); + setCurrentLexicalBlock(desired); } /// CreateSubprogramFromFnDecl - Constructs the debug code for @@ -475,11 +469,41 @@ return false; } -/// findRegion - Find tree_node N's region. -DIDescriptor DebugInfo::findRegion(tree Node) { - if (Node == NULL_TREE) +/// findRegion - Find the region (context) of a GCC tree. +DIDescriptor DebugInfo::findRegion(tree exp) { + if (exp == NULL_TREE) return getOrCreateFile(main_input_filename); + tree Node = exp; + location_t *p_locus = 0; + tree_code code = TREE_CODE(exp); + enum tree_code_class tree_cc = TREE_CODE_CLASS(code); + switch (tree_cc) { + case tcc_declaration: /* A decl node */ + p_locus = &DECL_SOURCE_LOCATION(exp); + break; + + case tcc_expression: /* an expression */ + case tcc_comparison: /* a comparison expression */ + case tcc_unary: /* a unary arithmetic expression */ + case tcc_binary: /* a binary arithmetic expression */ + Node = TREE_BLOCK(exp); + p_locus = EXPR_LOCUS(exp); + break; + + case tcc_exceptional: + switch (code) { + case BLOCK: + p_locus = &BLOCK_SOURCE_LOCATION(Node); + break; + default: + gcc_unreachable (); + } + break; + default: + break; + } + std::map::iterator I = RegionMap.find(Node); if (I != RegionMap.end()) if (MDNode *R = dyn_cast_or_null(I->second)) @@ -504,56 +528,23 @@ } } } else if (TREE_CODE(Node) == BLOCK) { - // TREE_BLOCK is GCC's lexical block. - tree scopeToDeclare, step; - -#if 0 - // GDB Kludge - // This code section is devoted to eliminating as many lexical - // blocks as possible, in order to mimic GCC debug output. In a - // perfect world, the debugger would not be adversely affected by - // a few extra lexical scopes. Ideally this stuff could be - // drastically simplified when LLDB replaces GDB. - if (nonemptySibling(Node)) { - // If any sibling BLOCK declares anything, use this scope. - scopeToDeclare = Node; + // Recursively establish ancestor scopes. + DIDescriptor context = findRegion(BLOCK_SUPERCONTEXT(Node)); + // If we don't have a location, use the last-seen info. + unsigned int line; + const char *fullpath; + if (LOCATION_FILE(*p_locus) == (char*)0) { + fullpath = CurFullPath; + line = CurLineNo; } else { - tree upper = supercontextWithDecls(Node); - if (TREE_CODE(upper) == FUNCTION_DECL) { - scopeToDeclare = upper; - } else if (TREE_CODE(upper) == BLOCK && BLOCK_VARS(upper) && BLOCK_VARS(Node) && - upper != Node) { - // We can't use upper because it declares something. Find the - // uppermost empty BLOCK /between/ Node and upper. - for (step = BLOCK_SUPERCONTEXT(Node); - TREE_CODE(step) == BLOCK && !BLOCK_VARS(step) && - BLOCK_SUPERCONTEXT(step); - step = BLOCK_SUPERCONTEXT(step)) - ; - scopeToDeclare = step; - } else - // Either or both of upper and Node are empty (declare - // nothing); fuse Node's scope with upper. - scopeToDeclare = upper; - } -#else - scopeToDeclare = Node; -#endif - - switch (TREE_CODE(scopeToDeclare)) { - default: - assert("non-BLOCK, non-FUNCTION_DECL scope!"); - case FUNCTION_DECL: - return CreateSubprogramFromFnDecl(scopeToDeclare); - case BLOCK: - // Recursively establish ancestor scopes. - DIDescriptor context = findRegion(BLOCK_SUPERCONTEXT(scopeToDeclare)); - DILexicalBlock lexical_block = - DebugFactory.CreateLexicalBlock(context, CurLineNo); - RegionMap[scopeToDeclare] = WeakVH(lexical_block); - return DIDescriptor(lexical_block); + fullpath = LOCATION_FILE(*p_locus); + line = LOCATION_LINE(*p_locus); } - // GDB Kludge end + DIFile F(getOrCreateFile(fullpath)); + DILexicalBlock lexical_block = + DebugFactory.CreateLexicalBlock(context, F, line, 0U); + RegionMap[Node] = WeakVH(lexical_block); + return DIDescriptor(lexical_block); } // Otherwise main compile unit covers everything. From daniel at zuster.org Mon Jul 19 19:08:13 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Tue, 20 Jul 2010 00:08:13 -0000 Subject: [llvm-commits] [llvm] r108787 - in /llvm/trunk/lib/Target: ARM/AsmPrinter/CMakeLists.txt ARM/CMakeLists.txt X86/AsmPrinter/CMakeLists.txt X86/CMakeLists.txt Message-ID: <20100720000813.5E6AD2A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 19:08:13 2010 New Revision: 108787 URL: http://llvm.org/viewvc/llvm-project?rev=108787&view=rev Log: Update CMake files. Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/CMakeLists.txt llvm/trunk/lib/Target/ARM/CMakeLists.txt llvm/trunk/lib/Target/X86/AsmPrinter/CMakeLists.txt llvm/trunk/lib/Target/X86/CMakeLists.txt Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/CMakeLists.txt?rev=108787&r1=108786&r2=108787&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmPrinter/CMakeLists.txt (original) +++ llvm/trunk/lib/Target/ARM/AsmPrinter/CMakeLists.txt Mon Jul 19 19:08:13 2010 @@ -1,8 +1,6 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. ) add_llvm_library(LLVMARMAsmPrinter - ARMAsmPrinter.cpp ARMInstPrinter.cpp - ARMMCInstLower.cpp ) add_dependencies(LLVMARMAsmPrinter ARMCodeGenTable_gen) Modified: llvm/trunk/lib/Target/ARM/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/CMakeLists.txt?rev=108787&r1=108786&r2=108787&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/CMakeLists.txt (original) +++ llvm/trunk/lib/Target/ARM/CMakeLists.txt Mon Jul 19 19:08:13 2010 @@ -13,6 +13,7 @@ tablegen(ARMGenEDInfo.inc -gen-enhanced-disassembly-info) add_llvm_target(ARMCodeGen + ARMAsmPrinter.cpp ARMBaseInstrInfo.cpp ARMBaseRegisterInfo.cpp ARMCodeEmitter.cpp @@ -25,7 +26,9 @@ ARMJITInfo.cpp ARMLoadStoreOptimizer.cpp ARMMCAsmInfo.cpp + ARMMCInstLower.cpp ARMRegisterInfo.cpp + ARMSelectionDAGInfo.cpp ARMSubtarget.cpp ARMTargetMachine.cpp ARMTargetObjectFile.cpp @@ -38,7 +41,6 @@ Thumb2InstrInfo.cpp Thumb2RegisterInfo.cpp Thumb2SizeReduction.cpp - ARMSelectionDAGInfo.cpp ) target_link_libraries (LLVMARMCodeGen LLVMSelectionDAG) Modified: llvm/trunk/lib/Target/X86/AsmPrinter/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/CMakeLists.txt?rev=108787&r1=108786&r2=108787&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/AsmPrinter/CMakeLists.txt (original) +++ llvm/trunk/lib/Target/X86/AsmPrinter/CMakeLists.txt Mon Jul 19 19:08:13 2010 @@ -2,8 +2,6 @@ add_llvm_library(LLVMX86AsmPrinter X86ATTInstPrinter.cpp - X86AsmPrinter.cpp X86IntelInstPrinter.cpp - X86MCInstLower.cpp ) add_dependencies(LLVMX86AsmPrinter X86CodeGenTable_gen) Modified: llvm/trunk/lib/Target/X86/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/CMakeLists.txt?rev=108787&r1=108786&r2=108787&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/CMakeLists.txt (original) +++ llvm/trunk/lib/Target/X86/CMakeLists.txt Mon Jul 19 19:08:13 2010 @@ -18,9 +18,11 @@ set(sources SSEDomainFix.cpp X86AsmBackend.cpp - X86CodeEmitter.cpp + X86AsmPrinter.cpp X86COFFMachineModuleInfo.cpp + X86CodeEmitter.cpp X86ELFWriterInfo.cpp + X86FastISel.cpp X86FloatingPoint.cpp X86ISelDAGToDAG.cpp X86ISelLowering.cpp @@ -28,12 +30,12 @@ X86JITInfo.cpp X86MCAsmInfo.cpp X86MCCodeEmitter.cpp + X86MCInstLower.cpp X86RegisterInfo.cpp + X86SelectionDAGInfo.cpp X86Subtarget.cpp X86TargetMachine.cpp X86TargetObjectFile.cpp - X86FastISel.cpp - X86SelectionDAGInfo.cpp ) if( CMAKE_CL_64 ) From bruno.cardoso at gmail.com Mon Jul 19 19:11:13 2010 From: bruno.cardoso at gmail.com (Bruno Cardoso Lopes) Date: Tue, 20 Jul 2010 00:11:13 -0000 Subject: [llvm-commits] [llvm] r108788 - in /llvm/trunk: lib/Target/X86/X86InstrFormats.td lib/Target/X86/X86InstrSSE.td test/MC/AsmParser/X86/x86_64-encoding.s Message-ID: <20100720001113.63CCD2A6C12C@llvm.org> Author: bruno Date: Mon Jul 19 19:11:13 2010 New Revision: 108788 URL: http://llvm.org/viewvc/llvm-project?rev=108788&view=rev Log: Add AVX vbroadcast new instruction Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td llvm/trunk/lib/Target/X86/X86InstrSSE.td llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFormats.td?rev=108788&r1=108787&r2=108788&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFormats.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrFormats.td Mon Jul 19 19:11:13 2010 @@ -411,6 +411,15 @@ : Ii8, TA, Requires<[HasSSE42]>; +// AVX Instruction Templates: +// Instructions introduced in AVX (no SSE equivalent forms) +// +// AVX8I - AVX instructions with T8 and OpSize prefix. +class AVX8I o, Format F, dag outs, dag ins, string asm, + list pattern> + : I, T8, OpSize, + Requires<[HasAVX]>; + // AES Instruction Templates: // // AES8I Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=108788&r1=108787&r2=108788&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Mon Jul 19 19:11:13 2010 @@ -4980,3 +4980,22 @@ (int_x86_aesni_aeskeygenassist (bitconvert (memopv2i64 addr:$src1)), imm:$src2))]>, OpSize; + +//===----------------------------------------------------------------------===// +// AVX Instructions +//===----------------------------------------------------------------------===// + +let isAsmParserOnly = 1 in { + +// Load from memory and broadcast to all elements of the destination operand +class avx_broadcast opc, string OpcodeStr, RegisterClass RC, + X86MemOperand x86memop> : + AVX8I, VEX; + +def VBROADCASTSS : avx_broadcast<0x18, "vbroadcastss", VR128, f32mem>; +def VBROADCASTSSY : avx_broadcast<0x18, "vbroadcastss", VR256, f32mem>; +def VBROADCASTSD : avx_broadcast<0x19, "vbroadcastsd", VR256, f64mem>; +def VBROADCASTF128 : avx_broadcast<0x1A, "vbroadcastf128", VR256, f128mem>; + +} // isAsmParserOnly Modified: llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s?rev=108788&r1=108787&r2=108788&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_64-encoding.s Mon Jul 19 19:11:13 2010 @@ -3072,3 +3072,19 @@ // CHECK: encoding: [0xc4,0x63,0x2d,0x40,0x18,0x03] vdpps $3, (%rax), %ymm10, %ymm11 +// CHECK: vbroadcastf128 (%rax), %ymm12 +// CHECK: encoding: [0xc4,0x62,0x7d,0x1a,0x20] + vbroadcastf128 (%rax), %ymm12 + +// CHECK: vbroadcastsd (%rax), %ymm12 +// CHECK: encoding: [0xc4,0x62,0x7d,0x19,0x20] + vbroadcastsd (%rax), %ymm12 + +// CHECK: vbroadcastss (%rax), %xmm12 +// CHECK: encoding: [0xc4,0x62,0x79,0x18,0x20] + vbroadcastss (%rax), %xmm12 + +// CHECK: vbroadcastss (%rax), %ymm12 +// CHECK: encoding: [0xc4,0x62,0x7d,0x18,0x20] + vbroadcastss (%rax), %ymm12 + From bruno.cardoso at gmail.com Mon Jul 19 19:11:50 2010 From: bruno.cardoso at gmail.com (Bruno Cardoso Lopes) Date: Tue, 20 Jul 2010 00:11:50 -0000 Subject: [llvm-commits] [llvm] r108789 - /llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s Message-ID: <20100720001150.7A3D02A6C12C@llvm.org> Author: bruno Date: Mon Jul 19 19:11:50 2010 New Revision: 108789 URL: http://llvm.org/viewvc/llvm-project?rev=108789&view=rev Log: x86_32 tests for vbroadcast Modified: llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s Modified: llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s?rev=108789&r1=108788&r2=108789&view=diff ============================================================================== --- llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s (original) +++ llvm/trunk/test/MC/AsmParser/X86/x86_32-encoding.s Mon Jul 19 19:11:50 2010 @@ -12998,3 +12998,19 @@ // CHECK: encoding: [0xc4,0xe3,0x55,0x40,0x08,0x03] vdpps $3, (%eax), %ymm5, %ymm1 +// CHECK: vbroadcastf128 (%eax), %ymm2 +// CHECK: encoding: [0xc4,0xe2,0x7d,0x1a,0x10] + vbroadcastf128 (%eax), %ymm2 + +// CHECK: vbroadcastsd (%eax), %ymm2 +// CHECK: encoding: [0xc4,0xe2,0x7d,0x19,0x10] + vbroadcastsd (%eax), %ymm2 + +// CHECK: vbroadcastss (%eax), %xmm2 +// CHECK: encoding: [0xc4,0xe2,0x79,0x18,0x10] + vbroadcastss (%eax), %xmm2 + +// CHECK: vbroadcastss (%eax), %ymm2 +// CHECK: encoding: [0xc4,0xe2,0x7d,0x18,0x10] + vbroadcastss (%eax), %ymm2 + From dalej at apple.com Mon Jul 19 19:50:13 2010 From: dalej at apple.com (Dale Johannesen) Date: Tue, 20 Jul 2010 00:50:13 -0000 Subject: [llvm-commits] [llvm] r108792 - /llvm/trunk/lib/CodeGen/MachineLICM.cpp Message-ID: <20100720005013.3E7A92A6C12C@llvm.org> Author: johannes Date: Mon Jul 19 19:50:13 2010 New Revision: 108792 URL: http://llvm.org/viewvc/llvm-project?rev=108792&view=rev Log: Don't hoist things out of a large switch inside a loop, for the reasons in the comments. This is a major win on 253.perlbmk on ARM Darwin. I expect it to be a good heuristic in general, but it's possible some things will regress; I'll be watching. 7940152. Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineLICM.cpp?rev=108792&r1=108791&r2=108792&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/MachineLICM.cpp (original) +++ llvm/trunk/lib/CodeGen/MachineLICM.cpp Mon Jul 19 19:50:13 2010 @@ -489,8 +489,12 @@ } const std::vector &Children = N->getChildren(); - for (unsigned I = 0, E = Children.size(); I != E; ++I) - HoistRegion(Children[I]); + // Don't hoist things out of a large switch statement. This often causes + // code to be hoisted that wasn't going to be executed, and increases + // register pressure in a situation where it's likely to matter. + if (Children.size() < 10) + for (unsigned I = 0, E = Children.size(); I != E; ++I) + HoistRegion(Children[I]); } /// IsLICMCandidate - Returns true if the instruction may be a suitable From gohman at apple.com Mon Jul 19 19:57:18 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Jul 2010 00:57:18 -0000 Subject: [llvm-commits] [llvm] r108793 - /llvm/trunk/lib/Analysis/ScalarEvolutionNormalization.cpp Message-ID: <20100720005718.948ED2A6C12C@llvm.org> Author: djg Date: Mon Jul 19 19:57:18 2010 New Revision: 108793 URL: http://llvm.org/viewvc/llvm-project?rev=108793&view=rev Log: Minor code simplification. Modified: llvm/trunk/lib/Analysis/ScalarEvolutionNormalization.cpp Modified: llvm/trunk/lib/Analysis/ScalarEvolutionNormalization.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionNormalization.cpp?rev=108793&r1=108792&r2=108793&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ScalarEvolutionNormalization.cpp (original) +++ llvm/trunk/lib/Analysis/ScalarEvolutionNormalization.cpp Mon Jul 19 19:57:18 2010 @@ -50,13 +50,10 @@ // Look at all of the uses of IV by the PHI node. If any use corresponds to // a block that is not dominated by the latch block, give up and use the // preincremented value. - unsigned NumUses = 0; for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) - if (PN->getIncomingValue(i) == IV) { - ++NumUses; - if (!DT->dominates(LatchBlock, PN->getIncomingBlock(i))) - return false; - } + if (PN->getIncomingValue(i) == IV && + !DT->dominates(LatchBlock, PN->getIncomingBlock(i))) + return false; // Okay, all uses of IV by PN are in predecessor blocks that really are // dominated by the latch block. Use the post-incremented value. From resistor at mac.com Mon Jul 19 20:19:59 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 20 Jul 2010 01:19:59 -0000 Subject: [llvm-commits] [llvm] r108794 - in /llvm/trunk: include/llvm/ include/llvm/Support/ lib/Analysis/ lib/Analysis/IPA/ lib/VMCore/ tools/bugpoint/ Message-ID: <20100720011959.69EE02A6C12C@llvm.org> Author: resistor Date: Mon Jul 19 20:19:58 2010 New Revision: 108794 URL: http://llvm.org/viewvc/llvm-project?rev=108794&view=rev Log: Separate PassInfo into two classes: a constructor-free superclass (StaticPassInfo) and a constructor-ful subclass (PassInfo). Modified: llvm/trunk/include/llvm/Pass.h llvm/trunk/include/llvm/PassAnalysisSupport.h llvm/trunk/include/llvm/PassManagers.h llvm/trunk/include/llvm/PassSupport.h llvm/trunk/include/llvm/Support/PassNameParser.h llvm/trunk/lib/Analysis/AliasAnalysisCounter.cpp llvm/trunk/lib/Analysis/AliasDebugger.cpp llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp llvm/trunk/lib/Analysis/IPA/CallGraph.cpp llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp llvm/trunk/lib/VMCore/Pass.cpp llvm/trunk/lib/VMCore/PassManager.cpp llvm/trunk/tools/bugpoint/BugDriver.cpp llvm/trunk/tools/bugpoint/BugDriver.h llvm/trunk/tools/bugpoint/CrashDebugger.cpp llvm/trunk/tools/bugpoint/ExtractFunction.cpp llvm/trunk/tools/bugpoint/FindBugs.cpp llvm/trunk/tools/bugpoint/Miscompilation.cpp llvm/trunk/tools/bugpoint/OptimizerDriver.cpp llvm/trunk/tools/bugpoint/bugpoint.cpp Modified: llvm/trunk/include/llvm/Pass.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Pass.h?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/include/llvm/Pass.h (original) +++ llvm/trunk/include/llvm/Pass.h Mon Jul 19 20:19:58 2010 @@ -41,6 +41,7 @@ class Function; class Module; class AnalysisUsage; +class StaticPassInfo; class PassInfo; class ImmutablePass; class PMStack; @@ -50,7 +51,7 @@ class StringRef; // AnalysisID - Use the PassInfo to identify a pass... -typedef const PassInfo* AnalysisID; +typedef const StaticPassInfo* AnalysisID; /// Different types of internal pass managers. External pass managers /// (PassManager and FunctionPassManager) are not represented here. @@ -104,7 +105,7 @@ /// getPassInfo - Return the PassInfo data structure that corresponds to this /// pass... If the pass has not been registered, this will return null. /// - const PassInfo *getPassInfo() const; + const StaticPassInfo *getPassInfo() const; /// print - Print out the internal state of the pass. This is called by /// Analyze to print out the contents of an analysis. Otherwise it is not @@ -159,7 +160,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *); + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *); virtual ImmutablePass *getAsImmutablePass(); virtual PMDataManager *getAsPMDataManager(); @@ -171,17 +172,17 @@ virtual void dumpPassStructure(unsigned Offset = 0); template - static const PassInfo *getClassPassInfo() { + static const StaticPassInfo *getClassPassInfo() { return lookupPassInfo(intptr_t(&AnalysisClass::ID)); } // lookupPassInfo - Return the pass info object for the specified pass class, // or null if it is not known. - static const PassInfo *lookupPassInfo(intptr_t TI); + static const StaticPassInfo *lookupPassInfo(intptr_t TI); // lookupPassInfo - Return the pass info object for the pass with the given // argument string, or null if it is not known. - static const PassInfo *lookupPassInfo(StringRef Arg); + static const StaticPassInfo *lookupPassInfo(StringRef Arg); /// getAnalysisIfAvailable() - Subclasses use this function to /// get analysis information that might be around, for example to update it. @@ -213,10 +214,10 @@ AnalysisType &getAnalysis(Function &F); // Defined in PassAnalysisSupport.h template - AnalysisType &getAnalysisID(const PassInfo *PI) const; + AnalysisType &getAnalysisID(const StaticPassInfo *PI) const; template - AnalysisType &getAnalysisID(const PassInfo *PI, Function &F); + AnalysisType &getAnalysisID(const StaticPassInfo *PI, Function &F); }; Modified: llvm/trunk/include/llvm/PassAnalysisSupport.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassAnalysisSupport.h?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassAnalysisSupport.h (original) +++ llvm/trunk/include/llvm/PassAnalysisSupport.h Mon Jul 19 20:19:58 2010 @@ -86,7 +86,7 @@ // linked in. Be careful about spelling! // AnalysisUsage &addPreserved(StringRef Arg) { - const PassInfo *PI = Pass::lookupPassInfo(Arg); + const StaticPassInfo *PI = Pass::lookupPassInfo(Arg); // If the pass exists, preserve it. Otherwise silently do nothing. if (PI) Preserved.push_back(PI); return *this; @@ -130,7 +130,7 @@ inline PMDataManager &getPMDataManager() { return PM; } // Find pass that is implementing PI. - Pass *findImplPass(const PassInfo *PI) { + Pass *findImplPass(const StaticPassInfo *PI) { Pass *ResultPass = 0; for (unsigned i = 0; i < AnalysisImpls.size() ; ++i) { if (AnalysisImpls[i].first == PI) { @@ -142,10 +142,10 @@ } // Find pass that is implementing PI. Initialize pass for Function F. - Pass *findImplPass(Pass *P, const PassInfo *PI, Function &F); + Pass *findImplPass(Pass *P, const StaticPassInfo *PI, Function &F); - void addAnalysisImplsPair(const PassInfo *PI, Pass *P) { - std::pair pir = std::make_pair(PI,P); + void addAnalysisImplsPair(const StaticPassInfo *PI, Pass *P) { + std::pair pir = std::make_pair(PI,P); AnalysisImpls.push_back(pir); } @@ -160,7 +160,7 @@ // AnalysisImpls - This keeps track of which passes implements the interfaces // that are required by the current pass (to implement getAnalysis()). - std::vector > AnalysisImpls; + std::vector > AnalysisImpls; private: // PassManager that is used to resolve analysis info @@ -179,7 +179,7 @@ AnalysisType *Pass::getAnalysisIfAvailable() const { assert(Resolver && "Pass not resident in a PassManager object!"); - const PassInfo *PI = getClassPassInfo(); + const StaticPassInfo *PI = getClassPassInfo(); if (PI == 0) return 0; Pass *ResultPass = Resolver->getAnalysisIfAvailable(PI, true); @@ -203,7 +203,7 @@ } template -AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { +AnalysisType &Pass::getAnalysisID(const StaticPassInfo *PI) const { assert(PI && "getAnalysis for unregistered pass!"); assert(Resolver&&"Pass has not been inserted into a PassManager object!"); // PI *must* appear in AnalysisImpls. Because the number of passes used @@ -233,7 +233,7 @@ } template -AnalysisType &Pass::getAnalysisID(const PassInfo *PI, Function &F) { +AnalysisType &Pass::getAnalysisID(const StaticPassInfo *PI, Function &F) { assert(PI && "getAnalysis for unregistered pass!"); assert(Resolver && "Pass has not been inserted into a PassManager object!"); // PI *must* appear in AnalysisImpls. Because the number of passes used Modified: llvm/trunk/include/llvm/PassManagers.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassManagers.h?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassManagers.h (original) +++ llvm/trunk/include/llvm/PassManagers.h Mon Jul 19 20:19:58 2010 @@ -302,7 +302,7 @@ /// through getAnalysis interface. virtual void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass); - virtual Pass *getOnTheFlyPass(Pass *P, const PassInfo *PI, Function &F); + virtual Pass *getOnTheFlyPass(Pass *P, const StaticPassInfo *PI, Function &F); /// Initialize available analysis information. void initializeAnalysisInfo() { Modified: llvm/trunk/include/llvm/PassSupport.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassSupport.h (original) +++ llvm/trunk/include/llvm/PassSupport.h Mon Jul 19 20:19:58 2010 @@ -22,6 +22,7 @@ #define LLVM_PASS_SUPPORT_H #include "Pass.h" +#include "llvm/Config/config.h" namespace llvm { @@ -33,45 +34,24 @@ /// getPassInfo() method. These objects are set up by the RegisterPass<> /// template, defined below. /// -class PassInfo { -public: + +struct StaticPassInfo { typedef Pass* (*NormalCtor_t)(); struct InterfaceInfo { - const PassInfo *interface; + const StaticPassInfo *interface; const InterfaceInfo *next; }; -private: - const char *const PassName; // Nice name for Pass - const char *const PassArgument; // Command Line argument to run this pass - const intptr_t PassID; - const bool IsCFGOnlyPass; // Pass only looks at the CFG. - const bool IsAnalysis; // True if an analysis pass. - const bool IsAnalysisGroup; // True if an analysis group. - const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass + const char *PassName; // Nice name for Pass + const char *PassArgument; // Command Line argument to run this pass + intptr_t PassID; + bool IsCFGOnlyPass; // Pass only looks at the CFG. + bool IsAnalysis; // True if an analysis pass. + bool IsAnalysisGroup; // True if an analysis group. + InterfaceInfo *ItfImpl;// Interfaces implemented by this pass NormalCtor_t NormalCtor; - -public: - /// PassInfo ctor - Do not call this directly, this should only be invoked - /// through RegisterPass. - PassInfo(const char *name, const char *arg, intptr_t pi, - NormalCtor_t normal = 0, - bool isCFGOnly = false, bool is_analysis = false) - : PassName(name), PassArgument(arg), PassID(pi), - IsCFGOnlyPass(isCFGOnly), - IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal) { - registerPass(); - } - /// PassInfo ctor - Do not call this directly, this should only be invoked - /// through RegisterPass. This version is for use by analysis groups; it - /// does not auto-register the pass. - PassInfo(const char *name, intptr_t pi) - : PassName(name), PassArgument(""), PassID(pi), - IsCFGOnlyPass(false), - IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0) { - } - + /// getPassName - Return the friendly name for the pass, never returns null /// const char *getPassName() const { return PassName; } @@ -90,7 +70,7 @@ bool isPassID(void *IDPtr) const { return PassID == (intptr_t)IDPtr; } - + /// isAnalysisGroup - Return true if this is an analysis group, not a normal /// pass. /// @@ -100,7 +80,7 @@ /// isCFGOnlyPass - return true if this pass only looks at the CFG for the /// function. bool isCFGOnlyPass() const { return IsCFGOnlyPass; } - + /// getNormalCtor - Return a pointer to a function, that when called, creates /// an instance of the pass and returns it. This pointer may be null if there /// is no default constructor for the pass. @@ -112,14 +92,11 @@ NormalCtor = Ctor; } - /// createPass() - Use this method to create an instance of this pass. - Pass *createPass() const; - /// addInterfaceImplemented - This method is called when this pass is /// registered as a member of an analysis group with the RegisterAnalysisGroup /// template. /// - void addInterfaceImplemented(const PassInfo *ItfPI) { + void addInterfaceImplemented(const StaticPassInfo *ItfPI) { InterfaceInfo *NewInfo = new InterfaceInfo(); NewInfo->interface = ItfPI; NewInfo->next = ItfImpl; @@ -133,6 +110,39 @@ return ItfImpl; } + /// createPass() - Use this method to create an instance of this pass. + Pass *createPass() const; +}; + +class PassInfo : public StaticPassInfo { +public: + /// PassInfo ctor - Do not call this directly, this should only be invoked + /// through RegisterPass. + PassInfo(const char *name, const char *arg, intptr_t pi, + NormalCtor_t normal = 0, + bool isCFGOnly = false, bool is_analysis = false) { + this->PassName = name; + this->PassArgument = arg; + this->PassID = pi; + this->IsCFGOnlyPass = isCFGOnly; + this->IsAnalysis = is_analysis; + this->IsAnalysisGroup = false; + this->NormalCtor = normal; + registerPass(); + } + /// PassInfo ctor - Do not call this directly, this should only be invoked + /// through RegisterPass. This version is for use by analysis groups; it + /// does not auto-register the pass. + PassInfo(const char *name, intptr_t pi) { + this->PassName = name; + this->PassArgument = ""; + this->PassID = pi; + this->IsCFGOnlyPass = false; + this->IsAnalysis = false; + this->IsAnalysisGroup = true; + this->NormalCtor = 0; + } + protected: void registerPass(); void unregisterPass(); @@ -240,7 +250,7 @@ /// Callback functions - These functions are invoked whenever a pass is loaded /// or removed from the current executable. /// - virtual void passRegistered(const PassInfo *) {} + virtual void passRegistered(const StaticPassInfo *) {} /// enumeratePasses - Iterate over the registered passes, calling the /// passEnumerate callback on each PassInfo object. @@ -250,7 +260,7 @@ /// passEnumerate - Callback function invoked when someone calls /// enumeratePasses on this PassRegistrationListener object. /// - virtual void passEnumerate(const PassInfo *) {} + virtual void passEnumerate(const StaticPassInfo *) {} }; Modified: llvm/trunk/include/llvm/Support/PassNameParser.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PassNameParser.h?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PassNameParser.h (original) +++ llvm/trunk/include/llvm/Support/PassNameParser.h Mon Jul 19 20:19:58 2010 @@ -55,9 +55,11 @@ // ignorablePassImpl - Can be overriden in subclasses to refine the list of // which passes we want to include. // - virtual bool ignorablePassImpl(const PassInfo *P) const { return false; } + virtual bool ignorablePassImpl(const StaticPassInfo *P) const { + return false; + } - inline bool ignorablePass(const PassInfo *P) const { + inline bool ignorablePass(const StaticPassInfo *P) const { // Ignore non-selectable and non-constructible passes! Ignore // non-optimizations. return P->getPassArgument() == 0 || *P->getPassArgument() == 0 || @@ -66,7 +68,7 @@ // Implement the PassRegistrationListener callbacks used to populate our map // - virtual void passRegistered(const PassInfo *P) { + virtual void passRegistered(const StaticPassInfo *P) { if (ignorablePass(P) || !Opt) return; if (findOption(P->getPassArgument()) != getNumOptions()) { errs() << "Two passes with the same argument (-" @@ -75,7 +77,7 @@ } addLiteralOption(P->getPassArgument(), P, P->getPassName()); } - virtual void passEnumerate(const PassInfo *P) { passRegistered(P); } + virtual void passEnumerate(const StaticPassInfo *P) { passRegistered(P); } // ValLessThan - Provide a sorting comparator for Values elements... typedef std::pairisPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/AliasDebugger.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasDebugger.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/AliasDebugger.cpp (original) +++ llvm/trunk/lib/Analysis/AliasDebugger.cpp Mon Jul 19 20:19:58 2010 @@ -83,7 +83,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Mon Jul 19 20:19:58 2010 @@ -172,7 +172,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; @@ -243,7 +243,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/IPA/CallGraph.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/CallGraph.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IPA/CallGraph.cpp (original) +++ llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Mon Jul 19 20:19:58 2010 @@ -86,7 +86,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&CallGraph::ID)) return (CallGraph*)this; return this; Modified: llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp (original) +++ llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp Mon Jul 19 20:19:58 2010 @@ -149,7 +149,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp (original) +++ llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp Mon Jul 19 20:19:58 2010 @@ -59,7 +59,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&ProfileInfo::ID)) return (ProfileInfo*)this; return this; Modified: llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp (original) +++ llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp Mon Jul 19 20:19:58 2010 @@ -67,7 +67,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&ProfileInfo::ID)) return (ProfileInfo*)this; return this; Modified: llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp Mon Jul 19 20:19:58 2010 @@ -40,7 +40,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/VMCore/Pass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Pass.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Pass.cpp (original) +++ llvm/trunk/lib/VMCore/Pass.cpp Mon Jul 19 20:19:58 2010 @@ -75,7 +75,7 @@ /// Registration templates, but can be overloaded directly. /// const char *Pass::getPassName() const { - if (const PassInfo *PI = getPassInfo()) + if (const StaticPassInfo *PI = getPassInfo()) return PI->getPassName(); return "Unnamed pass: implement Pass::getPassName()"; } @@ -101,7 +101,7 @@ // By default, don't do anything. } -void *Pass::getAdjustedAnalysisPointer(const PassInfo *) { +void *Pass::getAdjustedAnalysisPointer(const StaticPassInfo *) { return this; } @@ -243,35 +243,35 @@ /// PassInfoMap - Keep track of the passinfo object for each registered llvm /// pass. - typedef std::map MapType; + typedef std::map MapType; MapType PassInfoMap; - typedef StringMap StringMapType; + typedef StringMap StringMapType; StringMapType PassInfoStringMap; /// AnalysisGroupInfo - Keep track of information for each analysis group. struct AnalysisGroupInfo { - std::set Implementations; + std::set Implementations; }; /// AnalysisGroupInfoMap - Information for each analysis group. - std::map AnalysisGroupInfoMap; + std::map AnalysisGroupInfoMap; public: - const PassInfo *GetPassInfo(intptr_t TI) const { + const StaticPassInfo *GetPassInfo(intptr_t TI) const { sys::SmartScopedLock Guard(Lock); MapType::const_iterator I = PassInfoMap.find(TI); return I != PassInfoMap.end() ? I->second : 0; } - const PassInfo *GetPassInfo(StringRef Arg) const { + const StaticPassInfo *GetPassInfo(StringRef Arg) const { sys::SmartScopedLock Guard(Lock); StringMapType::const_iterator I = PassInfoStringMap.find(Arg); return I != PassInfoStringMap.end() ? I->second : 0; } - void RegisterPass(const PassInfo &PI) { + void RegisterPass(const StaticPassInfo &PI) { sys::SmartScopedLock Guard(Lock); bool Inserted = PassInfoMap.insert(std::make_pair(PI.getTypeInfo(),&PI)).second; @@ -279,7 +279,7 @@ PassInfoStringMap[PI.getPassArgument()] = &PI; } - void UnregisterPass(const PassInfo &PI) { + void UnregisterPass(const StaticPassInfo &PI) { sys::SmartScopedLock Guard(Lock); MapType::iterator I = PassInfoMap.find(PI.getTypeInfo()); assert(I != PassInfoMap.end() && "Pass registered but not in map!"); @@ -298,8 +298,8 @@ /// Analysis Group Mechanisms. - void RegisterAnalysisGroup(PassInfo *InterfaceInfo, - const PassInfo *ImplementationInfo, + void RegisterAnalysisGroup(StaticPassInfo *InterfaceInfo, + const StaticPassInfo *ImplementationInfo, bool isDefault) { sys::SmartScopedLock Guard(Lock); AnalysisGroupInfo &AGI = AnalysisGroupInfoMap[InterfaceInfo]; @@ -363,15 +363,15 @@ // getPassInfo - Return the PassInfo data structure that corresponds to this // pass... -const PassInfo *Pass::getPassInfo() const { +const StaticPassInfo *Pass::getPassInfo() const { return lookupPassInfo(PassID); } -const PassInfo *Pass::lookupPassInfo(intptr_t TI) { +const StaticPassInfo *Pass::lookupPassInfo(intptr_t TI) { return getPassRegistrar()->GetPassInfo(TI); } -const PassInfo *Pass::lookupPassInfo(StringRef Arg) { +const StaticPassInfo *Pass::lookupPassInfo(StringRef Arg) { return getPassRegistrar()->GetPassInfo(Arg); } @@ -390,7 +390,7 @@ getPassRegistrar()->UnregisterPass(*this); } -Pass *PassInfo::createPass() const { +Pass *StaticPassInfo::createPass() const { assert((!isAnalysisGroup() || NormalCtor) && "No default implementation found for analysis group!"); assert(NormalCtor && @@ -408,8 +408,8 @@ intptr_t PassID, bool isDefault) : PassInfo(Name, InterfaceID) { - PassInfo *InterfaceInfo = - const_cast(Pass::lookupPassInfo(InterfaceID)); + StaticPassInfo *InterfaceInfo = + const_cast(Pass::lookupPassInfo(InterfaceID)); if (InterfaceInfo == 0) { // First reference to Interface, register it now. registerPass(); @@ -419,13 +419,13 @@ "Trying to join an analysis group that is a normal pass!"); if (PassID) { - const PassInfo *ImplementationInfo = Pass::lookupPassInfo(PassID); + const StaticPassInfo *ImplementationInfo = Pass::lookupPassInfo(PassID); assert(ImplementationInfo && "Must register pass before adding to AnalysisGroup!"); // Make sure we keep track of the fact that the implementation implements // the interface. - PassInfo *IIPI = const_cast(ImplementationInfo); + StaticPassInfo *IIPI = const_cast(ImplementationInfo); IIPI->addInterfaceImplemented(InterfaceInfo); getPassRegistrar()->RegisterAnalysisGroup(InterfaceInfo, IIPI, isDefault); @@ -479,7 +479,7 @@ VectorType &CFGOnlyList; GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {} - void passEnumerate(const PassInfo *P) { + void passEnumerate(const StaticPassInfo *P) { if (P->isCFGOnlyPass()) CFGOnlyList.push_back(P); } Modified: llvm/trunk/lib/VMCore/PassManager.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/PassManager.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/PassManager.cpp (original) +++ llvm/trunk/lib/VMCore/PassManager.cpp Mon Jul 19 20:19:58 2010 @@ -332,7 +332,8 @@ /// Return function pass corresponding to PassInfo PI, that is /// required by module pass MP. Instantiate analysis pass, by using /// its runOnFunction() for function F. - virtual Pass* getOnTheFlyPass(Pass *MP, const PassInfo *PI, Function &F); + virtual Pass* getOnTheFlyPass(Pass *MP, const StaticPassInfo *PI, + Function &F); virtual const char *getPassName() const { return "Module Pass Manager"; @@ -632,7 +633,7 @@ for (SmallVector::iterator I = ImmutablePasses.begin(), E = ImmutablePasses.end(); P == NULL && I != E; ++I) { - const PassInfo *PI = (*I)->getPassInfo(); + const StaticPassInfo *PI = (*I)->getPassInfo(); if (PI == AID) P = *I; @@ -728,7 +729,7 @@ /// Augement AvailableAnalysis by adding analysis made available by pass P. void PMDataManager::recordAvailableAnalysis(Pass *P) { - const PassInfo *PI = P->getPassInfo(); + const StaticPassInfo *PI = P->getPassInfo(); if (PI == 0) return; AvailableAnalysis[PI] = P; @@ -867,7 +868,7 @@ P->releaseMemory(); } - if (const PassInfo *PI = P->getPassInfo()) { + if (const StaticPassInfo *PI = P->getPassInfo()) { // Remove the pass itself (if it is not already removed). AvailableAnalysis.erase(PI); @@ -1051,7 +1052,7 @@ if (PMDataManager *PMD = (*I)->getAsPMDataManager()) PMD->dumpPassArguments(); else - if (const PassInfo *PI = (*I)->getPassInfo()) + if (const StaticPassInfo *PI = (*I)->getPassInfo()) if (!PI->isAnalysisGroup()) dbgs() << " -" << PI->getPassArgument(); } @@ -1154,7 +1155,8 @@ llvm_unreachable("Unable to schedule pass"); } -Pass *PMDataManager::getOnTheFlyPass(Pass *P, const PassInfo *PI, Function &F) { +Pass *PMDataManager::getOnTheFlyPass(Pass *P, const StaticPassInfo *PI, + Function &F) { assert(0 && "Unable to find on the fly pass"); return NULL; } @@ -1173,7 +1175,7 @@ return PM.findAnalysisPass(ID, dir); } -Pass *AnalysisResolver::findImplPass(Pass *P, const PassInfo *AnalysisPI, +Pass *AnalysisResolver::findImplPass(Pass *P, const StaticPassInfo *AnalysisPI, Function &F) { return PM.getOnTheFlyPass(P, AnalysisPI, F); } @@ -1568,7 +1570,8 @@ /// Return function pass corresponding to PassInfo PI, that is /// required by module pass MP. Instantiate analysis pass, by using /// its runOnFunction() for function F. -Pass* MPPassManager::getOnTheFlyPass(Pass *MP, const PassInfo *PI, Function &F){ +Pass* MPPassManager::getOnTheFlyPass(Pass *MP, const StaticPassInfo *PI, + Function &F){ FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP]; assert(FPP && "Unable to find on the fly pass"); Modified: llvm/trunk/tools/bugpoint/BugDriver.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/BugDriver.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/BugDriver.cpp (original) +++ llvm/trunk/tools/bugpoint/BugDriver.cpp Mon Jul 19 20:19:58 2010 @@ -56,7 +56,8 @@ /// getPassesString - Turn a list of passes into a string which indicates the /// command line options that must be passed to add the passes. /// -std::string llvm::getPassesString(const std::vector &Passes) { +std::string +llvm::getPassesString(const std::vector &Passes) { std::string Result; for (unsigned i = 0, e = Passes.size(); i != e; ++i) { if (i) Result += " "; Modified: llvm/trunk/tools/bugpoint/BugDriver.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/BugDriver.h?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/BugDriver.h (original) +++ llvm/trunk/tools/bugpoint/BugDriver.h Mon Jul 19 20:19:58 2010 @@ -23,7 +23,7 @@ namespace llvm { class Value; -class PassInfo; +class StaticPassInfo; class Module; class GlobalVariable; class Function; @@ -47,7 +47,7 @@ const char *ToolName; // argv[0] of bugpoint std::string ReferenceOutputFile; // Name of `good' output file Module *Program; // The raw program, linked together - std::vector PassesToRun; + std::vector PassesToRun; AbstractInterpreter *Interpreter; // How to run the program AbstractInterpreter *SafeInterpreter; // To generate reference output, etc. GCC *gcc; @@ -77,10 +77,10 @@ bool addSources(const std::vector &FileNames); template void addPasses(It I, It E) { PassesToRun.insert(PassesToRun.end(), I, E); } - void setPassesToRun(const std::vector &PTR) { + void setPassesToRun(const std::vector &PTR) { PassesToRun = PTR; } - const std::vector &getPassesToRun() const { + const std::vector &getPassesToRun() const { return PassesToRun; } @@ -112,7 +112,7 @@ /// ReferenceOutput contains the filename of the file containing the output we /// are to match. /// - bool debugPassMiscompilation(const PassInfo *ThePass, + bool debugPassMiscompilation(const StaticPassInfo *ThePass, const std::string &ReferenceOutput); /// compileSharedObject - This method creates a SharedObject from a given @@ -243,7 +243,8 @@ /// failure. If AutoDebugCrashes is set to true, then bugpoint will /// automatically attempt to track down a crashing pass if one exists, and /// this method will never return null. - Module *runPassesOn(Module *M, const std::vector &Passes, + Module *runPassesOn(Module *M, + const std::vector &Passes, bool AutoDebugCrashes = false, unsigned NumExtraArgs = 0, const char * const *ExtraArgs = NULL); @@ -256,7 +257,7 @@ /// or failed, unless Quiet is set. ExtraArgs specifies additional arguments /// to pass to the child bugpoint instance. /// - bool runPasses(const std::vector &PassesToRun, + bool runPasses(const std::vector &PassesToRun, std::string &OutputFilename, bool DeleteOutput = false, bool Quiet = false, unsigned NumExtraArgs = 0, const char * const *ExtraArgs = NULL) const; @@ -268,7 +269,7 @@ /// If the passes did not compile correctly, output the command required to /// recreate the failure. This returns true if a compiler error is found. /// - bool runManyPasses(const std::vector &AllPasses, + bool runManyPasses(const std::vector &AllPasses, std::string &ErrMsg); /// writeProgramToFile - This writes the current "Program" to the named @@ -281,14 +282,14 @@ /// false indicating whether or not the optimizer crashed on the specified /// input (true = crashed). /// - bool runPasses(const std::vector &PassesToRun, + bool runPasses(const std::vector &PassesToRun, bool DeleteOutput = true) const { std::string Filename; return runPasses(PassesToRun, Filename, DeleteOutput); } /// runAsChild - The actual "runPasses" guts that runs in a child process. - int runPassesAsChild(const std::vector &PassesToRun); + int runPassesAsChild(const std::vector &PassesToRun); /// initializeExecutionEnvironment - This method is used to set up the /// environment for executing LLVM programs. @@ -306,7 +307,7 @@ /// getPassesString - Turn a list of passes into a string which indicates the /// command line options that must be passed to add the passes. /// -std::string getPassesString(const std::vector &Passes); +std::string getPassesString(const std::vector &Passes); /// PrintFunctionList - prints out list of problematic functions /// Modified: llvm/trunk/tools/bugpoint/CrashDebugger.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/CrashDebugger.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/CrashDebugger.cpp (original) +++ llvm/trunk/tools/bugpoint/CrashDebugger.cpp Mon Jul 19 20:19:58 2010 @@ -43,7 +43,7 @@ } namespace llvm { - class ReducePassList : public ListReducer { + class ReducePassList : public ListReducer { BugDriver &BD; public: ReducePassList(BugDriver &bd) : BD(bd) {} @@ -52,15 +52,15 @@ // running the "Kept" passes fail when run on the output of the "removed" // passes. If we return true, we update the current module of bugpoint. // - virtual TestResult doTest(std::vector &Removed, - std::vector &Kept, + virtual TestResult doTest(std::vector &Removed, + std::vector &Kept, std::string &Error); }; } ReducePassList::TestResult -ReducePassList::doTest(std::vector &Prefix, - std::vector &Suffix, +ReducePassList::doTest(std::vector &Prefix, + std::vector &Suffix, std::string &Error) { sys::Path PrefixOutput; Module *OrigProgram = 0; Modified: llvm/trunk/tools/bugpoint/ExtractFunction.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ExtractFunction.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/ExtractFunction.cpp (original) +++ llvm/trunk/tools/bugpoint/ExtractFunction.cpp Mon Jul 19 20:19:58 2010 @@ -99,8 +99,8 @@ return Result; } -static const PassInfo *getPI(Pass *P) { - const PassInfo *PI = P->getPassInfo(); +static const StaticPassInfo *getPI(Pass *P) { + const StaticPassInfo *PI = P->getPassInfo(); delete P; return PI; } @@ -114,7 +114,7 @@ for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) I->setLinkage(GlobalValue::ExternalLinkage); - std::vector CleanupPasses; + std::vector CleanupPasses; CleanupPasses.push_back(getPI(createGlobalDCEPass())); if (MayModifySemantics) @@ -138,7 +138,7 @@ /// function. This returns null if there are no extractable loops in the /// program or if the loop extractor crashes. Module *BugDriver::ExtractLoop(Module *M) { - std::vector LoopExtractPasses; + std::vector LoopExtractPasses; LoopExtractPasses.push_back(getPI(createSingleLoopExtractorPass())); Module *NewM = runPassesOn(M, LoopExtractPasses); @@ -359,7 +359,7 @@ std::string uniqueFN = "--extract-blocks-file=" + uniqueFilename.str(); const char *ExtraArg = uniqueFN.c_str(); - std::vector PI; + std::vector PI; std::vector EmptyBBs; // This parameter is ignored. PI.push_back(getPI(createBlockExtractorPass(EmptyBBs))); Module *Ret = runPassesOn(M, PI, false, 1, &ExtraArg); Modified: llvm/trunk/tools/bugpoint/FindBugs.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/FindBugs.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/FindBugs.cpp (original) +++ llvm/trunk/tools/bugpoint/FindBugs.cpp Mon Jul 19 20:19:58 2010 @@ -29,7 +29,8 @@ /// If the passes did not compile correctly, output the command required to /// recreate the failure. This returns true if a compiler error is found. /// -bool BugDriver::runManyPasses(const std::vector &AllPasses, +bool +BugDriver::runManyPasses(const std::vector &AllPasses, std::string &ErrMsg) { setPassesToRun(AllPasses); outs() << "Starting bug finding procedure...\n\n"; Modified: llvm/trunk/tools/bugpoint/Miscompilation.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/Miscompilation.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/Miscompilation.cpp (original) +++ llvm/trunk/tools/bugpoint/Miscompilation.cpp Mon Jul 19 20:19:58 2010 @@ -43,13 +43,13 @@ cl::desc("Don't extract blocks when searching for miscompilations"), cl::init(false)); - class ReduceMiscompilingPasses : public ListReducer { + class ReduceMiscompilingPasses : public ListReducer { BugDriver &BD; public: ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {} - virtual TestResult doTest(std::vector &Prefix, - std::vector &Suffix, + virtual TestResult doTest(std::vector &Prefix, + std::vector &Suffix, std::string &Error); }; } @@ -58,8 +58,8 @@ /// group, see if they still break the program. /// ReduceMiscompilingPasses::TestResult -ReduceMiscompilingPasses::doTest(std::vector &Prefix, - std::vector &Suffix, +ReduceMiscompilingPasses::doTest(std::vector &Prefix, + std::vector &Suffix, std::string &Error) { // First, run the program with just the Suffix passes. If it is still broken // with JUST the kept passes, discard the prefix passes. Modified: llvm/trunk/tools/bugpoint/OptimizerDriver.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/OptimizerDriver.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/OptimizerDriver.cpp (original) +++ llvm/trunk/tools/bugpoint/OptimizerDriver.cpp Mon Jul 19 20:19:58 2010 @@ -83,7 +83,7 @@ outs() << getPassesString(PassesToRun) << "\n"; } -int BugDriver::runPassesAsChild(const std::vector &Passes) { +int BugDriver::runPassesAsChild(const std::vector &Passes) { std::string ErrInfo; raw_fd_ostream OutFile(ChildOutput.c_str(), ErrInfo, raw_fd_ostream::F_Binary); @@ -124,7 +124,7 @@ /// outs() a single line message indicating whether compilation was successful /// or failed. /// -bool BugDriver::runPasses(const std::vector &Passes, +bool BugDriver::runPasses(const std::vector &Passes, std::string &OutputFilename, bool DeleteOutput, bool Quiet, unsigned NumExtraArgs, const char * const *ExtraArgs) const { @@ -178,7 +178,7 @@ pass_args.push_back( std::string("-load")); pass_args.push_back( PluginLoader::getPlugin(i)); } - for (std::vector::const_iterator I = Passes.begin(), + for (std::vector::const_iterator I = Passes.begin(), E = Passes.end(); I != E; ++I ) pass_args.push_back( std::string("-") + (*I)->getPassArgument() ); for (std::vector::const_iterator I = pass_args.begin(), @@ -235,7 +235,7 @@ /// module, returning the transformed module on success, or a null pointer on /// failure. Module *BugDriver::runPassesOn(Module *M, - const std::vector &Passes, + const std::vector &Passes, bool AutoDebugCrashes, unsigned NumExtraArgs, const char * const *ExtraArgs) { Module *OldProgram = swapProgramIn(M); Modified: llvm/trunk/tools/bugpoint/bugpoint.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/bugpoint.cpp?rev=108794&r1=108793&r2=108794&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/bugpoint.cpp (original) +++ llvm/trunk/tools/bugpoint/bugpoint.cpp Mon Jul 19 20:19:58 2010 @@ -61,7 +61,7 @@ // The AnalysesList is automatically populated with registered Passes by the // PassNameParser. // -static cl::list +static cl::list PassList(cl::desc("Passes available:"), cl::ZeroOrMore); static cl::opt @@ -90,7 +90,7 @@ AddToDriver(BugDriver &_D) : D(_D) {} virtual void add(Pass *P) { - const PassInfo *PI = P->getPassInfo(); + const StaticPassInfo *PI = P->getPassInfo(); D.addPasses(&PI, &PI + 1); } }; From evan.cheng at apple.com Mon Jul 19 21:01:31 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Jul 2010 19:01:31 -0700 Subject: [llvm-commits] [llvm] r108792 - /llvm/trunk/lib/CodeGen/MachineLICM.cpp In-Reply-To: <20100720005013.3E7A92A6C12C@llvm.org> References: <20100720005013.3E7A92A6C12C@llvm.org> Message-ID: On Jul 19, 2010, at 5:50 PM, Dale Johannesen wrote: > Author: johannes > Date: Mon Jul 19 19:50:13 2010 > New Revision: 108792 > > URL: http://llvm.org/viewvc/llvm-project?rev=108792&view=rev > Log: > Don't hoist things out of a large switch inside a > loop, for the reasons in the comments. This is a > major win on 253.perlbmk on ARM Darwin. I expect it > to be a good heuristic in general, but it's possible > some things will regress; I'll be watching. > 7940152. > > > Modified: > llvm/trunk/lib/CodeGen/MachineLICM.cpp > > Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineLICM.cpp?rev=108792&r1=108791&r2=108792&view=diff > ============================================================================== > --- llvm/trunk/lib/CodeGen/MachineLICM.cpp (original) > +++ llvm/trunk/lib/CodeGen/MachineLICM.cpp Mon Jul 19 19:50:13 2010 > @@ -489,8 +489,12 @@ > } > > const std::vector &Children = N->getChildren(); > - for (unsigned I = 0, E = Children.size(); I != E; ++I) > - HoistRegion(Children[I]); > + // Don't hoist things out of a large switch statement. This often causes > + // code to be hoisted that wasn't going to be executed, and increases > + // register pressure in a situation where it's likely to matter. > + if (Children.size() < 10) How would this work? This doesn't seem like a good way to determine if the loop body contains a switch statement. Evan > + for (unsigned I = 0, E = Children.size(); I != E; ++I) > + HoistRegion(Children[I]); > } > > /// IsLICMCandidate - Returns true if the instruction may be a suitable > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From daniel at zuster.org Mon Jul 19 22:06:07 2010 From: daniel at zuster.org (Daniel Dunbar) Date: Tue, 20 Jul 2010 03:06:07 -0000 Subject: [llvm-commits] [llvm] r108805 - in /llvm/trunk: include/llvm/ include/llvm/Support/ lib/Analysis/ lib/Analysis/IPA/ lib/VMCore/ tools/bugpoint/ Message-ID: <20100720030607.930892A6C12C@llvm.org> Author: ddunbar Date: Mon Jul 19 22:06:07 2010 New Revision: 108805 URL: http://llvm.org/viewvc/llvm-project?rev=108805&view=rev Log: Revert r108794, "Separate PassInfo into two classes: a constructor-free superclass (StaticPassInfo) and a constructor-ful subclass (PassInfo).", it is breaking teh everything. Modified: llvm/trunk/include/llvm/Pass.h llvm/trunk/include/llvm/PassAnalysisSupport.h llvm/trunk/include/llvm/PassManagers.h llvm/trunk/include/llvm/PassSupport.h llvm/trunk/include/llvm/Support/PassNameParser.h llvm/trunk/lib/Analysis/AliasAnalysisCounter.cpp llvm/trunk/lib/Analysis/AliasDebugger.cpp llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp llvm/trunk/lib/Analysis/IPA/CallGraph.cpp llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp llvm/trunk/lib/VMCore/Pass.cpp llvm/trunk/lib/VMCore/PassManager.cpp llvm/trunk/tools/bugpoint/BugDriver.cpp llvm/trunk/tools/bugpoint/BugDriver.h llvm/trunk/tools/bugpoint/CrashDebugger.cpp llvm/trunk/tools/bugpoint/ExtractFunction.cpp llvm/trunk/tools/bugpoint/FindBugs.cpp llvm/trunk/tools/bugpoint/Miscompilation.cpp llvm/trunk/tools/bugpoint/OptimizerDriver.cpp llvm/trunk/tools/bugpoint/bugpoint.cpp Modified: llvm/trunk/include/llvm/Pass.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Pass.h?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/include/llvm/Pass.h (original) +++ llvm/trunk/include/llvm/Pass.h Mon Jul 19 22:06:07 2010 @@ -41,7 +41,6 @@ class Function; class Module; class AnalysisUsage; -class StaticPassInfo; class PassInfo; class ImmutablePass; class PMStack; @@ -51,7 +50,7 @@ class StringRef; // AnalysisID - Use the PassInfo to identify a pass... -typedef const StaticPassInfo* AnalysisID; +typedef const PassInfo* AnalysisID; /// Different types of internal pass managers. External pass managers /// (PassManager and FunctionPassManager) are not represented here. @@ -105,7 +104,7 @@ /// getPassInfo - Return the PassInfo data structure that corresponds to this /// pass... If the pass has not been registered, this will return null. /// - const StaticPassInfo *getPassInfo() const; + const PassInfo *getPassInfo() const; /// print - Print out the internal state of the pass. This is called by /// Analyze to print out the contents of an analysis. Otherwise it is not @@ -160,7 +159,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *); + virtual void *getAdjustedAnalysisPointer(const PassInfo *); virtual ImmutablePass *getAsImmutablePass(); virtual PMDataManager *getAsPMDataManager(); @@ -172,17 +171,17 @@ virtual void dumpPassStructure(unsigned Offset = 0); template - static const StaticPassInfo *getClassPassInfo() { + static const PassInfo *getClassPassInfo() { return lookupPassInfo(intptr_t(&AnalysisClass::ID)); } // lookupPassInfo - Return the pass info object for the specified pass class, // or null if it is not known. - static const StaticPassInfo *lookupPassInfo(intptr_t TI); + static const PassInfo *lookupPassInfo(intptr_t TI); // lookupPassInfo - Return the pass info object for the pass with the given // argument string, or null if it is not known. - static const StaticPassInfo *lookupPassInfo(StringRef Arg); + static const PassInfo *lookupPassInfo(StringRef Arg); /// getAnalysisIfAvailable() - Subclasses use this function to /// get analysis information that might be around, for example to update it. @@ -214,10 +213,10 @@ AnalysisType &getAnalysis(Function &F); // Defined in PassAnalysisSupport.h template - AnalysisType &getAnalysisID(const StaticPassInfo *PI) const; + AnalysisType &getAnalysisID(const PassInfo *PI) const; template - AnalysisType &getAnalysisID(const StaticPassInfo *PI, Function &F); + AnalysisType &getAnalysisID(const PassInfo *PI, Function &F); }; Modified: llvm/trunk/include/llvm/PassAnalysisSupport.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassAnalysisSupport.h?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassAnalysisSupport.h (original) +++ llvm/trunk/include/llvm/PassAnalysisSupport.h Mon Jul 19 22:06:07 2010 @@ -86,7 +86,7 @@ // linked in. Be careful about spelling! // AnalysisUsage &addPreserved(StringRef Arg) { - const StaticPassInfo *PI = Pass::lookupPassInfo(Arg); + const PassInfo *PI = Pass::lookupPassInfo(Arg); // If the pass exists, preserve it. Otherwise silently do nothing. if (PI) Preserved.push_back(PI); return *this; @@ -130,7 +130,7 @@ inline PMDataManager &getPMDataManager() { return PM; } // Find pass that is implementing PI. - Pass *findImplPass(const StaticPassInfo *PI) { + Pass *findImplPass(const PassInfo *PI) { Pass *ResultPass = 0; for (unsigned i = 0; i < AnalysisImpls.size() ; ++i) { if (AnalysisImpls[i].first == PI) { @@ -142,10 +142,10 @@ } // Find pass that is implementing PI. Initialize pass for Function F. - Pass *findImplPass(Pass *P, const StaticPassInfo *PI, Function &F); + Pass *findImplPass(Pass *P, const PassInfo *PI, Function &F); - void addAnalysisImplsPair(const StaticPassInfo *PI, Pass *P) { - std::pair pir = std::make_pair(PI,P); + void addAnalysisImplsPair(const PassInfo *PI, Pass *P) { + std::pair pir = std::make_pair(PI,P); AnalysisImpls.push_back(pir); } @@ -160,7 +160,7 @@ // AnalysisImpls - This keeps track of which passes implements the interfaces // that are required by the current pass (to implement getAnalysis()). - std::vector > AnalysisImpls; + std::vector > AnalysisImpls; private: // PassManager that is used to resolve analysis info @@ -179,7 +179,7 @@ AnalysisType *Pass::getAnalysisIfAvailable() const { assert(Resolver && "Pass not resident in a PassManager object!"); - const StaticPassInfo *PI = getClassPassInfo(); + const PassInfo *PI = getClassPassInfo(); if (PI == 0) return 0; Pass *ResultPass = Resolver->getAnalysisIfAvailable(PI, true); @@ -203,7 +203,7 @@ } template -AnalysisType &Pass::getAnalysisID(const StaticPassInfo *PI) const { +AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { assert(PI && "getAnalysis for unregistered pass!"); assert(Resolver&&"Pass has not been inserted into a PassManager object!"); // PI *must* appear in AnalysisImpls. Because the number of passes used @@ -233,7 +233,7 @@ } template -AnalysisType &Pass::getAnalysisID(const StaticPassInfo *PI, Function &F) { +AnalysisType &Pass::getAnalysisID(const PassInfo *PI, Function &F) { assert(PI && "getAnalysis for unregistered pass!"); assert(Resolver && "Pass has not been inserted into a PassManager object!"); // PI *must* appear in AnalysisImpls. Because the number of passes used Modified: llvm/trunk/include/llvm/PassManagers.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassManagers.h?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassManagers.h (original) +++ llvm/trunk/include/llvm/PassManagers.h Mon Jul 19 22:06:07 2010 @@ -302,7 +302,7 @@ /// through getAnalysis interface. virtual void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass); - virtual Pass *getOnTheFlyPass(Pass *P, const StaticPassInfo *PI, Function &F); + virtual Pass *getOnTheFlyPass(Pass *P, const PassInfo *PI, Function &F); /// Initialize available analysis information. void initializeAnalysisInfo() { Modified: llvm/trunk/include/llvm/PassSupport.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassSupport.h (original) +++ llvm/trunk/include/llvm/PassSupport.h Mon Jul 19 22:06:07 2010 @@ -22,7 +22,6 @@ #define LLVM_PASS_SUPPORT_H #include "Pass.h" -#include "llvm/Config/config.h" namespace llvm { @@ -34,24 +33,45 @@ /// getPassInfo() method. These objects are set up by the RegisterPass<> /// template, defined below. /// - -struct StaticPassInfo { +class PassInfo { +public: typedef Pass* (*NormalCtor_t)(); struct InterfaceInfo { - const StaticPassInfo *interface; + const PassInfo *interface; const InterfaceInfo *next; }; - const char *PassName; // Nice name for Pass - const char *PassArgument; // Command Line argument to run this pass - intptr_t PassID; - bool IsCFGOnlyPass; // Pass only looks at the CFG. - bool IsAnalysis; // True if an analysis pass. - bool IsAnalysisGroup; // True if an analysis group. - InterfaceInfo *ItfImpl;// Interfaces implemented by this pass +private: + const char *const PassName; // Nice name for Pass + const char *const PassArgument; // Command Line argument to run this pass + const intptr_t PassID; + const bool IsCFGOnlyPass; // Pass only looks at the CFG. + const bool IsAnalysis; // True if an analysis pass. + const bool IsAnalysisGroup; // True if an analysis group. + const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass NormalCtor_t NormalCtor; - + +public: + /// PassInfo ctor - Do not call this directly, this should only be invoked + /// through RegisterPass. + PassInfo(const char *name, const char *arg, intptr_t pi, + NormalCtor_t normal = 0, + bool isCFGOnly = false, bool is_analysis = false) + : PassName(name), PassArgument(arg), PassID(pi), + IsCFGOnlyPass(isCFGOnly), + IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal) { + registerPass(); + } + /// PassInfo ctor - Do not call this directly, this should only be invoked + /// through RegisterPass. This version is for use by analysis groups; it + /// does not auto-register the pass. + PassInfo(const char *name, intptr_t pi) + : PassName(name), PassArgument(""), PassID(pi), + IsCFGOnlyPass(false), + IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0) { + } + /// getPassName - Return the friendly name for the pass, never returns null /// const char *getPassName() const { return PassName; } @@ -70,7 +90,7 @@ bool isPassID(void *IDPtr) const { return PassID == (intptr_t)IDPtr; } - + /// isAnalysisGroup - Return true if this is an analysis group, not a normal /// pass. /// @@ -80,7 +100,7 @@ /// isCFGOnlyPass - return true if this pass only looks at the CFG for the /// function. bool isCFGOnlyPass() const { return IsCFGOnlyPass; } - + /// getNormalCtor - Return a pointer to a function, that when called, creates /// an instance of the pass and returns it. This pointer may be null if there /// is no default constructor for the pass. @@ -92,11 +112,14 @@ NormalCtor = Ctor; } + /// createPass() - Use this method to create an instance of this pass. + Pass *createPass() const; + /// addInterfaceImplemented - This method is called when this pass is /// registered as a member of an analysis group with the RegisterAnalysisGroup /// template. /// - void addInterfaceImplemented(const StaticPassInfo *ItfPI) { + void addInterfaceImplemented(const PassInfo *ItfPI) { InterfaceInfo *NewInfo = new InterfaceInfo(); NewInfo->interface = ItfPI; NewInfo->next = ItfImpl; @@ -110,39 +133,6 @@ return ItfImpl; } - /// createPass() - Use this method to create an instance of this pass. - Pass *createPass() const; -}; - -class PassInfo : public StaticPassInfo { -public: - /// PassInfo ctor - Do not call this directly, this should only be invoked - /// through RegisterPass. - PassInfo(const char *name, const char *arg, intptr_t pi, - NormalCtor_t normal = 0, - bool isCFGOnly = false, bool is_analysis = false) { - this->PassName = name; - this->PassArgument = arg; - this->PassID = pi; - this->IsCFGOnlyPass = isCFGOnly; - this->IsAnalysis = is_analysis; - this->IsAnalysisGroup = false; - this->NormalCtor = normal; - registerPass(); - } - /// PassInfo ctor - Do not call this directly, this should only be invoked - /// through RegisterPass. This version is for use by analysis groups; it - /// does not auto-register the pass. - PassInfo(const char *name, intptr_t pi) { - this->PassName = name; - this->PassArgument = ""; - this->PassID = pi; - this->IsCFGOnlyPass = false; - this->IsAnalysis = false; - this->IsAnalysisGroup = true; - this->NormalCtor = 0; - } - protected: void registerPass(); void unregisterPass(); @@ -250,7 +240,7 @@ /// Callback functions - These functions are invoked whenever a pass is loaded /// or removed from the current executable. /// - virtual void passRegistered(const StaticPassInfo *) {} + virtual void passRegistered(const PassInfo *) {} /// enumeratePasses - Iterate over the registered passes, calling the /// passEnumerate callback on each PassInfo object. @@ -260,7 +250,7 @@ /// passEnumerate - Callback function invoked when someone calls /// enumeratePasses on this PassRegistrationListener object. /// - virtual void passEnumerate(const StaticPassInfo *) {} + virtual void passEnumerate(const PassInfo *) {} }; Modified: llvm/trunk/include/llvm/Support/PassNameParser.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PassNameParser.h?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PassNameParser.h (original) +++ llvm/trunk/include/llvm/Support/PassNameParser.h Mon Jul 19 22:06:07 2010 @@ -55,11 +55,9 @@ // ignorablePassImpl - Can be overriden in subclasses to refine the list of // which passes we want to include. // - virtual bool ignorablePassImpl(const StaticPassInfo *P) const { - return false; - } + virtual bool ignorablePassImpl(const PassInfo *P) const { return false; } - inline bool ignorablePass(const StaticPassInfo *P) const { + inline bool ignorablePass(const PassInfo *P) const { // Ignore non-selectable and non-constructible passes! Ignore // non-optimizations. return P->getPassArgument() == 0 || *P->getPassArgument() == 0 || @@ -68,7 +66,7 @@ // Implement the PassRegistrationListener callbacks used to populate our map // - virtual void passRegistered(const StaticPassInfo *P) { + virtual void passRegistered(const PassInfo *P) { if (ignorablePass(P) || !Opt) return; if (findOption(P->getPassArgument()) != getNumOptions()) { errs() << "Two passes with the same argument (-" @@ -77,7 +75,7 @@ } addLiteralOption(P->getPassArgument(), P, P->getPassName()); } - virtual void passEnumerate(const StaticPassInfo *P) { passRegistered(P); } + virtual void passEnumerate(const PassInfo *P) { passRegistered(P); } // ValLessThan - Provide a sorting comparator for Values elements... typedef std::pairisPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/AliasDebugger.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasDebugger.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/AliasDebugger.cpp (original) +++ llvm/trunk/lib/Analysis/AliasDebugger.cpp Mon Jul 19 22:06:07 2010 @@ -83,7 +83,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Mon Jul 19 22:06:07 2010 @@ -172,7 +172,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; @@ -243,7 +243,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/IPA/CallGraph.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/CallGraph.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IPA/CallGraph.cpp (original) +++ llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Mon Jul 19 22:06:07 2010 @@ -86,7 +86,7 @@ /// an analysis interface through multiple inheritance. If needed, it should /// override this to adjust the this pointer as needed for the specified pass /// info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&CallGraph::ID)) return (CallGraph*)this; return this; Modified: llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp (original) +++ llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp Mon Jul 19 22:06:07 2010 @@ -149,7 +149,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp (original) +++ llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp Mon Jul 19 22:06:07 2010 @@ -59,7 +59,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&ProfileInfo::ID)) return (ProfileInfo*)this; return this; Modified: llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp (original) +++ llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp Mon Jul 19 22:06:07 2010 @@ -67,7 +67,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&ProfileInfo::ID)) return (ProfileInfo*)this; return this; Modified: llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp Mon Jul 19 22:06:07 2010 @@ -40,7 +40,7 @@ /// an analysis interface through multiple inheritance. If needed, it /// should override this to adjust the this pointer as needed for the /// specified pass info. - virtual void *getAdjustedAnalysisPointer(const StaticPassInfo *PI) { + virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { if (PI->isPassID(&AliasAnalysis::ID)) return (AliasAnalysis*)this; return this; Modified: llvm/trunk/lib/VMCore/Pass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Pass.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Pass.cpp (original) +++ llvm/trunk/lib/VMCore/Pass.cpp Mon Jul 19 22:06:07 2010 @@ -75,7 +75,7 @@ /// Registration templates, but can be overloaded directly. /// const char *Pass::getPassName() const { - if (const StaticPassInfo *PI = getPassInfo()) + if (const PassInfo *PI = getPassInfo()) return PI->getPassName(); return "Unnamed pass: implement Pass::getPassName()"; } @@ -101,7 +101,7 @@ // By default, don't do anything. } -void *Pass::getAdjustedAnalysisPointer(const StaticPassInfo *) { +void *Pass::getAdjustedAnalysisPointer(const PassInfo *) { return this; } @@ -243,35 +243,35 @@ /// PassInfoMap - Keep track of the passinfo object for each registered llvm /// pass. - typedef std::map MapType; + typedef std::map MapType; MapType PassInfoMap; - typedef StringMap StringMapType; + typedef StringMap StringMapType; StringMapType PassInfoStringMap; /// AnalysisGroupInfo - Keep track of information for each analysis group. struct AnalysisGroupInfo { - std::set Implementations; + std::set Implementations; }; /// AnalysisGroupInfoMap - Information for each analysis group. - std::map AnalysisGroupInfoMap; + std::map AnalysisGroupInfoMap; public: - const StaticPassInfo *GetPassInfo(intptr_t TI) const { + const PassInfo *GetPassInfo(intptr_t TI) const { sys::SmartScopedLock Guard(Lock); MapType::const_iterator I = PassInfoMap.find(TI); return I != PassInfoMap.end() ? I->second : 0; } - const StaticPassInfo *GetPassInfo(StringRef Arg) const { + const PassInfo *GetPassInfo(StringRef Arg) const { sys::SmartScopedLock Guard(Lock); StringMapType::const_iterator I = PassInfoStringMap.find(Arg); return I != PassInfoStringMap.end() ? I->second : 0; } - void RegisterPass(const StaticPassInfo &PI) { + void RegisterPass(const PassInfo &PI) { sys::SmartScopedLock Guard(Lock); bool Inserted = PassInfoMap.insert(std::make_pair(PI.getTypeInfo(),&PI)).second; @@ -279,7 +279,7 @@ PassInfoStringMap[PI.getPassArgument()] = &PI; } - void UnregisterPass(const StaticPassInfo &PI) { + void UnregisterPass(const PassInfo &PI) { sys::SmartScopedLock Guard(Lock); MapType::iterator I = PassInfoMap.find(PI.getTypeInfo()); assert(I != PassInfoMap.end() && "Pass registered but not in map!"); @@ -298,8 +298,8 @@ /// Analysis Group Mechanisms. - void RegisterAnalysisGroup(StaticPassInfo *InterfaceInfo, - const StaticPassInfo *ImplementationInfo, + void RegisterAnalysisGroup(PassInfo *InterfaceInfo, + const PassInfo *ImplementationInfo, bool isDefault) { sys::SmartScopedLock Guard(Lock); AnalysisGroupInfo &AGI = AnalysisGroupInfoMap[InterfaceInfo]; @@ -363,15 +363,15 @@ // getPassInfo - Return the PassInfo data structure that corresponds to this // pass... -const StaticPassInfo *Pass::getPassInfo() const { +const PassInfo *Pass::getPassInfo() const { return lookupPassInfo(PassID); } -const StaticPassInfo *Pass::lookupPassInfo(intptr_t TI) { +const PassInfo *Pass::lookupPassInfo(intptr_t TI) { return getPassRegistrar()->GetPassInfo(TI); } -const StaticPassInfo *Pass::lookupPassInfo(StringRef Arg) { +const PassInfo *Pass::lookupPassInfo(StringRef Arg) { return getPassRegistrar()->GetPassInfo(Arg); } @@ -390,7 +390,7 @@ getPassRegistrar()->UnregisterPass(*this); } -Pass *StaticPassInfo::createPass() const { +Pass *PassInfo::createPass() const { assert((!isAnalysisGroup() || NormalCtor) && "No default implementation found for analysis group!"); assert(NormalCtor && @@ -408,8 +408,8 @@ intptr_t PassID, bool isDefault) : PassInfo(Name, InterfaceID) { - StaticPassInfo *InterfaceInfo = - const_cast(Pass::lookupPassInfo(InterfaceID)); + PassInfo *InterfaceInfo = + const_cast(Pass::lookupPassInfo(InterfaceID)); if (InterfaceInfo == 0) { // First reference to Interface, register it now. registerPass(); @@ -419,13 +419,13 @@ "Trying to join an analysis group that is a normal pass!"); if (PassID) { - const StaticPassInfo *ImplementationInfo = Pass::lookupPassInfo(PassID); + const PassInfo *ImplementationInfo = Pass::lookupPassInfo(PassID); assert(ImplementationInfo && "Must register pass before adding to AnalysisGroup!"); // Make sure we keep track of the fact that the implementation implements // the interface. - StaticPassInfo *IIPI = const_cast(ImplementationInfo); + PassInfo *IIPI = const_cast(ImplementationInfo); IIPI->addInterfaceImplemented(InterfaceInfo); getPassRegistrar()->RegisterAnalysisGroup(InterfaceInfo, IIPI, isDefault); @@ -479,7 +479,7 @@ VectorType &CFGOnlyList; GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {} - void passEnumerate(const StaticPassInfo *P) { + void passEnumerate(const PassInfo *P) { if (P->isCFGOnlyPass()) CFGOnlyList.push_back(P); } Modified: llvm/trunk/lib/VMCore/PassManager.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/PassManager.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/PassManager.cpp (original) +++ llvm/trunk/lib/VMCore/PassManager.cpp Mon Jul 19 22:06:07 2010 @@ -332,8 +332,7 @@ /// Return function pass corresponding to PassInfo PI, that is /// required by module pass MP. Instantiate analysis pass, by using /// its runOnFunction() for function F. - virtual Pass* getOnTheFlyPass(Pass *MP, const StaticPassInfo *PI, - Function &F); + virtual Pass* getOnTheFlyPass(Pass *MP, const PassInfo *PI, Function &F); virtual const char *getPassName() const { return "Module Pass Manager"; @@ -633,7 +632,7 @@ for (SmallVector::iterator I = ImmutablePasses.begin(), E = ImmutablePasses.end(); P == NULL && I != E; ++I) { - const StaticPassInfo *PI = (*I)->getPassInfo(); + const PassInfo *PI = (*I)->getPassInfo(); if (PI == AID) P = *I; @@ -729,7 +728,7 @@ /// Augement AvailableAnalysis by adding analysis made available by pass P. void PMDataManager::recordAvailableAnalysis(Pass *P) { - const StaticPassInfo *PI = P->getPassInfo(); + const PassInfo *PI = P->getPassInfo(); if (PI == 0) return; AvailableAnalysis[PI] = P; @@ -868,7 +867,7 @@ P->releaseMemory(); } - if (const StaticPassInfo *PI = P->getPassInfo()) { + if (const PassInfo *PI = P->getPassInfo()) { // Remove the pass itself (if it is not already removed). AvailableAnalysis.erase(PI); @@ -1052,7 +1051,7 @@ if (PMDataManager *PMD = (*I)->getAsPMDataManager()) PMD->dumpPassArguments(); else - if (const StaticPassInfo *PI = (*I)->getPassInfo()) + if (const PassInfo *PI = (*I)->getPassInfo()) if (!PI->isAnalysisGroup()) dbgs() << " -" << PI->getPassArgument(); } @@ -1155,8 +1154,7 @@ llvm_unreachable("Unable to schedule pass"); } -Pass *PMDataManager::getOnTheFlyPass(Pass *P, const StaticPassInfo *PI, - Function &F) { +Pass *PMDataManager::getOnTheFlyPass(Pass *P, const PassInfo *PI, Function &F) { assert(0 && "Unable to find on the fly pass"); return NULL; } @@ -1175,7 +1173,7 @@ return PM.findAnalysisPass(ID, dir); } -Pass *AnalysisResolver::findImplPass(Pass *P, const StaticPassInfo *AnalysisPI, +Pass *AnalysisResolver::findImplPass(Pass *P, const PassInfo *AnalysisPI, Function &F) { return PM.getOnTheFlyPass(P, AnalysisPI, F); } @@ -1570,8 +1568,7 @@ /// Return function pass corresponding to PassInfo PI, that is /// required by module pass MP. Instantiate analysis pass, by using /// its runOnFunction() for function F. -Pass* MPPassManager::getOnTheFlyPass(Pass *MP, const StaticPassInfo *PI, - Function &F){ +Pass* MPPassManager::getOnTheFlyPass(Pass *MP, const PassInfo *PI, Function &F){ FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP]; assert(FPP && "Unable to find on the fly pass"); Modified: llvm/trunk/tools/bugpoint/BugDriver.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/BugDriver.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/BugDriver.cpp (original) +++ llvm/trunk/tools/bugpoint/BugDriver.cpp Mon Jul 19 22:06:07 2010 @@ -56,8 +56,7 @@ /// getPassesString - Turn a list of passes into a string which indicates the /// command line options that must be passed to add the passes. /// -std::string -llvm::getPassesString(const std::vector &Passes) { +std::string llvm::getPassesString(const std::vector &Passes) { std::string Result; for (unsigned i = 0, e = Passes.size(); i != e; ++i) { if (i) Result += " "; Modified: llvm/trunk/tools/bugpoint/BugDriver.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/BugDriver.h?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/BugDriver.h (original) +++ llvm/trunk/tools/bugpoint/BugDriver.h Mon Jul 19 22:06:07 2010 @@ -23,7 +23,7 @@ namespace llvm { class Value; -class StaticPassInfo; +class PassInfo; class Module; class GlobalVariable; class Function; @@ -47,7 +47,7 @@ const char *ToolName; // argv[0] of bugpoint std::string ReferenceOutputFile; // Name of `good' output file Module *Program; // The raw program, linked together - std::vector PassesToRun; + std::vector PassesToRun; AbstractInterpreter *Interpreter; // How to run the program AbstractInterpreter *SafeInterpreter; // To generate reference output, etc. GCC *gcc; @@ -77,10 +77,10 @@ bool addSources(const std::vector &FileNames); template void addPasses(It I, It E) { PassesToRun.insert(PassesToRun.end(), I, E); } - void setPassesToRun(const std::vector &PTR) { + void setPassesToRun(const std::vector &PTR) { PassesToRun = PTR; } - const std::vector &getPassesToRun() const { + const std::vector &getPassesToRun() const { return PassesToRun; } @@ -112,7 +112,7 @@ /// ReferenceOutput contains the filename of the file containing the output we /// are to match. /// - bool debugPassMiscompilation(const StaticPassInfo *ThePass, + bool debugPassMiscompilation(const PassInfo *ThePass, const std::string &ReferenceOutput); /// compileSharedObject - This method creates a SharedObject from a given @@ -243,8 +243,7 @@ /// failure. If AutoDebugCrashes is set to true, then bugpoint will /// automatically attempt to track down a crashing pass if one exists, and /// this method will never return null. - Module *runPassesOn(Module *M, - const std::vector &Passes, + Module *runPassesOn(Module *M, const std::vector &Passes, bool AutoDebugCrashes = false, unsigned NumExtraArgs = 0, const char * const *ExtraArgs = NULL); @@ -257,7 +256,7 @@ /// or failed, unless Quiet is set. ExtraArgs specifies additional arguments /// to pass to the child bugpoint instance. /// - bool runPasses(const std::vector &PassesToRun, + bool runPasses(const std::vector &PassesToRun, std::string &OutputFilename, bool DeleteOutput = false, bool Quiet = false, unsigned NumExtraArgs = 0, const char * const *ExtraArgs = NULL) const; @@ -269,7 +268,7 @@ /// If the passes did not compile correctly, output the command required to /// recreate the failure. This returns true if a compiler error is found. /// - bool runManyPasses(const std::vector &AllPasses, + bool runManyPasses(const std::vector &AllPasses, std::string &ErrMsg); /// writeProgramToFile - This writes the current "Program" to the named @@ -282,14 +281,14 @@ /// false indicating whether or not the optimizer crashed on the specified /// input (true = crashed). /// - bool runPasses(const std::vector &PassesToRun, + bool runPasses(const std::vector &PassesToRun, bool DeleteOutput = true) const { std::string Filename; return runPasses(PassesToRun, Filename, DeleteOutput); } /// runAsChild - The actual "runPasses" guts that runs in a child process. - int runPassesAsChild(const std::vector &PassesToRun); + int runPassesAsChild(const std::vector &PassesToRun); /// initializeExecutionEnvironment - This method is used to set up the /// environment for executing LLVM programs. @@ -307,7 +306,7 @@ /// getPassesString - Turn a list of passes into a string which indicates the /// command line options that must be passed to add the passes. /// -std::string getPassesString(const std::vector &Passes); +std::string getPassesString(const std::vector &Passes); /// PrintFunctionList - prints out list of problematic functions /// Modified: llvm/trunk/tools/bugpoint/CrashDebugger.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/CrashDebugger.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/CrashDebugger.cpp (original) +++ llvm/trunk/tools/bugpoint/CrashDebugger.cpp Mon Jul 19 22:06:07 2010 @@ -43,7 +43,7 @@ } namespace llvm { - class ReducePassList : public ListReducer { + class ReducePassList : public ListReducer { BugDriver &BD; public: ReducePassList(BugDriver &bd) : BD(bd) {} @@ -52,15 +52,15 @@ // running the "Kept" passes fail when run on the output of the "removed" // passes. If we return true, we update the current module of bugpoint. // - virtual TestResult doTest(std::vector &Removed, - std::vector &Kept, + virtual TestResult doTest(std::vector &Removed, + std::vector &Kept, std::string &Error); }; } ReducePassList::TestResult -ReducePassList::doTest(std::vector &Prefix, - std::vector &Suffix, +ReducePassList::doTest(std::vector &Prefix, + std::vector &Suffix, std::string &Error) { sys::Path PrefixOutput; Module *OrigProgram = 0; Modified: llvm/trunk/tools/bugpoint/ExtractFunction.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ExtractFunction.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/ExtractFunction.cpp (original) +++ llvm/trunk/tools/bugpoint/ExtractFunction.cpp Mon Jul 19 22:06:07 2010 @@ -99,8 +99,8 @@ return Result; } -static const StaticPassInfo *getPI(Pass *P) { - const StaticPassInfo *PI = P->getPassInfo(); +static const PassInfo *getPI(Pass *P) { + const PassInfo *PI = P->getPassInfo(); delete P; return PI; } @@ -114,7 +114,7 @@ for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) I->setLinkage(GlobalValue::ExternalLinkage); - std::vector CleanupPasses; + std::vector CleanupPasses; CleanupPasses.push_back(getPI(createGlobalDCEPass())); if (MayModifySemantics) @@ -138,7 +138,7 @@ /// function. This returns null if there are no extractable loops in the /// program or if the loop extractor crashes. Module *BugDriver::ExtractLoop(Module *M) { - std::vector LoopExtractPasses; + std::vector LoopExtractPasses; LoopExtractPasses.push_back(getPI(createSingleLoopExtractorPass())); Module *NewM = runPassesOn(M, LoopExtractPasses); @@ -359,7 +359,7 @@ std::string uniqueFN = "--extract-blocks-file=" + uniqueFilename.str(); const char *ExtraArg = uniqueFN.c_str(); - std::vector PI; + std::vector PI; std::vector EmptyBBs; // This parameter is ignored. PI.push_back(getPI(createBlockExtractorPass(EmptyBBs))); Module *Ret = runPassesOn(M, PI, false, 1, &ExtraArg); Modified: llvm/trunk/tools/bugpoint/FindBugs.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/FindBugs.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/FindBugs.cpp (original) +++ llvm/trunk/tools/bugpoint/FindBugs.cpp Mon Jul 19 22:06:07 2010 @@ -29,8 +29,7 @@ /// If the passes did not compile correctly, output the command required to /// recreate the failure. This returns true if a compiler error is found. /// -bool -BugDriver::runManyPasses(const std::vector &AllPasses, +bool BugDriver::runManyPasses(const std::vector &AllPasses, std::string &ErrMsg) { setPassesToRun(AllPasses); outs() << "Starting bug finding procedure...\n\n"; Modified: llvm/trunk/tools/bugpoint/Miscompilation.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/Miscompilation.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/Miscompilation.cpp (original) +++ llvm/trunk/tools/bugpoint/Miscompilation.cpp Mon Jul 19 22:06:07 2010 @@ -43,13 +43,13 @@ cl::desc("Don't extract blocks when searching for miscompilations"), cl::init(false)); - class ReduceMiscompilingPasses : public ListReducer { + class ReduceMiscompilingPasses : public ListReducer { BugDriver &BD; public: ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {} - virtual TestResult doTest(std::vector &Prefix, - std::vector &Suffix, + virtual TestResult doTest(std::vector &Prefix, + std::vector &Suffix, std::string &Error); }; } @@ -58,8 +58,8 @@ /// group, see if they still break the program. /// ReduceMiscompilingPasses::TestResult -ReduceMiscompilingPasses::doTest(std::vector &Prefix, - std::vector &Suffix, +ReduceMiscompilingPasses::doTest(std::vector &Prefix, + std::vector &Suffix, std::string &Error) { // First, run the program with just the Suffix passes. If it is still broken // with JUST the kept passes, discard the prefix passes. Modified: llvm/trunk/tools/bugpoint/OptimizerDriver.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/OptimizerDriver.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/OptimizerDriver.cpp (original) +++ llvm/trunk/tools/bugpoint/OptimizerDriver.cpp Mon Jul 19 22:06:07 2010 @@ -83,7 +83,7 @@ outs() << getPassesString(PassesToRun) << "\n"; } -int BugDriver::runPassesAsChild(const std::vector &Passes) { +int BugDriver::runPassesAsChild(const std::vector &Passes) { std::string ErrInfo; raw_fd_ostream OutFile(ChildOutput.c_str(), ErrInfo, raw_fd_ostream::F_Binary); @@ -124,7 +124,7 @@ /// outs() a single line message indicating whether compilation was successful /// or failed. /// -bool BugDriver::runPasses(const std::vector &Passes, +bool BugDriver::runPasses(const std::vector &Passes, std::string &OutputFilename, bool DeleteOutput, bool Quiet, unsigned NumExtraArgs, const char * const *ExtraArgs) const { @@ -178,7 +178,7 @@ pass_args.push_back( std::string("-load")); pass_args.push_back( PluginLoader::getPlugin(i)); } - for (std::vector::const_iterator I = Passes.begin(), + for (std::vector::const_iterator I = Passes.begin(), E = Passes.end(); I != E; ++I ) pass_args.push_back( std::string("-") + (*I)->getPassArgument() ); for (std::vector::const_iterator I = pass_args.begin(), @@ -235,7 +235,7 @@ /// module, returning the transformed module on success, or a null pointer on /// failure. Module *BugDriver::runPassesOn(Module *M, - const std::vector &Passes, + const std::vector &Passes, bool AutoDebugCrashes, unsigned NumExtraArgs, const char * const *ExtraArgs) { Module *OldProgram = swapProgramIn(M); Modified: llvm/trunk/tools/bugpoint/bugpoint.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/bugpoint.cpp?rev=108805&r1=108804&r2=108805&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/bugpoint.cpp (original) +++ llvm/trunk/tools/bugpoint/bugpoint.cpp Mon Jul 19 22:06:07 2010 @@ -61,7 +61,7 @@ // The AnalysesList is automatically populated with registered Passes by the // PassNameParser. // -static cl::list +static cl::list PassList(cl::desc("Passes available:"), cl::ZeroOrMore); static cl::opt @@ -90,7 +90,7 @@ AddToDriver(BugDriver &_D) : D(_D) {} virtual void add(Pass *P) { - const StaticPassInfo *PI = P->getPassInfo(); + const PassInfo *PI = P->getPassInfo(); D.addPasses(&PI, &PI + 1); } }; From nicholas at mxc.ca Mon Jul 19 23:10:15 2010 From: nicholas at mxc.ca (Nick Lewycky) Date: Mon, 19 Jul 2010 21:10:15 -0700 Subject: [llvm-commits] [poolalloc] r108710 - /poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll In-Reply-To: <20100719170512.AAE1A2A6C12C@llvm.org> References: <20100719170512.AAE1A2A6C12C@llvm.org> Message-ID: <4C4521A7.1010002@mxc.ca> Will Dietz wrote: > Author: wdietz2 > Date: Mon Jul 19 12:05:12 2010 > New Revision: 108710 > > URL: http://llvm.org/viewvc/llvm-project?rev=108710&view=rev > Log: > Added test that triggers the SCC Leader failing assertion. > This is bug #7630. This testcase is huge. Do you really need all those dead globals, functions and types? Please trim this down. Nick > Added: > poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll > > Added: poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll > URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll?rev=108710&view=auto > ============================================================================== > --- poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll (added) > +++ poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Mon Jul 19 12:05:12 2010 > @@ -0,0 +1,3553 @@ > +;RUN: dsaopt %s -dsa-eq -disable-output > +; ModuleID = 'bugpoint-reduced-simplified.bc' > +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" > +target triple = "x86_64-unknown-linux-gnu" > + > +%0 = type { %struct._IO_FILE*, %struct._IO_FILE*, [8192 x i8] } > +%struct.TypCollectors = type { i8*, void (%struct.TypHeader*, i64)*, i32 (i64*, %struct.TypHeader*)* } > +%struct.TypHeader = type { i64, %struct.TypHeader**, [3 x i8], i8 } > +%struct.TypInputFile = type { i64, [64 x i8], [256 x i8], i8*, i64 } > +%struct.TypOutputFile = type { i64, [256 x i8], i64, i64, i64, i64 } > +%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] } > +%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } > +%struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } > +%struct.__sigset_t = type { [16 x i64] } > +%struct.anon = type { i64, i64, [4 x i8] } > +%struct.termio = type { i16, i16, i16, i16, i8, [8 x i8] } > +%struct.tms = type { i64, i64, i64, i64 } > + > + at Collectors = external constant [6 x %struct.TypCollectors], align 32 ;<[6 x %struct.TypCollectors]*> [#uses=0] > + at CSeries = external global i64* ; [#uses=0] > + at Class = external global i16 ; [#uses=0] > + at CWeights = external global i64* ; [#uses=0] > + at ug = external global i16 ; [#uses=0] > + at cg = external global i16 ; [#uses=0] > + at g = external global i64* ; [#uses=0] > + at ce = external global i64 ; [#uses=0] > + at Commutators = external global %struct.TypHeader** ;<%struct.TypHeader***> [#uses=0] > + at GenStk = external global i16* ; [#uses=0] > + at ExpStk = external global i64* ; [#uses=0] > + at StrStk = external global i16** ; [#uses=0] > + at Sp = external global i64 ; [#uses=0] > + at StkDim = external global i64 ; [#uses=0] > + at ue = external global i64 ; [#uses=0] > + at LastClass = external global i16 ; [#uses=0] > + at Powers = external global %struct.TypHeader** ;<%struct.TypHeader***> [#uses=0] > + at NrGens = external global i64 ; [#uses=0] > + at Prime = external global i64 ; [#uses=0] > + at HdRnAvec = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str1 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str2 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str3 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str4 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str5 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str6 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str7 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str8 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str9 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str10 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str11 = external constant [62 x i8], align 8 ;<[62 x i8]*> [#uses=0] > + at .str12 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at HdCallOop2 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallOop1 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str13 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str14 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str15 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str16 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str17 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str18 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str19 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str20 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str21 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str22 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str23 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str24 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str25 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str26 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str27 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str28 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str29 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str30 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str31 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str32 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str33 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str34 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str35 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str36 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str37 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str38 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str39 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str40 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str41 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str42 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str43 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str44 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str45 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str46 = external constant [53 x i8], align 8 ;<[53 x i8]*> [#uses=0] > + at .str47 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str48 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str49 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str50 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str51 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str52 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str53 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str54 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str55 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str56 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str57 = external constant [51 x i8], align 8 ;<[51 x i8]*> [#uses=0] > + at .str58 = external constant [60 x i8], align 8 ;<[60 x i8]*> [#uses=0] > + at .str59 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str60 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str61 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str62 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str63 = external constant [57 x i8], align 8 ;<[57 x i8]*> [#uses=0] > + at .str64 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str65 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str166 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at HdRnSumAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str267 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at HdRnDifferenceAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str368 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at HdRnDepth = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str469 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at HdRnTailDepth = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str570 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at HdRnCentralWeight = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str671 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdRnLeadingExponent = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str772 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at HdRnReducedAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str873 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at HdRnRelativeOrder = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str974 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at HdRnExponentAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str1075 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdRnExponentsAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str1176 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at HdRnInformationAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str1277 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at HdRnIsCompatibleAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str1378 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at HdRnNormalizeIgs = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str1479 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at HdRnIsAgWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str1580 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str1681 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str1782 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str1883 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str1984 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str2085 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str2186 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str2287 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str2388 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str2489 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str2590 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str2691 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at HdCPL = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCPC = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCPS = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str2794 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str2895 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str2996 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str3097 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str3198 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str3299 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str33100 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str34101 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str35102 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str36103 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str37104 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str38105 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str39106 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str40107 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str41108 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at RepTimes = external global i64 ; [#uses=0] > + at .str42109 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str43110 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str44111 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str45112 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at CallsProdAg = external global i64 ; [#uses=0] > + at TimeProdAg = external global i64 ; [#uses=0] > + at .str46113 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str47114 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at CallsQuoAg = external global i64 ; [#uses=0] > + at TimeQuoAg = external global i64 ; [#uses=0] > + at .str48115 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsPowAgI = external global i64 ; [#uses=0] > + at TimePowAgI = external global i64 ; [#uses=0] > + at .str49116 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsPowAgAg = external global i64 ; [#uses=0] > + at TimePowAgAg = external global i64 ; [#uses=0] > + at .str50117 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsModAg = external global i64 ; [#uses=0] > + at TimeModAg = external global i64 ; [#uses=0] > + at .str51118 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsCommAg = external global i64 ; [#uses=0] > + at TimeCommAg = external global i64 ; [#uses=0] > + at .str52119 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsLtAg = external global i64 ; [#uses=0] > + at TimeLtAg = external global i64 ; [#uses=0] > + at .str53120 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsEqAg = external global i64 ; [#uses=0] > + at TimeEqAg = external global i64 ; [#uses=0] > + at .str54121 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsSumAg = external global i64 ; [#uses=0] > + at TimeSumAg = external global i64 ; [#uses=0] > + at .str55122 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at CallsDiffAg = external global i64 ; [#uses=0] > + at TimeDiffAg = external global i64 ; [#uses=0] > + at .str56123 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str57124 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str58125 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str59126 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str60127 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str61128 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str62129 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str63130 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str64131 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str65132 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str66 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str67 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str68 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str69 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str70 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at CPP.b = external global i1 ; [#uses=0] > + at .str71 = external constant [1 x i8], align 1 ;<[1 x i8]*> [#uses=0] > + at .str72 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at CPN = external global i64 ; [#uses=0] > + at .str73 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str74 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str75 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str76 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str77 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str78 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str79 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str80 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str81 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str82 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str83 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str84 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str87 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str89 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str91 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str93 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str94 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str95 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str96 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str97 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str98 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str99 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str100 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str101 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str102 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str103 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str104 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str105 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str106 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str107 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str108 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str109 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str110 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str111 = external constant [55 x i8], align 8 ;<[55 x i8]*> [#uses=0] > + at .str113 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str114 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str115 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str116 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str117 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str118 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str119 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str120 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str121 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str122 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str123 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str124 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str125 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str137 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str1138 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str2139 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str3140 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str4141 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str5142 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str6143 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str7144 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str8145 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str9146 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str10147 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str11148 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str12149 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str13150 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str14151 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str15152 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str16153 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str17154 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str18155 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str19156 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str20157 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str21158 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str22159 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str23160 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str24161 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str25162 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str26163 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str27164 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str28165 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str29166 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str30167 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str31168 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str32169 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str33170 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str34171 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str35172 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str36173 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str37174 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str38175 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str39176 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str40177 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str41178 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str179 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str1180 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str2181 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str3182 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str4183 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str5184 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str6185 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str7186 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str8187 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str9188 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str10189 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str11190 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str12191 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str13192 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str14193 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str15194 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str16195 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str17196 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str18197 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str19198 = external constant [51 x i8], align 8 ;<[51 x i8]*> [#uses=0] > + at .str20199 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str21200 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str22201 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str23202 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str24203 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str25204 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str26205 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str27206 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str28207 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at hdTable = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at treeType = external global i64 ; [#uses=0] > + at hdWordValue = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at hdTree2 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at treeWordLength = external global i64 ; [#uses=0] > + at wordList = external global [1024 x i64], align 32 ;<[1024 x i64]*> [#uses=0] > + at hdTabl2 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str208 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str1209 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str2210 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str3211 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str4212 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str5213 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str6214 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str7215 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str8216 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str9217 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str10218 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str11219 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str12220 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str13221 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str14222 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str15223 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str16224 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at hdExponent = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at hdTree1 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at hdTree = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str17225 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str18226 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str19227 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str20228 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str21229 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str22230 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str23231 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str24232 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str25233 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str26234 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str27235 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str28236 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str29237 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at hdRel = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str30238 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at hdNums = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str31239 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str32240 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str33241 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str34242 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at dedlst = external global i64 ; [#uses=0] > + at .str35243 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at dedfst = external global i64 ; [#uses=0] > + at dedgen = external global [40960 x i64], align 32 ;<[40960 x i64]*> [#uses=0] > + at dedcos = external global [40960 x i64], align 32 ;<[40960 x i64]*> [#uses=0] > + at dedprint.b = external global i1 ; [#uses=0] > + at .str36244 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at hdNext = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at hdPrev = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at lastDef = external global i64 ; [#uses=0] > + at firstDef = external global i64 ; [#uses=0] > + at hdFact = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at firstFree = external global i64 ; [#uses=0] > + at lastFree = external global i64 ; [#uses=0] > + at nrdel = external global i64 ; [#uses=0] > + at .str37245 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str38246 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at lastN.4480 = external global i64 ; [#uses=0] > + at phi.4481 = external global i64 ; [#uses=0] > + at isSqfree.4482.b = external global i1 ; [#uses=0] > + at nrp.4483 = external global i64 ; [#uses=0] > + at HdResult = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at CycLastE = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str247 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str1248 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str2249 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str3250 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str4251 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=1] > + at .str5252 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str6253 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str7254 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str8255 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str9256 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str10257 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str11258 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str12259 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str13260 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str14261 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str15262 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str16263 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str17264 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str18265 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str19266 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at CycLastN = external global i64 ; [#uses=0] > + at .str20267 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str21268 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str22269 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str23270 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str24271 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str25272 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str26273 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str27274 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str28275 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str29276 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str30277 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str31278 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at EvTab = external global [81 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ;<[81 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] > + at TabSum = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabDiff = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabProd = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabQuo = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabMod = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabPow = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at HdTrue = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdFalse = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at TabEq = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabLt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at PrTab = external global [81 x void (%struct.TypHeader*)*], align 32 ;<[81 x void (%struct.TypHeader*)*]*> [#uses=0] > + at .str292 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at TabComm = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at .str1294 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str2295 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at HdVoid = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str3297 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str4298 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str5299 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str6300 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str7301 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str8302 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=1] > + at .str9303 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str10304 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at HdTildePr = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str11305 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str12306 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str13307 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str14308 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str15309 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str16310 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str17311 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str18312 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str19313 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str20314 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str21315 = external constant [51 x i8], align 8 ;<[51 x i8]*> [#uses=0] > + at .str22316 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str23317 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str24318 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str25319 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str26320 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str27321 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str28322 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str29323 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str30324 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str31325 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str32326 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str33327 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str34328 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str35329 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str36330 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str37331 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str38332 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str40334 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str41335 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str42336 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str43337 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str44338 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str45339 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str46340 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str47341 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str48342 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str49343 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str50344 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str51345 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str52346 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str53347 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str54348 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str55349 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str56350 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str57351 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str58352 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str59353 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str60354 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at prPrec = external global i64 ; [#uses=0] > + at .str61355 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str62356 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str63357 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str64358 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str65359 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str66360 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str67361 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str68362 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str69363 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str70364 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str71365 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str72366 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str73367 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str74368 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str75369 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str76370 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str77371 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str78372 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str79373 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str81375 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str82376 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str83377 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str84378 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str85379 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str86380 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str87381 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str88382 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str89383 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str90384 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str91385 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str92386 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str93387 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str94388 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at HdReturn = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at Pols = external constant [186 x i64], align 32 ;<[186 x i64]*> [#uses=0] > + at HdFields = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdIntFFEs = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str396 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str1397 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str2398 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str3399 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str4400 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str5401 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str6402 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str7403 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str8404 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str9405 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str10406 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str11407 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str12408 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str13409 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at HdLastIntFFE = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str14410 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str15411 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str16412 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str17413 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str18414 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str19415 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str20416 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str21417 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str22418 = external constant [51 x i8], align 8 ;<[51 x i8]*> [#uses=0] > + at .str23419 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str24420 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str25421 = external constant [59 x i8], align 8 ;<[59 x i8]*> [#uses=0] > + at .str26422 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at .str27423 = external constant [59 x i8], align 8 ;<[59 x i8]*> [#uses=0] > + at .str28424 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at .str29425 = external constant [59 x i8], align 8 ;<[59 x i8]*> [#uses=0] > + at .str30426 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at .str31427 = external constant [59 x i8], align 8 ;<[59 x i8]*> [#uses=0] > + at .str32428 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at HdExec = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str431 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str1432 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str2433 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str3434 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at HdTimes = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str4435 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str5436 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str8439 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str11442 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str12443 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str13444 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str14445 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str15446 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at prFull.b = external global i1 ; [#uses=0] > + at .str16447 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str18449 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str19450 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str20451 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str22453 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str23454 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str24455 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str25456 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str26457 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str27458 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str28459 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str29460 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at IsProfiling = external global i64 ; [#uses=0] > + at .str30461 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str31462 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str32463 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str33464 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at Timesum = external global i64 ; [#uses=0] > + at .str34465 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str35466 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str36467 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str37468 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str39470 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str40471 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str42473 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str43474 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str477 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str1478 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str2479 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str3480 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str4481 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str5482 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str7484 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str8485 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at HdLast = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at ErrRet = external global [1 x %struct.__jmp_buf_tag], align 32 ;<[1 x %struct.__jmp_buf_tag]*> [#uses=0] > + at .str9486 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str10487 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at HdLast2 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str11488 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at HdLast3 = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str12489 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at HdTime = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str13490 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str14491 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str15492 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str16493 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str17494 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str18495 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str19496 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str20497 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str21498 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str22499 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str23500 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str24501 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str25502 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str26503 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str27504 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str28505 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str29506 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str30507 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str31508 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str32509 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str33510 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str34511 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str35512 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str36513 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str37514 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str38515 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str39516 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str40517 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str41518 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str42519 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str43520 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str44521 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str45522 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str46523 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str47524 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str48525 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str49526 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str50527 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str51528 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str52529 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str53530 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str54531 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at .str55532 = external constant [55 x i8], align 8 ;<[55 x i8]*> [#uses=0] > + at .str56533 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str57534 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str58535 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str59536 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str60537 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str61538 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str62539 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str63540 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str64541 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str65542 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str66543 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str67544 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str68545 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str69546 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str70547 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str71548 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str72549 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str73550 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str74551 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str75552 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str76553 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str77554 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str78555 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str79556 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str80557 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str81558 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str82559 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str83560 = external constant [54 x i8], align 8 ;<[54 x i8]*> [#uses=0] > + at .str84561 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str85562 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str86563 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str87564 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str88565 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str89566 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str90567 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str91568 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str93570 = external constant [55 x i8], align 8 ;<[55 x i8]*> [#uses=0] > + at .str94571 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str95572 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str96573 = external constant [54 x i8], align 8 ;<[54 x i8]*> [#uses=0] > + at .str97574 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str98575 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str99576 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str100577 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str101578 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str102579 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str103580 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str104581 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str105582 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str106583 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str107584 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str108585 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str109586 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str110587 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str111588 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str112589 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str113590 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str114591 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str115592 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str116593 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str117594 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str118595 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str119596 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str120597 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str121598 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str122599 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str124601 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str125602 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str126 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str127 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str128 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at NameType = external constant [81 x i8*], align 32 ;<[81 x i8*]*> [#uses=0] > + at Size = external global [81 x %struct.anon], align 32 ;<[81 x %struct.anon]*> [#uses=0] > + at HdNewHandles = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at NrNewHandles = external global i64 ; [#uses=0] > + at s.3831 = external global [7 x i8] ;<[7 x i8]*> [#uses=0] > + at HdFree = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str605 = external constant [55 x i8], align 8 ;<[55 x i8]*> [#uses=0] > + at FreeHandle = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at NrFreeHandles = external global i64 ; [#uses=0] > + at FirstBag = external global %struct.TypHeader** ;<%struct.TypHeader***> [#uses=0] > + at HdResize = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at IsResizeCall.b = external global i1 ; [#uses=0] > + at .str1606 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str2607 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str3608 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str4609 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str5610 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str6611 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str7612 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str8613 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str9614 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str10615 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str11616 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at lastType = external global i64 ; [#uses=0] > + at lastSize = external global i64 ; [#uses=0] > + at .str12617 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str13618 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str14619 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str15620 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str16621 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str17622 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str18623 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str19624 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str20625 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str21626 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str22627 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str23628 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str24629 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str25630 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str26631 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str28633 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str29634 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str30635 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str31636 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str32637 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str33638 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str34639 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str35640 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str36641 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str37642 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str38643 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str39644 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str40645 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str41646 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str42647 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str43648 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str44649 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str45650 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str46651 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str47652 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str54659 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str65670 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str66671 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str67672 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str68673 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str69674 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str70675 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str71676 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str72677 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str73678 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str74679 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str75680 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str76681 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str77682 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str78683 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str79684 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str80685 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str81686 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str82687 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str83688 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str84689 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str85690 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str86691 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str87692 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at GasmanStatAlive = external constant [81 x i64], align 32 ;<[81 x i64]*> [#uses=0] > + at GasmanStatTotal = external global [81 x i64], align 32 ;<[81 x i64]*> [#uses=0] > + at GasmanStatTSize = external global [81 x i64], align 32 ;<[81 x i64]*> [#uses=0] > + at HdStack = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at TopStack = external global i64 ; [#uses=0] > + at HdIdenttab = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=1] > + at HdRectab = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at NrRectab = external global i64 ; [#uses=0] > + at IsUndefinedGlobal.b = external global i1 ; [#uses=0] > + at NrIdenttab = external global i64 ; [#uses=0] > + at .str710 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str1711 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str2712 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str3713 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str4714 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str5715 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str6716 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str7717 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str8718 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str9719 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str10720 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str11721 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str12722 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at PrIntC = external global [1000 x i16], align 32 ;<[1000 x i16]*> [#uses=0] > + at PrIntD = external global [1205 x i16], align 32 ;<[1205 x i16]*> [#uses=0] > + at .str15725 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str16726 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str18728 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at TabIsList = external global [28 x i64], align 32 ;<[28 x i64]*> [#uses=0] > + at TabPlainList = external global [28 x void (%struct.TypHeader*)*], align 32 ;<[28 x void (%struct.TypHeader*)*]*> [#uses=0] > + at TabIsXTypeList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ;<[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] > + at TabLenList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ;<[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] > + at TabElmlList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] > + at TabElmrList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] > + at TabElmList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] > + at TabElmfList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] > + at TabElmsList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]*> [#uses=0] > + at TabAssList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64, %struct.TypHeader*)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64, %struct.TypHeader*)*]*> [#uses=0] > + at TabAsssList = external global [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]*> [#uses=0] > + at TabPosList = external global [28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64)*], align 32 ;<[28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64)*]*> [#uses=0] > + at TabIsDenseList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ;<[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] > + at TabIsPossList = external global [28 x i64 (%struct.TypHeader*)*], align 32 ;<[28 x i64 (%struct.TypHeader*)*]*> [#uses=0] > + at TabDepthVector = external global [28 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] > + at .str748 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str1749 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str2750 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str3751 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str4752 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str5753 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str6754 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str7755 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str8756 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str9757 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str10758 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str11759 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str12760 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str13761 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str14762 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str15763 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str16764 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str17765 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str18766 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str19767 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str20768 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str21769 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str22770 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str23771 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str24772 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str25773 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str26774 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str27775 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str28776 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str29777 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str30778 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str31779 = external constant [66 x i8], align 8 ;<[66 x i8]*> [#uses=0] > + at .str32780 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str33781 = external constant [62 x i8], align 8 ;<[62 x i8]*> [#uses=0] > + at .str34782 = external constant [72 x i8], align 8 ;<[72 x i8]*> [#uses=0] > + at .str35783 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str36784 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str37785 = external constant [63 x i8], align 8 ;<[63 x i8]*> [#uses=0] > + at .str38786 = external constant [65 x i8], align 8 ;<[65 x i8]*> [#uses=0] > + at .str39787 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str40788 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str41789 = external constant [61 x i8], align 8 ;<[61 x i8]*> [#uses=0] > + at .str42790 = external constant [55 x i8], align 8 ;<[55 x i8]*> [#uses=0] > + at .str43791 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str44792 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str45793 = external constant [69 x i8], align 8 ;<[69 x i8]*> [#uses=0] > + at .str46794 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str47795 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at .str49797 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str50798 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str51799 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str52800 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str53801 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str54802 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str55803 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str56804 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str57805 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str58806 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str59807 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str60808 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str61809 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str62810 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str63811 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str64812 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str68816 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str69817 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str70818 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str71819 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str72820 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str73821 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str74822 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str75823 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str76824 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str77825 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str78826 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str832 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str1833 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str2834 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str3835 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str4836 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str5837 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str6838 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str7839 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str8840 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str9841 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str10842 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str11843 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str12844 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str13845 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str14846 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str15847 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str16848 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str17849 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str18850 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str19851 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str20852 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str21853 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str22854 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str23855 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str24856 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str25857 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str26858 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str27859 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str28860 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str29861 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str30862 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str31863 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str32864 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str33865 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str34866 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str35867 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str36868 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str37869 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str38870 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str39871 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str40872 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str41873 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str42874 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str43875 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str44876 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str45877 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str46878 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str47879 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str48880 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str49881 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str50882 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str51883 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str52884 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str53885 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str54886 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str55887 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str56888 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str57889 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str58890 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str59891 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str60892 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str61893 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str62894 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str63895 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str64896 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str65897 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str66898 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str67899 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str68900 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str69901 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str70902 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str71903 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str72904 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str73905 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str74906 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str75907 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str76908 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str77909 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str78910 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str79911 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str80912 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str81913 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str82914 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str83915 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str84916 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str85917 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str86918 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str87919 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str88920 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str89921 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str92924 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str93925 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str94926 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str95927 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str96928 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str97929 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str98930 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str99931 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str100932 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str934 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str1935 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str2936 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str3937 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str4938 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str5939 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str6940 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str7941 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at HdPerm = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str8942 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str9943 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str10944 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str11945 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str12946 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str13947 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str14948 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str15949 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str16950 = external constant [55 x i8], align 8 ;<[55 x i8]*> [#uses=0] > + at .str17951 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str18952 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str19953 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str20954 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str21955 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str22956 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str23957 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str24958 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str25959 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str26960 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str27961 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str28962 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str29963 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str30964 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at .str31965 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str32966 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str33967 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str34968 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str35969 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str36970 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str37971 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str38972 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str39973 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str40974 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str41975 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str42976 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str44978 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str45979 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str48982 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str6992 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at TabNormalizeCoeffs = external global [28 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] > + at TabShrinkCoeffs = external global [28 x void (%struct.TypHeader*)*], align 32 ;<[28 x void (%struct.TypHeader*)*]*> [#uses=0] > + at TabShiftedCoeffs = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] > + at TabAddCoeffs = external global [28 x [28 x void (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x void (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabMultiplyCoeffs = external global [28 x [28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*, i64)*]], align 32 ;<[28 x [28 x i64 (%struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*, i64)*]]*> [#uses=0] > + at TabProductCoeffs = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabProductCoeffsMod = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabReduceCoeffs = external global [28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64)*]], align 32 ;<[28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64)*]]*> [#uses=0] > + at TabReduceCoeffsMod = external global [28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x i64 (%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*)*]]*> [#uses=0] > + at TabPowerModCoeffsInt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at TabPowerModCoeffsLInt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]], align 32 ;<[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] > + at .str995 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str1996 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str2997 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str3998 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str4999 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str51000 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str61001 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str71002 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str81003 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str91004 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str101005 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str111006 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str121007 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str131008 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str141009 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str151010 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str161011 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str171012 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str181013 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str191014 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str201015 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str211016 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str221017 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str231018 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str241019 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str251020 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str261021 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str271022 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str281023 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str1025 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str21027 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str31028 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str41029 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str51030 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str61031 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str81033 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str111036 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str121037 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str131038 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str141039 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str151040 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str1044 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str11045 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str21046 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str31047 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str41048 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str51049 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str61050 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str71051 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str81052 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str101054 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str121056 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str131057 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str11060 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at HdCurLHS = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str21061 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str31062 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str41063 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str61065 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str71066 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str81067 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str91068 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str101069 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str131072 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str141073 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str151074 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str161075 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str171076 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str181077 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str241083 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str251084 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str271086 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str281087 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at HdRnOp = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnEq = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallEq = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdStrEq = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdTilde = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str11093 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at HdRnSum = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallSum = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str31096 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdStrSum = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnDiff = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallDiff = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str51099 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdStrDiff = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnProd = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallProd = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str71102 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdStrProd = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnQuo = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallQuo = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str91105 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdStrQuo = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnMod = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallMod = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str111108 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at HdStrMod = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnPow = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallPow = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str131111 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdStrPow = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnComm = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallComm = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str151114 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at HdStrComm = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str171116 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdRnLt = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallLt = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str191119 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdStrLt = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnIn = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallIn = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str211122 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at HdStrIn = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdRnPrint = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdCallPrint = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str231125 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at HdStrPrint = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str241126 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str251127 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str261128 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str271129 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str281130 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str291131 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str301132 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str311133 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str321134 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str331135 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str341136 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str351137 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str361138 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str371139 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str421144 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str661168 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str671169 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str681170 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str691171 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str711173 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str721174 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str731175 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str741176 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str761178 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str771179 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str781180 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str791181 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at Logfile = external global i64 ; [#uses=0] > + at Input = external global %struct.TypInputFile* ;<%struct.TypInputFile**> [#uses=0] > + at TestInput = external global i64 ; [#uses=0] > + at In = external global i8* ; [#uses=0] > + at Symbol = external global i64 ; [#uses=0] > + at TestOutput = external global i64 ; [#uses=0] > + at TestLine = external global [256 x i8], align 32 ;<[256 x i8]*> [#uses=0] > + at InputLogfile = external global i64 ; [#uses=0] > + at InputFiles = external global [16 x %struct.TypInputFile], align 32 ;<[16 x %struct.TypInputFile]*> [#uses=0] > + at .str1187 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at Output = external global %struct.TypOutputFile* ;<%struct.TypOutputFile**> [#uses=0] > + at OutputFiles = external global [16 x %struct.TypOutputFile], align 32 ;<[16 x %struct.TypOutputFile]*> [#uses=0] > + at .str21189 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str41191 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str51192 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str61193 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str71194 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at NrError = external global i64 ; [#uses=0] > + at NrErrLine = external global i64 ; [#uses=0] > + at .str91198 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str101199 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str131202 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str141203 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str151204 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at Prompt = external global i8* ; [#uses=0] > + at .str161206 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at Value = external global [1024 x i8], align 32 ;<[1024 x i8]*> [#uses=0] > + at .str171208 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str181209 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str191210 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str201211 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str211212 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str431234 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str1250 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str11251 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str21252 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str31253 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str41254 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str51255 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str61256 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str71257 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str81258 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at HdUnion = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str111261 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str121262 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str131263 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str141264 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str151265 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str161266 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str171267 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str181268 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str191269 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str201270 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str211271 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str221272 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str231273 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str241274 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str251275 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str261276 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str271277 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str281278 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str291279 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str301280 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str311281 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str321282 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str331283 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str341284 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str351285 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at StrStat = external global i8* ; [#uses=0] > + at HdStat = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str11292 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str21293 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str41295 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str51296 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str61297 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str71298 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str81299 = external constant [12 x i8], align 1 ;<[12 x i8]*> [#uses=0] > + at .str91300 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str101301 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str111302 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str131304 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str151306 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str161307 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str171308 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str181309 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str191310 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str201311 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str211312 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str221313 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str231314 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str241315 = external constant [49 x i8], align 8 ;<[49 x i8]*> [#uses=0] > + at .str251316 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str281319 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str291320 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at HdChars = external global [256 x %struct.TypHeader*], align 32 ;<[256 x %struct.TypHeader*]*> [#uses=0] > + at .str1322 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str31326 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str41327 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str61329 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str71330 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str81331 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str91332 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str101333 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str111334 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str121335 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str131336 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str151338 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str161339 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str171340 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str181341 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str191342 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str201343 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str211344 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str221345 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at SyFlags = external global [13 x i8] ;<[13 x i8]*> [#uses=0] > + at syLastIntr = external global i64 ; [#uses=0] > + at syWorkspace = external global i8* ; [#uses=0] > + at stderr = external global %struct._IO_FILE* ;<%struct._IO_FILE**> [#uses=0] > + at .str1350 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at syStartTime = external global i64 ; [#uses=0] > + at .str11351 = external constant [52 x i8], align 8 ;<[52 x i8]*> [#uses=0] > + at syBuf = external global [16 x %0], align 32 ;<[16 x %0]*> [#uses=0] > + at syWindow.b = external global i1 ; [#uses=0] > + at syOld = external global %struct.termio, align 16 ;<%struct.termio*> [#uses=0] > + at .str21352 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at syFid = external global i64 ; [#uses=0] > + at .str31353 = external constant [51 x i8], align 8 ;<[51 x i8]*> [#uses=0] > + at .str41354 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str51355 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at stdin = external global %struct._IO_FILE* ;<%struct._IO_FILE**> [#uses=0] > + at stdout = external global %struct._IO_FILE* ;<%struct._IO_FILE**> [#uses=0] > + at .str121362 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str131363 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at SyBanner = external global i64 ; [#uses=0] > + at SyGasman = external global i64 ; [#uses=0] > + at .str141366 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at SyLibname = external global [256 x i8], align 32 ;<[256 x i8]*> [#uses=0] > + at .str161369 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at SyHelpname = external global [256 x i8], align 32 ;<[256 x i8]*> [#uses=0] > + at .str171370 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at SyMemory = external global i64 ; [#uses=0] > + at .str181372 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at syLineEdit = external global i64 ; [#uses=0] > + at SyQuiet = external global i64 ; [#uses=0] > + at .str191374 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at SyNrCols = external global i64 ; [#uses=0] > + at .str201376 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at SyNrRows = external global i64 ; [#uses=0] > + at syCTRD = external global i64 ; [#uses=0] > + at .str211378 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str231380 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str241381 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at SyInitfiles = external global [16 x [256 x i8]], align 32 ;<[16 x [256 x i8]]*> [#uses=0] > + at .str251383 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str261384 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str271385 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str281386 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str291387 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str301388 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str311389 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str321390 = external constant [56 x i8], align 8 ;<[56 x i8]*> [#uses=0] > + at .str331391 = external constant [53 x i8], align 8 ;<[53 x i8]*> [#uses=0] > + at .str341392 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str351393 = external constant [54 x i8], align 8 ;<[54 x i8]*> [#uses=0] > + at .str361394 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str371395 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str381396 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str391397 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at WinCmdBuffer = external global [8000 x i8], align 32 ;<[8000 x i8]*> [#uses=0] > + at .str401398 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at syNrchar = external global i64 ; [#uses=0] > + at syPrompt = external global [256 x i8], align 32 ;<[256 x i8]*> [#uses=0] > + at .str411399 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str421400 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str431401 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str441402 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str451403 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at syNew = external global %struct.termio, align 16 ;<%struct.termio*> [#uses=0] > + at syStopTime = external global i64 ; [#uses=0] > + at syHistory = external global [8192 x i8], align 32 ;<[8192 x i8]*> [#uses=0] > + at syCTRO = external global i32 ; [#uses=0] > + at yank.3948 = external global [512 x i8], align 32 ;<[512 x i8]*> [#uses=0] > + at syHi = external global i8* ; [#uses=0] > + at .str461404 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str471405 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str491407 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str501408 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str511409 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str521410 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at syLastIndex = external global i16 ; [#uses=0] > + at syLastTopics = external global [16 x [64 x i8]], align 32 ;<[16 x [64 x i8]]*> [#uses=0] > + at .str551413 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str561414 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str571415 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str581416 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str591417 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str601418 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str611419 = external constant [21 x i8], align 1 ;<[21 x i8]*> [#uses=0] > + at .str621420 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str631421 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + at .str641422 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str651423 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str661424 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str671425 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str681426 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str691427 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str701428 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str711429 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str721430 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str731431 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str741432 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str751433 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str761434 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str771435 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str781436 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str791437 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str801438 = external constant [3 x i8], align 1 ;<[3 x i8]*> [#uses=0] > + at .str811439 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str821440 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str831441 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str841442 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str851443 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str861444 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str871445 = external constant [27 x i8], align 1 ;<[27 x i8]*> [#uses=0] > + at .str881446 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str891447 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str901448 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str911449 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str921450 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str931451 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str941452 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str951453 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str961454 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str971455 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str981456 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str991457 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str1001458 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str1011459 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str1021460 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str1031461 = external constant [32 x i8], align 8 ;<[32 x i8]*> [#uses=0] > + at .str1041462 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str1051463 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str1061464 = external constant [67 x i8], align 8 ;<[67 x i8]*> [#uses=0] > + at .str1071465 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str1081466 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str1111469 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str1121470 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str1131471 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str1141472 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str1151473 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at syChapnames = external global [128 x [16 x i8]], align 32 ;<[128 x [16 x i8]]*> [#uses=0] > + at .str1161474 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str1171475 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str1181476 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str1191477 = external constant [5 x i8], align 1 ;<[5 x i8]*> [#uses=0] > + at .str1201478 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str1211479 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str1221480 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str1231481 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str1241482 = external constant [20 x i8], align 1 ;<[20 x i8]*> [#uses=0] > + at .str1251483 = external constant [71 x i8], align 8 ;<[71 x i8]*> [#uses=0] > + at .str1261484 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str1271485 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str1281486 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str129 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str130 = external constant [17 x i8], align 1 ;<[17 x i8]*> [#uses=0] > + at .str131 = external constant [2 x i8], align 1 ;<[2 x i8]*> [#uses=0] > + at .str132 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str1504 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str11505 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str21506 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str31507 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at .str41508 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str51509 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str61510 = external constant [14 x i8], align 1 ;<[14 x i8]*> [#uses=0] > + at .str71511 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str81512 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str91513 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str101514 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str111515 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str121516 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str131517 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str141518 = external constant [62 x i8], align 8 ;<[62 x i8]*> [#uses=0] > + at .str151519 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str161520 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str171521 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str181522 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str191523 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str201524 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str211525 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str221526 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str231527 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str241528 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str251529 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str261530 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str271531 = external constant [63 x i8], align 8 ;<[63 x i8]*> [#uses=0] > + at .str281532 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str291533 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str301534 = external constant [57 x i8], align 8 ;<[57 x i8]*> [#uses=0] > + at .str311535 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str321536 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str331537 = external constant [54 x i8], align 8 ;<[54 x i8]*> [#uses=0] > + at .str341538 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str351539 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str361540 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str371541 = external constant [63 x i8], align 8 ;<[63 x i8]*> [#uses=0] > + at .str381542 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str391543 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str401544 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str411545 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str421546 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str431547 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str441548 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str451549 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str461550 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str471551 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str1553 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str11554 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str21555 = external constant [26 x i8], align 1 ;<[26 x i8]*> [#uses=0] > + at .str31556 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str41557 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str51558 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at LargestUnknown = external global i64 ; [#uses=0] > + at .str61559 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str81561 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str91562 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at HdVecFFEL = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at HdVecFFER = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at TabIntVecFFE = external global [28 x %struct.TypHeader* (%struct.TypHeader*, i64)*], align 32 ;<[28 x %struct.TypHeader* (%struct.TypHeader*, i64)*]*> [#uses=0] > + at .str1564 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str11565 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str21566 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str31567 = external constant [10 x i8], align 1 ;<[10 x i8]*> [#uses=0] > + at .str41568 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str51569 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str61570 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str91573 = external constant [50 x i8], align 8 ;<[50 x i8]*> [#uses=0] > + at .str101574 = external constant [48 x i8], align 8 ;<[48 x i8]*> [#uses=0] > + at .str111575 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str121576 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str131577 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str141578 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str151579 = external constant [25 x i8], align 1 ;<[25 x i8]*> [#uses=0] > + at .str161580 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str171581 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str181582 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str191583 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str201584 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str211585 = external constant [33 x i8], align 8 ;<[33 x i8]*> [#uses=0] > + at .str241588 = external constant [43 x i8], align 8 ;<[43 x i8]*> [#uses=0] > + at .str261590 = external constant [9 x i8], align 1 ;<[9 x i8]*> [#uses=0] > + at .str281592 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str291593 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str301594 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str311595 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str321596 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str331597 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str341598 = external constant [44 x i8], align 8 ;<[44 x i8]*> [#uses=0] > + at .str351599 = external constant [46 x i8], align 8 ;<[46 x i8]*> [#uses=0] > + at .str361600 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str371601 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str381602 = external constant [65 x i8], align 8 ;<[65 x i8]*> [#uses=0] > + at .str391603 = external constant [22 x i8], align 1 ;<[22 x i8]*> [#uses=0] > + at .str401604 = external constant [63 x i8], align 8 ;<[63 x i8]*> [#uses=0] > + at .str1619 = external constant [18 x i8], align 1 ;<[18 x i8]*> [#uses=0] > + at .str11620 = external constant [19 x i8], align 1 ;<[19 x i8]*> [#uses=0] > + at .str21621 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str31622 = external constant [8 x i8], align 1 ;<[8 x i8]*> [#uses=0] > + at .str41623 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str51624 = external constant [13 x i8], align 1 ;<[13 x i8]*> [#uses=0] > + at .str61625 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str71626 = external constant [16 x i8], align 1 ;<[16 x i8]*> [#uses=0] > + at .str81627 = external constant [11 x i8], align 1 ;<[11 x i8]*> [#uses=0] > + at .str91628 = external constant [15 x i8], align 1 ;<[15 x i8]*> [#uses=0] > + at HdIdWord = external global %struct.TypHeader* ;<%struct.TypHeader**> [#uses=0] > + at .str101630 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str111631 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str121632 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str131633 = external constant [23 x i8], align 1 ;<[23 x i8]*> [#uses=0] > + at .str141634 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str151635 = external constant [47 x i8], align 8 ;<[47 x i8]*> [#uses=0] > + at .str161636 = external constant [35 x i8], align 8 ;<[35 x i8]*> [#uses=0] > + at .str171637 = external constant [39 x i8], align 8 ;<[39 x i8]*> [#uses=0] > + at .str181638 = external constant [30 x i8], align 1 ;<[30 x i8]*> [#uses=0] > + at .str191639 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str201640 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str211641 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str221642 = external constant [42 x i8], align 8 ;<[42 x i8]*> [#uses=0] > + at .str231643 = external constant [28 x i8], align 1 ;<[28 x i8]*> [#uses=0] > + at .str241644 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str251645 = external constant [24 x i8], align 1 ;<[24 x i8]*> [#uses=0] > + at .str261646 = external constant [45 x i8], align 8 ;<[45 x i8]*> [#uses=0] > + at .str271647 = external constant [53 x i8], align 8 ;<[53 x i8]*> [#uses=0] > + at .str281648 = external constant [38 x i8], align 8 ;<[38 x i8]*> [#uses=0] > + at .str291649 = external constant [36 x i8], align 8 ;<[36 x i8]*> [#uses=0] > + at .str301650 = external constant [29 x i8], align 1 ;<[29 x i8]*> [#uses=0] > + at .str311651 = external constant [31 x i8], align 8 ;<[31 x i8]*> [#uses=0] > + at .str341654 = external constant [40 x i8], align 8 ;<[40 x i8]*> [#uses=0] > + at .str351655 = external constant [37 x i8], align 8 ;<[37 x i8]*> [#uses=0] > + at .str361656 = external constant [41 x i8], align 8 ;<[41 x i8]*> [#uses=0] > + at .str371657 = external constant [34 x i8], align 8 ;<[34 x i8]*> [#uses=0] > + at .str401660 = external constant [6 x i8], align 1 ;<[6 x i8]*> [#uses=0] > + at .str421662 = external constant [7 x i8], align 1 ;<[7 x i8]*> [#uses=0] > + at .str431663 = external constant [4 x i8], align 1 ;<[4 x i8]*> [#uses=0] > + > +declare fastcc i32 @OrdinaryCollect() nounwind > + > +declare fastcc void @AddString2(i16* nocapture) nounwind > + > +declare i32 @AgCombinatorial2(i64*, %struct.TypHeader* nocapture) nounwind > + > +declare i32 @AgSingle(i64* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare i32 @AgTriple(i64* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare i32 @AgQuadruple(i64* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @SetAvecAgGroup(%struct.TypHeader* nocapture, i64, i64) nounwind > + > +declare fastcc void @SetGeneratorsAgGroup(%struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @AgWordAgExp(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @SaveAndClearCollector(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @BlankAgGroup() nounwind > + > +declare fastcc void @SetStacksAgGroup(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @EvalOopN(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader* nocapture, i8* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @EvalOop2(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*, i8* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @EvalOop(%struct.TypHeader*, %struct.TypHeader*, i8* nocapture) nounwind > + > +declare fastcc void @AddString(i16* nocapture, i64) nounwind > + > +declare fastcc void @AddGen() nounwind > + > +declare i32 @AgCombinatorial(i64*, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc i32 @SetCWeightsAgGroup(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare void @InitCombinatorial(%struct.TypHeader* nocapture, i64) nounwind > + > +declare void @InitSingle(%struct.TypHeader* nocapture, i64) nounwind > + > +declare fastcc void @Collect(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @InitTriple(%struct.TypHeader* nocapture, i64) nounwind > + > +declare void @InitQuadr(%struct.TypHeader* nocapture, i64) nounwind > + > +declare fastcc %struct.TypHeader* @AgSolution2(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader** nocapture, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @AgSolution(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EqAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EvAg(%struct.TypHeader*) nounwind readnone > + > +declare fastcc %struct.TypHeader* @IntExponentsAgWord(%struct.TypHeader* nocapture, i64, i64) nounwind > + > +declare %struct.TypHeader* @ProdAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModAg(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowAgI(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowAgAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CommAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunSumAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDifferenceAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDepthAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCentralWeightAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunExponentsAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunFactorAgGroup(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrAgen(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrAgList(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrAgExp(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAgProfile(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @TEqAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @TLtAg(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @TProdAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @TQuoAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @TModAg(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @TPowAgI(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @TPowAgAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @TCommAg(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunAgGroupRecord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDUMPLONG(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCollectorProfile(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsCompatibleAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunExponentAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunReducedAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunInformationAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunRelativeOrderAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLeadingExponentAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTailDepthAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNormalizeIgs(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @DifferenceAgWord(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @SumAgWord(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunFactorAgWord(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @FactorAgGroup(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @FunSetCollectorAgWord(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunAgFpGroup(%struct.TypHeader* nocapture) nounwind > + > +declare i64 @LenBlist(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfBlist(%struct.TypHeader* nocapture, i64) nounwind readonly > + > +declare i64 @PosBlist(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind readonly > + > +declare i64 @IsDenseBlist(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsPossBlist(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqBlist(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmBlist(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsBlist(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssBlist(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssBlist(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @PlainBlist(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunIsBlist(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunBlistList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunListBlist(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSizeBlist(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsSubsetBlist(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIntersectBlist(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunUniteBlist(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSubtractBlist(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc i64 @IsBlist(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunDistanceBlist(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @CVCM2V2(%struct.TypHeader*, %struct.TypHeader*, i64, i64, %struct.TypHeader*, i64, i64*, %struct.TypHeader*) nounwind > + > +declare fastcc void @CVCMFVF(%struct.TypHeader*, i64, %struct.TypHeader*, i64, i64, %struct.TypHeader*, i64, i64, i64*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunDistanceVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDistancesDistributionVecFFEsVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDistancesDistributionMatFFEVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCosetLeadersMatFFE(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc i64 @CLMF(%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*, %struct.TypHeader*, i64, i64, i64) nounwind > + > +declare fastcc i64 @CLM2(%struct.TypHeader*, i64, i64, %struct.TypHeader*, %struct.TypHeader*, i64, i64) nounwind > + > +declare fastcc %struct.TypHeader* @BlistsMatFF2(%struct.TypHeader*) nounwind > + > +declare fastcc void @DDMFVF(%struct.TypHeader*, i64, %struct.TypHeader*, %struct.TypHeader*, i64, i64, %struct.TypHeader*) nounwind > + > +declare fastcc void @DDM2V2(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare fastcc i64 @ConvVecFFE(%struct.TypHeader*, i64) nounwind > + > +declare fastcc i64 @ConvMatFFE(%struct.TypHeader*, i64) nounwind > + > +declare %struct.TypHeader* @FunAClosestVectorCombinationsMatFFEVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @CompressDeductionList() nounwind > + > +declare %struct.TypHeader* @FunStandardizeTable(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunStandardizeTable2(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunApplyRel(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunMakeConsequences(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunApplyRel2(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCopyRel(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunMakeCanonical(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTreeEntry(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunMakeConsequences2(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAddAbelianRelator(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc i64 @TreeEntryC() nounwind > + > +declare fastcc void @AddCosetFactor2(i64) nounwind > + > +declare fastcc void @HandleCoinc2(i64, i64, %struct.TypHeader*) nounwind > + > +declare fastcc void @HandleCoinc(i64, i64) nounwind > + > +declare fastcc void @ConvertToBase(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @EvCyc(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqCyc(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @LtCyc(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdCycI(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @Cyclotomic(%struct.TypHeader* nocapture, i64, i64) nounwind > + > +declare void @PrCyc(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowCyc(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsCyc(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsCycInt(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNofCyc(%struct.TypHeader* nocapture) nounwind > + > +define internal %struct.TypHeader* @FunCoeffsCyc(%struct.TypHeader* nocapture %hdCall) nounwind { > +entry: > + ret %struct.TypHeader* null > +} > + > +define internal %struct.TypHeader* @FunGaloisCyc(%struct.TypHeader* nocapture %hdCall) nounwind { > +entry: > + unreachable > +} > + > +declare %struct.TypHeader* @CantEval(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @Sum(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Diff(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Prod(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Quo(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Mod(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Pow(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Eq(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Lt(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Ne(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Le(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Gt(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @Ge(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @IsTrue(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @IsFalse(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EvBool(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqBool(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare %struct.TypHeader* @LtBool(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +define internal fastcc void @InitEval() nounwind { > +bb.nph49: > + br label %bb > + > +bb: ; preds = %bb, %bb.nph49 > + br i1 undef, label %bb5.preheader, label %bb > + > +bb4: ; preds = %bb5.preheader, %bb4 > + br i1 undef, label %bb6, label %bb4 > + > +bb6: ; preds = %bb4 > + br i1 undef, label %bb11.preheader, label %bb5.preheader > + > +bb5.preheader: ; preds = %bb6, %bb > + br label %bb4 > + > +bb10: ; preds = %bb11.preheader, %bb10 > + br i1 undef, label %bb15, label %bb10 > + > +bb15: ; preds = %bb10 > + br i1 undef, label %bb17, label %bb11.preheader > + > +bb11.preheader: ; preds = %bb15, %bb6 > + br label %bb10 > + > +bb17: ; preds = %bb15 > + br i1 undef, label %InstIntFunc.exit, label %bb.i > + > +bb.i: ; preds = %bb17 > + unreachable > + > +InstIntFunc.exit: ; preds = %bb17 > + br i1 undef, label %InstIntFunc.exit8, label %bb.i7 > + > +bb.i7: ; preds = %InstIntFunc.exit > + unreachable > + > +InstIntFunc.exit8: ; preds = %InstIntFunc.exit > + br i1 undef, label %InstVar.exit28, label %bb.i27 > + > +bb.i27: ; preds = %InstIntFunc.exit8 > + unreachable > + > +InstVar.exit28: ; preds = %InstIntFunc.exit8 > + br i1 undef, label %InstVar.exit, label %bb.i25 > + > +bb.i25: ; preds = %InstVar.exit28 > + unreachable > + > +InstVar.exit: ; preds = %InstVar.exit28 > + br i1 undef, label %InstIntFunc.exit23, label %bb.i22 > + > +bb.i22: ; preds = %InstVar.exit > + unreachable > + > +InstIntFunc.exit23: ; preds = %InstVar.exit > + br i1 undef, label %InstIntFunc.exit20, label %bb.i19 > + > +bb.i19: ; preds = %InstIntFunc.exit23 > + unreachable > + > +InstIntFunc.exit20: ; preds = %InstIntFunc.exit23 > + br i1 undef, label %InstIntFunc.exit17, label %bb.i16 > + > +bb.i16: ; preds = %InstIntFunc.exit20 > + br label %InstIntFunc.exit17 > + > +InstIntFunc.exit17: ; preds = %bb.i16, %InstIntFunc.exit20 > + %tmp79 = tail call fastcc %struct.TypHeader* @NewBag(i32 16, i64 8) nounwind ;<%struct.TypHeader*> [#uses=2] > + %tmp80 = getelementptr inbounds %struct.TypHeader* %tmp79, i64 0, i32 1 ;<%struct.TypHeader***> [#uses=1] > + %tmp81 = load %struct.TypHeader*** %tmp80, align 8 ;<%struct.TypHeader**> [#uses=1] > + store %struct.TypHeader* bitcast (%struct.TypHeader* (%struct.TypHeader*)* @FunIsBound to %struct.TypHeader*), %struct.TypHeader** %tmp81 > + %tmp82 = tail call fastcc %struct.TypHeader* @FindIdent(i8* getelementptr inbounds ([8 x i8]* @.str8302, i64 0, i64 0)) nounwind ;<%struct.TypHeader*> [#uses=1] > + %tmp83 = getelementptr inbounds %struct.TypHeader* %tmp82, i64 0, i32 1 ;<%struct.TypHeader***> [#uses=1] > + %tmp84 = load %struct.TypHeader*** %tmp83, align 8 ;<%struct.TypHeader**> [#uses=1] > + br i1 undef, label %InstIntFunc.exit14, label %bb.i13 > + > +bb.i13: ; preds = %InstIntFunc.exit17 > + unreachable > + > +InstIntFunc.exit14: ; preds = %InstIntFunc.exit17 > + store %struct.TypHeader* %tmp79, %struct.TypHeader** %tmp84, align 8 > + br i1 undef, label %InstIntFunc.exit11, label %bb.i10 > + > +bb.i10: ; preds = %InstIntFunc.exit14 > + unreachable > + > +InstIntFunc.exit11: ; preds = %InstIntFunc.exit14 > + br i1 undef, label %InstIntFunc.exit9.i, label %bb.i8.i > + > +bb.i8.i: ; preds = %InstIntFunc.exit11 > + unreachable > + > +InstIntFunc.exit9.i: ; preds = %InstIntFunc.exit11 > + br i1 undef, label %InstIntFunc.exit6.i, label %bb.i5.i > + > +bb.i5.i: ; preds = %InstIntFunc.exit9.i > + unreachable > + > +InstIntFunc.exit6.i: ; preds = %InstIntFunc.exit9.i > + br i1 undef, label %InstIntFunc.exit3.i, label %bb.i2.i > + > +bb.i2.i: ; preds = %InstIntFunc.exit6.i > + unreachable > + > +InstIntFunc.exit3.i: ; preds = %InstIntFunc.exit6.i > + br i1 undef, label %InitInt.exit, label %bb.i.i > + > +bb.i.i: ; preds = %InstIntFunc.exit3.i > + br label %InitInt.exit > + > +InitInt.exit: ; preds = %bb.i.i, %InstIntFunc.exit3.i > + br i1 undef, label %InstIntFunc.exit6.i419, label %bb.i5.i418 > + > +bb.i5.i418: ; preds = %InitInt.exit > + unreachable > + > +InstIntFunc.exit6.i419: ; preds = %InitInt.exit > + br i1 undef, label %InstIntFunc.exit3.i422, label %bb.i2.i421 > + > +bb.i2.i421: ; preds = %InstIntFunc.exit6.i419 > + unreachable > + > +InstIntFunc.exit3.i422: ; preds = %InstIntFunc.exit6.i419 > + br i1 undef, label %InitRat.exit, label %bb.i.i424 > + > +bb.i.i424: ; preds = %InstIntFunc.exit3.i422 > + unreachable > + > +InitRat.exit: ; preds = %InstIntFunc.exit3.i422 > + br label %bb.i396 > + > +bb.i396: ; preds = %bb.i396, %InitRat.exit > + br i1 undef, label %bb2.i398, label %bb.i396 > + > +bb2.i398: ; preds = %bb.i396 > + br i1 undef, label %InstIntFunc.exit15.i401, label %bb.i14.i400 > + > +bb.i14.i400: ; preds = %bb2.i398 > + br label %InstIntFunc.exit15.i401 > + > +InstIntFunc.exit15.i401: ; preds = %bb.i14.i400, %bb2.i398 > + br i1 undef, label %InstIntFunc.exit12.i404, label %bb.i11.i403 > + > +bb.i11.i403: ; preds = %InstIntFunc.exit15.i401 > + unreachable > + > +InstIntFunc.exit12.i404: ; preds = %InstIntFunc.exit15.i401 > + br i1 undef, label %InstIntFunc.exit9.i407, label %bb.i8.i406 > + > +bb.i8.i406: ; preds = %InstIntFunc.exit12.i404 > + unreachable > + > +InstIntFunc.exit9.i407: ; preds = %InstIntFunc.exit12.i404 > + br i1 undef, label %InstIntFunc.exit6.i410, label %bb.i5.i409 > + > +bb.i5.i409: ; preds = %InstIntFunc.exit9.i407 > + br label %InstIntFunc.exit6.i410 > + > +InstIntFunc.exit6.i410: ; preds = %bb.i5.i409, %InstIntFunc.exit9.i407 > + %tmp215 = tail call fastcc %struct.TypHeader* @NewBag(i32 16, i64 8) nounwind ;<%struct.TypHeader*> [#uses=2] > + %tmp216 = getelementptr inbounds %struct.TypHeader* %tmp215, i64 0, i32 1 ;<%struct.TypHeader***> [#uses=1] > + %tmp217 = load %struct.TypHeader*** %tmp216, align 8 ;<%struct.TypHeader**> [#uses=1] > + store %struct.TypHeader* bitcast (%struct.TypHeader* (%struct.TypHeader*)* @FunCoeffsCyc to %struct.TypHeader*), %struct.TypHeader** %tmp217 > + %tmp218 = tail call fastcc %struct.TypHeader* @FindIdent(i8* getelementptr inbounds ([10 x i8]* @.str4251, i64 0, i64 0)) nounwind ;<%struct.TypHeader*> [#uses=1] > + %tmp219 = getelementptr inbounds %struct.TypHeader* %tmp218, i64 0, i32 1 ;<%struct.TypHeader***> [#uses=1] > + %tmp220 = load %struct.TypHeader*** %tmp219, align 8 ;<%struct.TypHeader**> [#uses=1] > + br i1 undef, label %InstIntFunc.exit3.i413, label %bb.i2.i412 > + > +bb.i2.i412: ; preds = %InstIntFunc.exit6.i410 > + unreachable > + > +InstIntFunc.exit3.i413: ; preds = %InstIntFunc.exit6.i410 > + store %struct.TypHeader* %tmp215, %struct.TypHeader** %tmp220, align 8 > + unreachable > +} > + > +declare void @CantPrint(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantSum(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantDiff(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantProd(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantQuo(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantMod(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantPow(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @IntComm(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrBinop(%struct.TypHeader*) nounwind > + > +declare void @PrComm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvVar(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvVarAuto(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvVarAss(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrVar(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrVarAss(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvNot(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvAnd(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvOr(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrBool(%struct.TypHeader*) nounwind > + > +declare void @PrNot(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsBool(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunShallowCopy(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCopy(%struct.TypHeader* nocapture) nounwind > + > +define internal %struct.TypHeader* @FunIsBound(%struct.TypHeader* nocapture %hdCall) nounwind { > +entry: > + br i1 undef, label %bb1, label %bb > + > +bb: ; preds = %entry > + ret %struct.TypHeader* undef > + > +bb1: ; preds = %entry > + br i1 undef, label %bb3, label %bb24 > + > +bb3: ; preds = %bb1 > + br i1 undef, label %bb25, label %bb24 > + > +bb24: ; preds = %bb3, %bb1 > + ret %struct.TypHeader* undef > + > +bb25: ; preds = %bb3 > + br i1 undef, label %bb28, label %bb86 > + > +bb28: ; preds = %bb25 > + br i1 undef, label %bb133, label %bb86 > + > +bb86: ; preds = %bb28, %bb25 > + br i1 undef, label %bb93, label %bb94 > + > +bb93: ; preds = %bb86 > + unreachable > + > +bb94: ; preds = %bb86 > + br i1 undef, label %bb97, label %bb108 > + > +bb97: ; preds = %bb94 > + ret %struct.TypHeader* undef > + > +bb108: ; preds = %bb94 > + br i1 undef, label %bb110, label %bb109 > + > +bb109: ; preds = %bb108 > + %tmp91 = bitcast %struct.TypHeader** undef to i8* ; [#uses=1] > + %tmp92 = call fastcc %struct.TypHeader* @FindRecname(i8* %tmp91) nounwind ;<%struct.TypHeader*> [#uses=0] > + unreachable > + > +bb110: ; preds = %bb108 > + ret %struct.TypHeader* undef > + > +bb133: ; preds = %bb28 > + ret %struct.TypHeader* undef > +} > + > +declare %struct.TypHeader* @FunLeftQuotient(%struct.TypHeader* nocapture) nounwind > + > +define internal %struct.TypHeader* @CantComm(%struct.TypHeader* %hdL, %struct.TypHeader* %hdR) nounwind { > +entry: > + unreachable > +} > + > +declare i16** @__ctype_b_loc() nounwind readnone > + > +declare fastcc void @Print(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunUnbind(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @CopyCleanup(%struct.TypHeader*) nounwind > + > +declare fastcc void @CopyCopy(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @CopyForward(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @CopyShadow(%struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @Copy(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvFFE(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare void @PrFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowFFE(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunIsFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLogFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIntFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunZ(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @PrFF(%struct.TypHeader** nocapture, i32) nounwind > + > +declare fastcc %struct.TypHeader* @RootFiniteField(i64) nounwind > + > +declare fastcc %struct.TypHeader* @ConvTabIntFFE(i64) nounwind > + > +declare fastcc %struct.TypHeader* @CommonFF(%struct.TypHeader** nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @ChangeEnv(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvFunction(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EvReturn(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvFunccall(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvMakefunc(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrFunccall(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrFunction(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrFuncint(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrReturn(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTrace(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunUntrace(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunProfile(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunApplyFunc(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsFunc(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIgnore(%struct.TypHeader* nocapture) nounwind readonly > + > +declare fastcc i64 @SizeObj(%struct.TypHeader*) nounwind > + > +declare fastcc void @MarkObj(%struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @Error(i8* nocapture, i64, i64) nounwind > + > +declare void @longjmp(%struct.__jmp_buf_tag*, i32) noreturn nounwind > + > +declare fastcc void @InitGap(i32, i8** nocapture) nounwind > + > +declare i32 @_setjmp(%struct.__jmp_buf_tag*) nounwind > + > +declare %struct.TypHeader* @FunSIZEHANDLES(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNUMBERHANDLES(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCoefficients(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunGASMAN(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSIZE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTYPE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOBJ(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunHANDLE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsIdentical(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTmpName(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSizeScreen(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunRuntime(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunExec(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunHelp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunReadTest(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLogInputTo(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLogTo(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAppendTo(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPrntTo(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPrint(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAUTO(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunREAD(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunWindowCmd(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunError(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunBacktrace(%struct.TypHeader*) nounwind > + > +declare i32 @main(i32, i8** nocapture) noreturn nounwind > + > +declare fastcc void @ExitKernel(%struct.TypHeader*) nounwind > + > +declare fastcc void @CollectGarb() nounwind > + > +define internal fastcc %struct.TypHeader* @NewBag(i32 %type, i64 %size) nounwind { > +entry: > + br i1 undef, label %bb3, label %bb2 > + > +bb2: ; preds = %entry > + br i1 undef, label %bb22, label %bb28 > + > +bb3: ; preds = %entry > + unreachable > + > +bb22: ; preds = %bb2 > + unreachable > + > +bb28: ; preds = %bb2 > + br i1 undef, label %bb30, label %bb29 > + > +bb29: ; preds = %bb28 > + unreachable > + > +bb30: ; preds = %bb28 > + br i1 undef, label %bb33, label %bb31 > + > +bb31: ; preds = %bb30 > + br i1 undef, label %bb32, label %bb33 > + > +bb32: ; preds = %bb31 > + tail call fastcc void @Resize(%struct.TypHeader* undef, i64 undef) nounwind > + ret %struct.TypHeader* undef > + > +bb33: ; preds = %bb31, %bb30 > + ret %struct.TypHeader* undef > +} > + > +define internal fastcc void @Resize(%struct.TypHeader* %hdBag, i64 %newSize) nounwind { > +entry: > + br i1 undef, label %bb1, label %bb2 > + > +bb1: ; preds = %entry > + br label %bb2 > + > +bb2: ; preds = %bb1, %entry > + br i1 undef, label %bb3, label %bb4 > + > +bb3: ; preds = %bb2 > + ret void > + > +bb4: ; preds = %bb2 > + %tmp53 = tail call fastcc %struct.TypHeader* @NewBag(i32 undef, i64 %newSize) nounwind ;<%struct.TypHeader*> [#uses=0] > + unreachable > +} > + > +declare fastcc i64 @completion(i8* nocapture, i64, i64) nounwind > + > +define internal fastcc %struct.TypHeader* @FindRecname(i8* nocapture %name) nounwind { > +entry: > + br i1 undef, label %bb8, label %bb5 > + > +bb5: ; preds = %entry > + unreachable > + > +bb8: ; preds = %entry > + %tmp24 = tail call fastcc %struct.TypHeader* @NewBag(i32 78, i64 0) nounwind ;<%struct.TypHeader*> [#uses=1] > + %tmp26 = getelementptr inbounds %struct.TypHeader* %tmp24, i64 0, i32 1 ;<%struct.TypHeader***> [#uses=1] > + %tmp27 = load %struct.TypHeader*** %tmp26, align 8 ;<%struct.TypHeader**> [#uses=1] > + %tmp29 = bitcast %struct.TypHeader** %tmp27 to i8* ; [#uses=1] > + %tmp30 = tail call i8* @strncat(i8* %tmp29, i8* %name, i64 undef) nounwind ; [#uses=0] > + unreachable > +} > + > +define internal fastcc %struct.TypHeader* @FindIdent(i8* nocapture %name) nounwind { > +entry: > + br i1 undef, label %bb10, label %bb8 > + > +bb8: ; preds = %entry > + br label %bb10 > + > +bb10: ; preds = %bb8, %entry > + %tmp28 = load %struct.TypHeader** @HdIdenttab, align 8 ;<%struct.TypHeader*> [#uses=1] > + %tmp32 = getelementptr inbounds %struct.TypHeader* %tmp28, i64 0, i32 1 ;<%struct.TypHeader***> [#uses=1] > + %tmp33 = load %struct.TypHeader*** %tmp32, align 8 ;<%struct.TypHeader**> [#uses=1] > + br label %bb12 > + > +bb11: ; preds = %bb13 > + br label %bb12 > + > +bb12: ; preds = %bb11, %bb10 > + %tmp36 = getelementptr inbounds %struct.TypHeader** %tmp33, i64 undef ;<%struct.TypHeader**> [#uses=1] > + %tmp37 = load %struct.TypHeader** %tmp36, align 8 ;<%struct.TypHeader*> [#uses=2] > + br i1 undef, label %bb19, label %bb13 > + > +bb13: ; preds = %bb12 > + br i1 undef, label %bb14, label %bb11 > + > +bb14: ; preds = %bb13 > + br i1 undef, label %bb19, label %bb15 > + > +bb15: ; preds = %bb14 > + br i1 undef, label %bb18, label %bb17 > + > +bb17: ; preds = %bb15 > + ret %struct.TypHeader* %tmp37 > + > +bb18: ; preds = %bb15 > + ret %struct.TypHeader* %tmp37 > + > +bb19: ; preds = %bb14, %bb12 > + unreachable > +} > + > +declare %struct.TypHeader* @EvInt(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqInt(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare %struct.TypHeader* @LtInt(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare void @PrInteger(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunIsInt(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunQuo(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunRem(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunGcdInt(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @GcdInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @RemInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @QuoInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @CantLenList(%struct.TypHeader* nocapture) nounwind > + > +declare i64 @NotIsDenseList(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @NotIsPossList(%struct.TypHeader* nocapture) nounwind readnone > + > +declare %struct.TypHeader* @EvList(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @LtList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoLists(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModLists(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowLists(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CommList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CommLists(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CantElmList(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @CantElmsList(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CantAssList(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CantAsssList(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare i64 @CantPosList(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, i64) nounwind > + > +declare void @CantPlainList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @DepthListx(%struct.TypHeader*) nounwind > + > +declare void @PrList(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumSclList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumListScl(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffSclList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffListScl(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdSclList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdListScl(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvElmList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvElmListLevel(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvElmsList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvElmsListLevel(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvAssList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvAssListLevel(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvAsssList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvAsssListLevel(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrElmList(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrElmsList(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrAssList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvIn(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsVector(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsMat(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLength(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAdd(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAppend(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPosition(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOnPoints(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOnPairs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOnTuples(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOnSets(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOnRight(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOnLeft(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDepthVector(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CantDepthVector(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @AsssListLevel(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*, i64) nounwind > + > +declare fastcc %struct.TypHeader* @AssListLevel(%struct.TypHeader*, i64, %struct.TypHeader*, i64) nounwind > + > +declare fastcc %struct.TypHeader* @ElmsListLevel(%struct.TypHeader*, %struct.TypHeader*, i64) nounwind > + > +declare fastcc %struct.TypHeader* @ElmListLevel(%struct.TypHeader*, i64, i64) nounwind > + > +declare %struct.TypHeader* @ProdListList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffListList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumListList(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @PrPcPres(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTriangleIndex(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc i32 @IsNormedPcp(%struct.TypHeader*, %struct.TypHeader** nocapture) nounwind > + > +declare %struct.TypHeader* @FunTailReducedPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunBaseReducedPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTailDepthPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDepthPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunExponentsPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunExponentPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDifferencePcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSumPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSubtractPowerPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAddPowerPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDefinePowerPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSubtractCommPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAddCommPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDefineCommPcp(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @NormalWordPcp(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunPowerPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunConjugatePcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCommPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunQuotientPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLeftQuotientPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunProductPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNormalWordPcp(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc void @ShrinkSwords(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCentralWeightsPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunShrinkPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunGeneratorsPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDefineCentralWeightsPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunExtendCentralPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAgPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPcp(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvPerm(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EvMakeperm(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrMakeperm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowPI(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowIP(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @QuoIP(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsPerm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPermList(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunOrderPerm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSignPerm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSmallestGeneratorPerm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CommQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CommQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CommPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CommPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ModQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ModQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ModPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ModPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCyclePermInt(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunCycleLengthPermInt(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLargestMovedPointPerm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @QuoIQ(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowIQ(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @QuoQQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @QuoQP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @QuoPQ(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @QuoPP(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowQI(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare void @PrPermQ(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrPermP(%struct.TypHeader* nocapture) nounwind > + > +declare i64 @LenPlist(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfPlist(%struct.TypHeader* nocapture, i64) nounwind readonly > + > +declare i64 @PosPlist(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind > + > +declare void @PlainPlist(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsDensePlist(%struct.TypHeader* nocapture) nounwind readonly > + > +declare i64 @IsPossPlist(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqPlist(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @LtPlist(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ElmPlist(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsPlist(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssPlist(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssPlist(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvMakeList(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrMakeList(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @MakeList(%struct.TypHeader*, i64, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @UnifiedFieldVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare void @AddCoeffsListxListx(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @MultiplyCoeffsListxListx(%struct.TypHeader*, %struct.TypHeader*, i64, %struct.TypHeader*, i64) nounwind > + > +declare %struct.TypHeader* @CantNormalizeCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare void @CantShrinkCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CantShiftedCoeffs(%struct.TypHeader* nocapture, i64) nounwind > + > +declare void @CantAddCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare i64 @CantMultiplyCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @CantProductCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CantProductCoeffsMod(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare i64 @CantReduceCoeffs(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind > + > +declare i64 @CantReduceCoeffsMod(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture) nounwind > + > +declare noalias %struct.TypHeader* @CantPowerModCoeffs(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @NormalizeCoeffsListx(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @NormalizeCoeffsVecFFE(%struct.TypHeader*) nounwind > + > +declare void @ShrinkCoeffsListx(%struct.TypHeader*) nounwind > + > +declare void @ShrinkCoeffsVecFFE(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ShiftedCoeffsListx(%struct.TypHeader*, i64) nounwind > + > +declare %struct.TypHeader* @ShiftedCoeffsVecFFE(%struct.TypHeader*, i64) nounwind > + > +declare void @AddCoeffsListxVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @AddCoeffsVecFFEVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @MultiplyCoeffsVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ProductCoeffsListxListx(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProductCoeffsVecFFEVecFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProductCoeffsModListxListx(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @ReduceCoeffsListxListx(%struct.TypHeader*, i64, %struct.TypHeader*, i64) nounwind > + > +declare i64 @ReduceCoeffsVecFFEVecFFE(%struct.TypHeader* nocapture, i64, %struct.TypHeader* nocapture, i64) nounwind > + > +declare i64 @ReduceCoeffsModListxListx(%struct.TypHeader*, i64, %struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare i64 @ReduceCoeffsModListx(%struct.TypHeader*, i64, %struct.TypHeader* nocapture, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowerModListxIntListx(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowerModVecFFEIntVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowerModListxLIntListx(%struct.TypHeader*, %struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowerModVecFFELIntVecFFE(%struct.TypHeader*, %struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunShiftedCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNormalizeCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunShrinkCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAddCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSumCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunProductCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunProductCoeffsMod(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunReduceCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunRemainderCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunReduceCoeffsMod(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPowerModCoeffs(%struct.TypHeader* nocapture) nounwind > + > +declare i64 @LenRange(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfRange(%struct.TypHeader* nocapture, i64) nounwind readonly > + > +declare i64 @PosRange(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind > + > +declare i64 @IsDenseRange(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsPossRange(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtRange(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmRange(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsRange(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssRange(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssRange(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @PlainRange(%struct.TypHeader*) nounwind > + > +declare void @PrRange(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvMakeRange(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrMakeRange(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsRange(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvRat(%struct.TypHeader*) nounwind readnone > + > +declare void @PrRat(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumRat(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffRat(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdRat(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoRat(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModRat(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowRat(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EqRat(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare %struct.TypHeader* @LtRat(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunIsRat(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNumerator(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDenominator(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @RdExpr(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdAtom(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdFactor(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdTerm(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdAri(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdRel(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdStats(i64) nounwind > + > +declare fastcc %struct.TypHeader* @RdStat(i64) nounwind > + > +declare %struct.TypHeader* @EvRec(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvMakeRec(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvRecElm(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvRecAss(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrRec(%struct.TypHeader*) nounwind > + > +declare void @PrRecElm(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrRecAss(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @LtRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CommRec(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunIsRec(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunRecFields(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @MakeRec(%struct.TypHeader*, i64, %struct.TypHeader* nocapture) nounwind > + > +declare fastcc i64 @OpenInput(i8* nocapture) nounwind > + > +declare fastcc void @PutLine() nounwind > + > +declare fastcc void @PutChr(i32 signext) nounwind > + > +declare fastcc void @Pr(i8* nocapture, i64, i64) nounwind > + > +declare fastcc void @SyntaxError(i8*) nounwind > + > +declare fastcc void @GetLine() nounwind > + > +declare fastcc void @GetIdent() nounwind > + > +declare fastcc void @GetSymbol() nounwind > + > +declare fastcc void @Match(i64, i8* nocapture, i64) nounwind > + > +declare i64 @LenSet(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfSet(%struct.TypHeader* nocapture, i64) nounwind readonly > + > +declare i64 @PosSet(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind > + > +declare void @PlainSet(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsDenseSet(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsPossSet(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqSet(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @LtSet(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ElmSet(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsSet(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssSet(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssSet(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsEqualSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsSubsetSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAddSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunRemoveSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunUniteSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIntersectSet(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSubtractSet(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc i64 @IsSet(%struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @SetList(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EvStatseq(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvIf(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvFor(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvWhile(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvRepeat(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrStatseq(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrIf(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrFor(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrWhile(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrRepeat(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvChar(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqChar(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtChar(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare i64 @LenString(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfString(%struct.TypHeader* nocapture, i64) nounwind readonly > + > +declare i64 @PosString(%struct.TypHeader*, %struct.TypHeader*, i64) nounwind > + > +declare i64 @IsDenseString(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsPossString(%struct.TypHeader* nocapture) nounwind readonly > + > +declare void @PrChar(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ElmString(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsString(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssString(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssString(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @PlainString(%struct.TypHeader*) nounwind > + > +declare void @PrString(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EqString(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtString(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @FunIsString(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvMakeString(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc i64 @IsString(%struct.TypHeader*) nounwind > + > +declare noalias i8* @calloc(i64, i64) nounwind > + > +declare i8* @tmpnam(i8*) nounwind > + > +declare fastcc void @SyExit(i64) noreturn nounwind > + > +declare void @exit(i32) noreturn nounwind > + > +declare i64 @times(%struct.tms* nocapture) nounwind > + > +declare i64 @fwrite(i8* nocapture, i64, i64, i8* nocapture) nounwind > + > +declare void @syAnswerIntr(i32) nounwind > + > +declare i64 @time(i64*) nounwind > + > +declare void (i32)* @signal(i32, void (i32)*) nounwind > + > +declare fastcc void @syEchoch(i32, i64) nounwind > + > +declare i32 @fileno(%struct._IO_FILE* nocapture) nounwind > + > +declare i64 @write(i32, i8* nocapture, i64) > + > +declare fastcc void @syStopraw(i64) nounwind > + > +declare i32 @ioctl(i32, i64, ...) nounwind > + > +declare void @syAnswerTstp(i32) nounwind > + > +declare i32 @getpid() nounwind > + > +declare i32 @kill(i32, i32) nounwind > + > +declare fastcc void @SyFclose(i64) nounwind > + > +declare i32 @fclose(%struct._IO_FILE* nocapture) nounwind > + > +declare i8* @strncat(i8*, i8* nocapture, i64) nounwind > + > +declare i32 @strcmp(i8* nocapture, i8* nocapture) nounwind readonly > + > +declare fastcc i64 @SyFopen(i8* nocapture, i8* nocapture) nounwind > + > +declare noalias %struct._IO_FILE* @fopen(i8* noalias nocapture, i8* noalias nocapture) nounwind > + > +declare void @setbuf(%struct._IO_FILE* noalias nocapture, i8* noalias) nounwind > + > +declare i64 @strlen(i8* nocapture) nounwind readonly > + > +declare fastcc void @syWinPut(i64, i8* nocapture, i8* nocapture) nounwind > + > +declare i32 @isatty(i32) nounwind > + > +declare i8* @ttyname(i32) nounwind > + > +declare i32 @fputs(i8* noalias nocapture, %struct._IO_FILE* noalias nocapture) nounwind > + > +declare i32 @atoi(i8* nocapture) nounwind readonly > + > +declare noalias i8* @malloc(i64) nounwind > + > +declare void @free(i8* nocapture) nounwind > + > +declare i8* @getenv(i8* nocapture) nounwind readonly > + > +declare i32 @system(i8* nocapture) > + > +declare i64 @read(i32, i8* nocapture, i64) > + > +declare fastcc void @SyFputs(i8* nocapture, i64) nounwind > + > +declare fastcc i32 @syGetch(i64) nounwind > + > +declare fastcc i32 @syStartraw(i64) nounwind > + > +declare void @llvm.memcpy.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind > + > +declare void @syAnswerCont(i32) nounwind > + > +declare fastcc void @syEchos(i8* nocapture, i64) nounwind > + > +declare fastcc i8* @SyFgets(i8*, i64) nounwind > + > +declare i8* @fgets(i8* noalias, i32, %struct._IO_FILE* noalias nocapture) nounwind > + > +declare fastcc void @SyHelp(i8* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @FunTzRelator(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzSortC(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzRenumberGens(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzReplaceGens(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzSubstituteGen(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzOccurrences(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzOccurrencesPairs(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunTzSearchC(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvUnknown(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqUnknown(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @LtUnknown(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare void @PrUnknown(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoUnknown(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowUnknown(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunUnknown(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsUnknown(%struct.TypHeader* nocapture) nounwind > + > +declare i64 @LenVecFFE(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmlVecFFE(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmrVecFFE(%struct.TypHeader* nocapture, i64) nounwind > + > +declare i64 @PosVecFFE(%struct.TypHeader*, %struct.TypHeader*, i64) nounwind > + > +declare i64 @IsDenseVecFFE(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsPossVecFFE(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @DepthVecFFE(%struct.TypHeader* nocapture) nounwind readonly > + > +declare fastcc i64 @DegreeVecFFE(%struct.TypHeader* nocapture) nounwind readonly > + > +declare fastcc i64 @DegreeMatFFE(%struct.TypHeader** nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfVecFFE(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmVecFFE(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssVecFFE(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssVecFFE(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @PlainVecFFE(%struct.TypHeader*) nounwind > + > +declare i64 @IsXTypeVecFFE(%struct.TypHeader*) nounwind > + > +declare i64 @IsXTypeMatFFE(%struct.TypHeader*) nounwind > + > +declare void @PrVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumVecFFEFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @DiffFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @DiffVecFFEFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @DiffVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdVecFFEFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdVecFFEVecFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdVecFFEMatFFE(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowMatFFEInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunCharFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunDegreeFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLogVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunMakeVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunNumberVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @CantIntVecFFE(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @FunIntVecFFE(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdFFEVector(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdVectorFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffFFEVector(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffVectorFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumFFEVector(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumVectorFFE(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @IntVecFFE(%struct.TypHeader*, i64) nounwind > + > +declare i64 @LenVector(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @ElmfVector(%struct.TypHeader* nocapture, i64) nounwind readonly > + > +declare i64 @PosVector(%struct.TypHeader* nocapture, %struct.TypHeader*, i64) nounwind > + > +declare void @PlainVector(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsDenseVector(%struct.TypHeader* nocapture) nounwind readnone > + > +declare i64 @IsPossVector(%struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @EqVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @LtVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ElmVector(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @ElmsVector(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AssVector(%struct.TypHeader*, i64, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @AsssVector(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @IsXTypeVector(%struct.TypHeader*) nounwind > + > +declare i64 @IsXTypeMatrix(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumIntVector(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @SumVectorInt(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumVectorVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @DiffIntVector(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @DiffVectorInt(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffVectorVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdIntVector(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdVectorInt(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdVectorVector(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdVectorMatrix(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @PowMatrixInt(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare fastcc %struct.TypHeader* @SwordWord(%struct.TypHeader*, %struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @EvWord(%struct.TypHeader*) nounwind readnone > + > +declare %struct.TypHeader* @EqWord(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare fastcc %struct.TypHeader* @WordSword(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @ProdWord(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoWord(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ModWord(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @PowWW(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @CommWord(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @LtWord(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare %struct.TypHeader* @PowWI(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @FunExpsum(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunIsWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunPosWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSubword(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunLenWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunMappedWord(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunEliminated(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunSubs(%struct.TypHeader* nocapture) nounwind > + > +declare fastcc %struct.TypHeader* @Words(%struct.TypHeader* nocapture, i64) nounwind > + > +declare %struct.TypHeader* @FunAbstractGenerators(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @FunAbstractGenerator(%struct.TypHeader* nocapture) nounwind > + > +declare void @PrSword(%struct.TypHeader* nocapture) nounwind > + > +declare %struct.TypHeader* @LtAg_DIRECT(%struct.TypHeader* nocapture, %struct.TypHeader* nocapture) nounwind readonly > + > +declare %struct.TypHeader* @CommAg_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdCyc_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @QuoCyc_DIRECT(%struct.TypHeader*) nounwind > + > +declare void @AddCoeffsListxListx_DIRECT(%struct.TypHeader*, %struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @PosRange_DIRECT(%struct.TypHeader* nocapture, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdCycI_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare void @PrFunction_DIRECT(%struct.TypHeader* nocapture) nounwind > + > +declare void @FunPrint_DIRECT(%struct.TypHeader* nocapture) nounwind > + > +declare void @FunBacktrace_DIRECT() nounwind > + > +declare %struct.TypHeader* @SumSclList_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @SumListScl_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffSclList_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @DiffListScl_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdSclList_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @ProdListScl_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > + > +declare i64 @IsXTypeVector_DIRECT(%struct.TypHeader*) nounwind > + > +declare %struct.TypHeader* @EqWord_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind readonly > + > +declare %struct.TypHeader* @ProdWord_DIRECT(%struct.TypHeader*, %struct.TypHeader*) nounwind > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From wdietz2 at illinois.edu Mon Jul 19 23:57:18 2010 From: wdietz2 at illinois.edu (Will Dietz) Date: Tue, 20 Jul 2010 04:57:18 -0000 Subject: [llvm-commits] [poolalloc] r108808 - /poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Message-ID: <20100720045718.BBF172A6C12C@llvm.org> Author: wdietz2 Date: Mon Jul 19 23:57:18 2010 New Revision: 108808 URL: http://llvm.org/viewvc/llvm-project?rev=108808&view=rev Log: Further reduced SCCLeader testcase to make it of manageable size. Modified: poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Modified: poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll?rev=108808&r1=108807&r2=108808&view=diff ============================================================================== --- poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll (original) +++ poolalloc/trunk/test/dsa/regression/2010-07-12-SCCLeader.ll Mon Jul 19 23:57:18 2010 @@ -3,2061 +3,18 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -%0 = type { %struct._IO_FILE*, %struct._IO_FILE*, [8192 x i8] } -%struct.TypCollectors = type { i8*, void (%struct.TypHeader*, i64)*, i32 (i64*, %struct.TypHeader*)* } %struct.TypHeader = type { i64, %struct.TypHeader**, [3 x i8], i8 } -%struct.TypInputFile = type { i64, [64 x i8], [256 x i8], i8*, i64 } -%struct.TypOutputFile = type { i64, [256 x i8], i64, i64, i64, i64 } -%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] } -%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } -%struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } -%struct.__sigset_t = type { [16 x i64] } -%struct.anon = type { i64, i64, [4 x i8] } -%struct.termio = type { i16, i16, i16, i16, i8, [8 x i8] } -%struct.tms = type { i64, i64, i64, i64 } - - at Collectors = external constant [6 x %struct.TypCollectors], align 32 ; <[6 x %struct.TypCollectors]*> [#uses=0] - at CSeries = external global i64* ; [#uses=0] - at Class = external global i16 ; [#uses=0] - at CWeights = external global i64* ; [#uses=0] - at ug = external global i16 ; [#uses=0] - at cg = external global i16 ; [#uses=0] - at g = external global i64* ; [#uses=0] - at ce = external global i64 ; [#uses=0] - at Commutators = external global %struct.TypHeader** ; <%struct.TypHeader***> [#uses=0] - at GenStk = external global i16* ; [#uses=0] - at ExpStk = external global i64* ; [#uses=0] - at StrStk = external global i16** ; [#uses=0] - at Sp = external global i64 ; [#uses=0] - at StkDim = external global i64 ; [#uses=0] - at ue = external global i64 ; [#uses=0] - at LastClass = external global i16 ; [#uses=0] - at Powers = external global %struct.TypHeader** ; <%struct.TypHeader***> [#uses=0] - at NrGens = external global i64 ; [#uses=0] - at Prime = external global i64 ; [#uses=0] - at HdRnAvec = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str1 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str2 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str3 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str4 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str5 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str6 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str7 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str8 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str9 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str10 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str11 = external constant [62 x i8], align 8 ; <[62 x i8]*> [#uses=0] - at .str12 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at HdCallOop2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at HdCallOop1 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str13 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str14 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str15 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str16 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] - at .str17 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str18 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str19 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str20 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str21 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str22 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str23 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str24 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str25 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str26 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str27 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str28 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str29 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str30 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str31 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] - at .str32 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str33 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str34 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str35 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str36 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str37 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] - at .str38 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str39 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] - at .str40 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str41 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str42 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] - at .str43 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str44 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str45 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] - at .str46 = external constant [53 x i8], align 8 ; <[53 x i8]*> [#uses=0] - at .str47 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str48 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str49 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str50 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str51 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str52 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str53 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str54 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str55 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str56 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str57 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] - at .str58 = external constant [60 x i8], align 8 ; <[60 x i8]*> [#uses=0] - at .str59 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str60 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str61 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str62 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] - at .str63 = external constant [57 x i8], align 8 ; <[57 x i8]*> [#uses=0] - at .str64 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str65 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str166 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at HdRnSumAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str267 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at HdRnDifferenceAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str368 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at HdRnDepth = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str469 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at HdRnTailDepth = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str570 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at HdRnCentralWeight = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str671 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at HdRnLeadingExponent = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str772 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at HdRnReducedAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str873 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at HdRnRelativeOrder = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str974 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at HdRnExponentAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str1075 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at HdRnExponentsAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str1176 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at HdRnInformationAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str1277 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at HdRnIsCompatibleAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str1378 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at HdRnNormalizeIgs = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str1479 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at HdRnIsAgWord = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str1580 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str1681 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str1782 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at .str1883 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] - at .str1984 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str2085 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] - at .str2186 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str2287 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at .str2388 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str2489 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str2590 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str2691 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at HdCPL = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at HdCPC = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at HdCPS = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str2794 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at .str2895 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str2996 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str3097 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at .str3198 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str3299 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str33100 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str34101 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at .str35102 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str36103 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str37104 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str38105 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str39106 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str40107 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str41108 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at RepTimes = external global i64 ; [#uses=0] - at .str42109 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str43110 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str44111 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str45112 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at CallsProdAg = external global i64 ; [#uses=0] - at TimeProdAg = external global i64 ; [#uses=0] - at .str46113 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str47114 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at CallsQuoAg = external global i64 ; [#uses=0] - at TimeQuoAg = external global i64 ; [#uses=0] - at .str48115 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsPowAgI = external global i64 ; [#uses=0] - at TimePowAgI = external global i64 ; [#uses=0] - at .str49116 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsPowAgAg = external global i64 ; [#uses=0] - at TimePowAgAg = external global i64 ; [#uses=0] - at .str50117 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsModAg = external global i64 ; [#uses=0] - at TimeModAg = external global i64 ; [#uses=0] - at .str51118 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsCommAg = external global i64 ; [#uses=0] - at TimeCommAg = external global i64 ; [#uses=0] - at .str52119 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsLtAg = external global i64 ; [#uses=0] - at TimeLtAg = external global i64 ; [#uses=0] - at .str53120 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsEqAg = external global i64 ; [#uses=0] - at TimeEqAg = external global i64 ; [#uses=0] - at .str54121 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsSumAg = external global i64 ; [#uses=0] - at TimeSumAg = external global i64 ; [#uses=0] - at .str55122 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at CallsDiffAg = external global i64 ; [#uses=0] - at TimeDiffAg = external global i64 ; [#uses=0] - at .str56123 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str57124 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str58125 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str59126 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] - at .str60127 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str61128 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str62129 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str63130 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str64131 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str65132 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str66 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str67 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str68 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str69 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str70 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at CPP.b = external global i1 ; [#uses=0] - at .str71 = external constant [1 x i8], align 1 ; <[1 x i8]*> [#uses=0] - at .str72 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at CPN = external global i64 ; [#uses=0] - at .str73 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str74 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] - at .str75 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str76 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str77 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str78 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str79 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str80 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str81 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str82 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str83 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str84 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str87 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str89 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str91 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str93 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str94 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str95 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str96 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str97 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str98 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str99 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str100 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str101 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str102 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str103 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str104 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str105 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str106 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str107 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str108 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str109 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str110 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str111 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] - at .str113 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str114 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str115 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str116 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str117 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str118 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str119 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str120 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str121 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str122 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str123 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str124 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str125 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str137 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str1138 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str2139 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str3140 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str4141 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str5142 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str6143 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str7144 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str8145 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str9146 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str10147 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str11148 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str12149 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str13150 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str14151 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str15152 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str16153 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str17154 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str18155 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str19156 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str20157 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str21158 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str22159 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str23160 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] - at .str24161 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] - at .str25162 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str26163 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str27164 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str28165 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str29166 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str30167 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str31168 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str32169 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str33170 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str34171 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str35172 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] - at .str36173 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str37174 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str38175 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] - at .str39176 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str40177 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] - at .str41178 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str179 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str1180 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str2181 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str3182 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str4183 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at .str5184 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str6185 = external constant [20 x i8], align 1 ; <[20 x i8]*> [#uses=0] - at .str7186 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str8187 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str9188 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str10189 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str11190 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str12191 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str13192 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str14193 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] - at .str15194 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str16195 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str17196 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str18197 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str19198 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] - at .str20199 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str21200 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str22201 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str23202 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str24203 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str25204 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str26205 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str27206 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str28207 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at hdTable = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at treeType = external global i64 ; [#uses=0] - at hdWordValue = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at hdTree2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at treeWordLength = external global i64 ; [#uses=0] - at wordList = external global [1024 x i64], align 32 ; <[1024 x i64]*> [#uses=0] - at hdTabl2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str208 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str1209 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str2210 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str3211 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str4212 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str5213 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str6214 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str7215 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str8216 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str9217 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str10218 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str11219 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str12220 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str13221 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str14222 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str15223 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str16224 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at hdExponent = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at hdTree1 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at hdTree = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str17225 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str18226 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str19227 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str20228 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str21229 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str22230 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] - at .str23231 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str24232 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str25233 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str26234 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str27235 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str28236 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str29237 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at hdRel = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str30238 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at hdNums = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str31239 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str32240 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str33241 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str34242 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at dedlst = external global i64 ; [#uses=0] - at .str35243 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at dedfst = external global i64 ; [#uses=0] - at dedgen = external global [40960 x i64], align 32 ; <[40960 x i64]*> [#uses=0] - at dedcos = external global [40960 x i64], align 32 ; <[40960 x i64]*> [#uses=0] - at dedprint.b = external global i1 ; [#uses=0] - at .str36244 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at hdNext = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at hdPrev = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at lastDef = external global i64 ; [#uses=0] - at firstDef = external global i64 ; [#uses=0] - at hdFact = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at firstFree = external global i64 ; [#uses=0] - at lastFree = external global i64 ; [#uses=0] - at nrdel = external global i64 ; [#uses=0] - at .str37245 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str38246 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at lastN.4480 = external global i64 ; [#uses=0] - at phi.4481 = external global i64 ; [#uses=0] - at isSqfree.4482.b = external global i1 ; [#uses=0] - at nrp.4483 = external global i64 ; [#uses=0] - at HdResult = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at CycLastE = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str247 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str1248 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str2249 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str3250 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] + @.str4251 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=1] - at .str5252 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str6253 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str7254 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str8255 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str9256 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str10257 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str11258 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str12259 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str13260 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str14261 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] - at .str15262 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str16263 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str17264 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str18265 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str19266 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at CycLastN = external global i64 ; [#uses=0] - at .str20267 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str21268 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str22269 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str23270 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str24271 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at .str25272 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str26273 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at .str27274 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str28275 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at .str29276 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str30277 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str31278 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at EvTab = external global [81 x %struct.TypHeader* (%struct.TypHeader*)*], align 32 ; <[81 x %struct.TypHeader* (%struct.TypHeader*)*]*> [#uses=0] - at TabSum = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at TabDiff = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at TabProd = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at TabQuo = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at TabMod = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at TabPow = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at HdTrue = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at HdFalse = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at TabEq = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at TabLt = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at PrTab = external global [81 x void (%struct.TypHeader*)*], align 32 ; <[81 x void (%struct.TypHeader*)*]*> [#uses=0] - at .str292 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at TabComm = external global [28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]], align 32 ; <[28 x [28 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]]*> [#uses=0] - at .str1294 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str2295 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at HdVoid = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str3297 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str4298 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str5299 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str6300 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str7301 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] @.str8302 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=1] - at .str9303 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str10304 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at HdTildePr = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str11305 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str12306 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str13307 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str14308 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str15309 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str16310 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str17311 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str18312 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str19313 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str20314 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str21315 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] - at .str22316 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str23317 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str24318 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str25319 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] - at .str26320 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] - at .str27321 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str28322 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str29323 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str30324 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str31325 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str32326 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str33327 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str34328 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str35329 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str36330 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str37331 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str38332 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str40334 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str41335 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str42336 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str43337 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str44338 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str45339 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str46340 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str47341 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str48342 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str49343 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str50344 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str51345 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str52346 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str53347 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str54348 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str55349 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str56350 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str57351 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str58352 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str59353 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str60354 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at prPrec = external global i64 ; [#uses=0] - at .str61355 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str62356 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str63357 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str64358 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str65359 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str66360 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str67361 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str68362 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str69363 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str70364 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str71365 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str72366 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str73367 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str74368 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str75369 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str76370 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str77371 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str78372 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str79373 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str81375 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str82376 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str83377 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] - at .str84378 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str85379 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str86380 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str87381 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str88382 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str89383 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str90384 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str91385 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str92386 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str93387 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str94388 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at HdReturn = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at Pols = external constant [186 x i64], align 32 ; <[186 x i64]*> [#uses=0] - at HdFields = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at HdIntFFEs = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str396 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str1397 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str2398 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str3399 = external constant [2 x i8], align 1 ; <[2 x i8]*> [#uses=0] - at .str4400 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str5401 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str6402 = external constant [24 x i8], align 1 ; <[24 x i8]*> [#uses=0] - at .str7403 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str8404 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str9405 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str10406 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str11407 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str12408 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at .str13409 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at HdLastIntFFE = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str14410 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str15411 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str16412 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str17413 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str18414 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str19415 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str20416 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str21417 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str22418 = external constant [51 x i8], align 8 ; <[51 x i8]*> [#uses=0] - at .str23419 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str24420 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str25421 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] - at .str26422 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] - at .str27423 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] - at .str28424 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] - at .str29425 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] - at .str30426 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] - at .str31427 = external constant [59 x i8], align 8 ; <[59 x i8]*> [#uses=0] - at .str32428 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] - at HdExec = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str431 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str1432 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str2433 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str3434 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at HdTimes = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str4435 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str5436 = external constant [47 x i8], align 8 ; <[47 x i8]*> [#uses=0] - at .str8439 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str11442 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str12443 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str13444 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str14445 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at .str15446 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at prFull.b = external global i1 ; [#uses=0] - at .str16447 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str18449 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str19450 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str20451 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str22453 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str23454 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str24455 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str25456 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str26457 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str27458 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str28459 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str29460 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] - at IsProfiling = external global i64 ; [#uses=0] - at .str30461 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] - at .str31462 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str32463 = external constant [44 x i8], align 8 ; <[44 x i8]*> [#uses=0] - at .str33464 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at Timesum = external global i64 ; [#uses=0] - at .str34465 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str35466 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str36467 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str37468 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str39470 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str40471 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str42473 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str43474 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str477 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str1478 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str2479 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str3480 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str4481 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str5482 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str7484 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str8485 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at HdLast = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at ErrRet = external global [1 x %struct.__jmp_buf_tag], align 32 ; <[1 x %struct.__jmp_buf_tag]*> [#uses=0] - at .str9486 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str10487 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at HdLast2 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str11488 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at HdLast3 = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str12489 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at HdTime = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str13490 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str14491 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str15492 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str16493 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str17494 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str18495 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str19496 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str20497 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str21498 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str22499 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str23500 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str24501 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str25502 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str26503 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str27504 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str28505 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str29506 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str30507 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str31508 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str32509 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str33510 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str34511 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str35512 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str36513 = external constant [12 x i8], align 1 ; <[12 x i8]*> [#uses=0] - at .str37514 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str38515 = external constant [4 x i8], align 1 ; <[4 x i8]*> [#uses=0] - at .str39516 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str40517 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str41518 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str42519 = external constant [15 x i8], align 1 ; <[15 x i8]*> [#uses=0] - at .str43520 = external constant [13 x i8], align 1 ; <[13 x i8]*> [#uses=0] - at .str44521 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at .str45522 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str46523 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str47524 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str48525 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str49526 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str50527 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str51528 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str52529 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str53530 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str54531 = external constant [52 x i8], align 8 ; <[52 x i8]*> [#uses=0] - at .str55532 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] - at .str56533 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str57534 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str58535 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str59536 = external constant [10 x i8], align 1 ; <[10 x i8]*> [#uses=0] - at .str60537 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=0] - at .str61538 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str62539 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str63540 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str64541 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str65542 = external constant [21 x i8], align 1 ; <[21 x i8]*> [#uses=0] - at .str66543 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str67544 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at .str68545 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str69546 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str70547 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str71548 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str72549 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str73550 = external constant [45 x i8], align 8 ; <[45 x i8]*> [#uses=0] - at .str74551 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str75552 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str76553 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str77554 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] - at .str78555 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str79556 = external constant [30 x i8], align 1 ; <[30 x i8]*> [#uses=0] - at .str80557 = external constant [48 x i8], align 8 ; <[48 x i8]*> [#uses=0] - at .str81558 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str82559 = external constant [34 x i8], align 8 ; <[34 x i8]*> [#uses=0] - at .str83560 = external constant [54 x i8], align 8 ; <[54 x i8]*> [#uses=0] - at .str84561 = external constant [38 x i8], align 8 ; <[38 x i8]*> [#uses=0] - at .str85562 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str86563 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str87564 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str88565 = external constant [36 x i8], align 8 ; <[36 x i8]*> [#uses=0] - at .str89566 = external constant [25 x i8], align 1 ; <[25 x i8]*> [#uses=0] - at .str90567 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str91568 = external constant [46 x i8], align 8 ; <[46 x i8]*> [#uses=0] - at .str93570 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] - at .str94571 = external constant [42 x i8], align 8 ; <[42 x i8]*> [#uses=0] - at .str95572 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str96573 = external constant [54 x i8], align 8 ; <[54 x i8]*> [#uses=0] - at .str97574 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str98575 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at .str99576 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str100577 = external constant [37 x i8], align 8 ; <[37 x i8]*> [#uses=0] - at .str101578 = external constant [35 x i8], align 8 ; <[35 x i8]*> [#uses=0] - at .str102579 = external constant [50 x i8], align 8 ; <[50 x i8]*> [#uses=0] - at .str103580 = external constant [27 x i8], align 1 ; <[27 x i8]*> [#uses=0] - at .str104581 = external constant [23 x i8], align 1 ; <[23 x i8]*> [#uses=0] - at .str105582 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str106583 = external constant [43 x i8], align 8 ; <[43 x i8]*> [#uses=0] - at .str107584 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at .str108585 = external constant [16 x i8], align 1 ; <[16 x i8]*> [#uses=0] - at .str109586 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str110587 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str111588 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str112589 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str113590 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str114591 = external constant [31 x i8], align 8 ; <[31 x i8]*> [#uses=0] - at .str115592 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str116593 = external constant [33 x i8], align 8 ; <[33 x i8]*> [#uses=0] - at .str117594 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str118595 = external constant [29 x i8], align 1 ; <[29 x i8]*> [#uses=0] - at .str119596 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str120597 = external constant [28 x i8], align 1 ; <[28 x i8]*> [#uses=0] - at .str121598 = external constant [14 x i8], align 1 ; <[14 x i8]*> [#uses=0] - at .str122599 = external constant [7 x i8], align 1 ; <[7 x i8]*> [#uses=0] - at .str124601 = external constant [19 x i8], align 1 ; <[19 x i8]*> [#uses=0] - at .str125602 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str126 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str127 = external constant [6 x i8], align 1 ; <[6 x i8]*> [#uses=0] - at .str128 = external constant [39 x i8], align 8 ; <[39 x i8]*> [#uses=0] - at NameType = external constant [81 x i8*], align 32 ; <[81 x i8*]*> [#uses=0] - at Size = external global [81 x %struct.anon], align 32 ; <[81 x %struct.anon]*> [#uses=0] - at HdNewHandles = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at NrNewHandles = external global i64 ; [#uses=0] - at s.3831 = external global [7 x i8] ; <[7 x i8]*> [#uses=0] - at HdFree = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at .str605 = external constant [55 x i8], align 8 ; <[55 x i8]*> [#uses=0] - at FreeHandle = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at NrFreeHandles = external global i64 ; [#uses=0] - at FirstBag = external global %struct.TypHeader** ; <%struct.TypHeader***> [#uses=0] - at HdResize = external global %struct.TypHeader* ; <%struct.TypHeader**> [#uses=0] - at IsResizeCall.b = external global i1 ; [#uses=0] - at .str1606 = external constant [22 x i8], align 1 ; <[22 x i8]*> [#uses=0] - at .str2607 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str3608 = external constant [49 x i8], align 8 ; <[49 x i8]*> [#uses=0] - at .str4609 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str5610 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str6611 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str7612 = external constant [41 x i8], align 8 ; <[41 x i8]*> [#uses=0] - at .str8613 = external constant [11 x i8], align 1 ; <[11 x i8]*> [#uses=0] - at .str9614 = external constant [3 x i8], align 1 ; <[3 x i8]*> [#uses=0] - at .str10615 = external constant [40 x i8], align 8 ; <[40 x i8]*> [#uses=0] - at .str11616 = external constant [26 x i8], align 1 ; <[26 x i8]*> [#uses=0] - at lastType = external global i64 ; [#uses=0] - at lastSize = external global i64 ; [#uses=0] - at .str12617 = external constant [32 x i8], align 8 ; <[32 x i8]*> [#uses=0] - at .str13618 = external constant [5 x i8], align 1 ; <[5 x i8]*> [#uses=0] - at .str14619 = external constant [8 x i8], align 1 ; <[8 x i8]*> [#uses=0] - at .str15620 = external constant [17 x i8], align 1 ; <[17 x i8]*> [#uses=0] - at .str16621 = external constant [18 x i8], align 1 ; <[18 x i8]*> [#uses=0] - at .str17622 = external constant [9 x i8], align 1 ; <[9 x i8]*> [#uses=