diff options
author | Daniel Sanders <daniel_l_sanders@apple.com> | 2017-04-21 14:09:20 +0000 |
---|---|---|
committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2017-04-21 14:09:20 +0000 |
commit | 419efdd55b0a67a448eeeb48f767e309b5d0d058 (patch) | |
tree | c1f4b046c2bfe6672166dcad9fd749319ae939d0 /llvm/utils | |
parent | 347b54b09373a9593ac8b9fc7f2a381374621877 (diff) | |
download | bcm5719-llvm-419efdd55b0a67a448eeeb48f767e309b5d0d058.tar.gz bcm5719-llvm-419efdd55b0a67a448eeeb48f767e309b5d0d058.zip |
Revert r300964 + r300970 - [globalisel][tablegen] Import SelectionDAG's rule predicates and support the equivalent in GIRule.
It's causing llvm-clang-x86_64-expensive-checks-win to fail to compile and I
haven't worked out why. Reverting to make it green while I figure it out.
llvm-svn: 300978
Diffstat (limited to 'llvm/utils')
-rw-r--r-- | llvm/utils/TableGen/AsmMatcherEmitter.cpp | 2 | ||||
-rw-r--r-- | llvm/utils/TableGen/CodeEmitterGen.cpp | 2 | ||||
-rw-r--r-- | llvm/utils/TableGen/GlobalISelEmitter.cpp | 91 | ||||
-rw-r--r-- | llvm/utils/TableGen/SubtargetFeatureInfo.cpp | 32 | ||||
-rw-r--r-- | llvm/utils/TableGen/SubtargetFeatureInfo.h | 40 | ||||
-rw-r--r-- | llvm/utils/TableGen/Types.cpp | 1 |
6 files changed, 27 insertions, 141 deletions
diff --git a/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/llvm/utils/TableGen/AsmMatcherEmitter.cpp index a5c2ea6c7ac..3947d0220ed 100644 --- a/llvm/utils/TableGen/AsmMatcherEmitter.cpp +++ b/llvm/utils/TableGen/AsmMatcherEmitter.cpp @@ -2861,7 +2861,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { emitValidateOperandClass(Info, OS); // Emit the available features compute function. - SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures( + SubtargetFeatureInfo::emitComputeAvailableFeatures( Info.Target.getName(), ClassName, "ComputeAvailableFeatures", Info.SubtargetFeatures, OS); diff --git a/llvm/utils/TableGen/CodeEmitterGen.cpp b/llvm/utils/TableGen/CodeEmitterGen.cpp index 565235d8214..f34c0ded0a3 100644 --- a/llvm/utils/TableGen/CodeEmitterGen.cpp +++ b/llvm/utils/TableGen/CodeEmitterGen.cpp @@ -336,7 +336,7 @@ void CodeEmitterGen::run(raw_ostream &o) { o << "#endif // NDEBUG\n"; // Emit the available features compute function. - SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures( + SubtargetFeatureInfo::emitComputeAvailableFeatures( Target.getName(), "MCCodeEmitter", "computeAvailableFeatures", SubtargetFeatures, o); diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp index 0c77167d4cc..7acc65e349e 100644 --- a/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -31,7 +31,6 @@ //===----------------------------------------------------------------------===// #include "CodeGenDAGPatterns.h" -#include "SubtargetFeatureInfo.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/Statistic.h" @@ -162,6 +161,20 @@ static std::string explainPredicates(const TreePatternNode *N) { return Explanation; } +static std::string explainRulePredicates(const ArrayRef<Init *> Predicates) { + std::string Explanation = ""; + StringRef Separator = ""; + for (const auto *P : Predicates) { + Explanation += Separator; + + if (const DefInit *PDef = dyn_cast<DefInit>(P)) { + Explanation += PDef->getDef()->getName(); + } else + Explanation += "<unknown>"; + } + return Explanation; +} + std::string explainOperator(Record *Operator) { if (Operator->isSubClassOf("SDNode")) return " (" + Operator->getValueAsString("Opcode") + ")"; @@ -225,8 +238,6 @@ class RuleMatcher { /// ID for the next instruction variable defined with defineInsnVar() unsigned NextInsnVarID; - std::vector<Record *> RequiredFeatures; - public: RuleMatcher() : Matchers(), Actions(), InsnVariableNames(), NextInsnVarID(0) {} @@ -234,7 +245,6 @@ public: RuleMatcher &operator=(RuleMatcher &&Other) = default; InstructionMatcher &addInstructionMatcher(); - void addRequiredFeature(Record *Feature); template <class Kind, class... Args> Kind &addAction(Args &&... args); @@ -245,9 +255,7 @@ public: void emitCxxCapturedInsnList(raw_ostream &OS); void emitCxxCaptureStmts(raw_ostream &OS, StringRef Expr); - void emit(raw_ostream &OS, - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> - SubtargetFeatures); + void emit(raw_ostream &OS); /// Compare the priority of this object and B. /// @@ -1084,10 +1092,6 @@ InstructionMatcher &RuleMatcher::addInstructionMatcher() { return *Matchers.back(); } -void RuleMatcher::addRequiredFeature(Record *Feature) { - RequiredFeatures.push_back(Feature); -} - template <class Kind, class... Args> Kind &RuleMatcher::addAction(Args &&... args) { Actions.emplace_back(llvm::make_unique<Kind>(std::forward<Args>(args)...)); @@ -1131,9 +1135,7 @@ void RuleMatcher::emitCxxCaptureStmts(raw_ostream &OS, StringRef Expr) { Matchers.front()->emitCxxCaptureStmts(OS, *this, InsnVarName); } -void RuleMatcher::emit(raw_ostream &OS, - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> - SubtargetFeatures) { +void RuleMatcher::emit(raw_ostream &OS) { if (Matchers.empty()) llvm_unreachable("Unexpected empty matcher!"); @@ -1147,22 +1149,7 @@ void RuleMatcher::emit(raw_ostream &OS, // %elt0(s32), %elt1(s32) = TGT_LOAD_PAIR %ptr // on some targets but we don't need to make use of that yet. assert(Matchers.size() == 1 && "Cannot handle multi-root matchers yet"); - - OS << "if ("; - OS << "[&]() {\n"; - if (!RequiredFeatures.empty()) { - OS << " PredicateBitset ExpectedFeatures = {"; - StringRef Separator = ""; - for (const auto &Predicate : RequiredFeatures) { - const auto &I = SubtargetFeatures.find(Predicate); - assert(I != SubtargetFeatures.end() && "Didn't import predicate?"); - OS << Separator << I->second.getEnumBitName(); - Separator = ", "; - } - OS << "};\n"; - OS << "if ((AvailableFeatures & ExpectedFeatures) != ExpectedFeatures)\n" - << " return false;\n"; - } + OS << "if ([&]() {\n"; emitCxxCaptureStmts(OS, "I"); @@ -1277,13 +1264,10 @@ private: /// GIComplexPatternEquiv. DenseMap<const Record *, const Record *> ComplexPatternEquivs; - // Map of predicates to their subtarget features. - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> SubtargetFeatures; - void gatherNodeEquivs(); const CodeGenInstruction *findNodeEquiv(Record *N) const; - Error importRulePredicates(RuleMatcher &M, ArrayRef<Init *> Predicates); + Error importRulePredicates(RuleMatcher &M, ArrayRef<Init *> Predicates) const; Expected<InstructionMatcher &> createAndImportSelDAGMatcher(InstructionMatcher &InsnMatcher, const TreePatternNode *Src) const; @@ -1303,8 +1287,6 @@ private: /// Analyze pattern \p P, returning a matcher for it if possible. /// Otherwise, return an Error explaining why we don't support it. Expected<RuleMatcher> runOnPattern(const PatternToMatch &P); - - void declareSubtargetFeature(Record *Predicate); }; void GlobalISelEmitter::gatherNodeEquivs() { @@ -1333,13 +1315,10 @@ GlobalISelEmitter::GlobalISelEmitter(RecordKeeper &RK) Error GlobalISelEmitter::importRulePredicates(RuleMatcher &M, - ArrayRef<Init *> Predicates) { - for (const Init *Predicate : Predicates) { - const DefInit *PredicateDef = static_cast<const DefInit *>(Predicate); - declareSubtargetFeature(PredicateDef->getDef()); - M.addRequiredFeature(PredicateDef->getDef()); - } - + ArrayRef<Init *> Predicates) const { + if (!Predicates.empty()) + return failedImport("Pattern has a rule predicate (" + + explainRulePredicates(Predicates) + ")"); return Error::success(); } @@ -1746,13 +1725,6 @@ void GlobalISelEmitter::run(raw_ostream &OS) { for (const auto &Rule : Rules) MaxTemporaries = std::max(MaxTemporaries, Rule.countTemporaryOperands()); - OS << "#ifdef GET_GLOBALISEL_PREDICATE_BITSET\n" - << "const unsigned MAX_SUBTARGET_PREDICATES = " << SubtargetFeatures.size() - << ";\n" - << "using PredicateBitset = " - "llvm::PredicateBitsetImpl<MAX_SUBTARGET_PREDICATES>;\n" - << "#endif // ifdef GET_GLOBALISEL_PREDICATE_BITSET\n\n"; - OS << "#ifdef GET_GLOBALISEL_TEMPORARIES_DECL\n"; for (unsigned I = 0; I < MaxTemporaries; ++I) OS << " mutable MachineOperand TempOp" << I << ";\n"; @@ -1763,21 +1735,14 @@ void GlobalISelEmitter::run(raw_ostream &OS) { OS << ", TempOp" << I << "(MachineOperand::CreatePlaceholder())\n"; OS << "#endif // ifdef GET_GLOBALISEL_TEMPORARIES_INIT\n\n"; - OS << "#ifdef GET_GLOBALISEL_IMPL\n"; - SubtargetFeatureInfo::emitSubtargetFeatureBitEnumeration(SubtargetFeatures, - OS); - SubtargetFeatureInfo::emitNameTable(SubtargetFeatures, OS); - SubtargetFeatureInfo::emitComputeAvailableFeatures( - Target.getName(), "InstructionSelector", "computeAvailableFeatures", - SubtargetFeatures, OS); - - OS << "bool " << Target.getName() + OS << "#ifdef GET_GLOBALISEL_IMPL\n" + << "bool " << Target.getName() << "InstructionSelector::selectImpl(MachineInstr &I) const {\n" << " MachineFunction &MF = *I.getParent()->getParent();\n" << " const MachineRegisterInfo &MRI = MF.getRegInfo();\n"; for (auto &Rule : Rules) { - Rule.emit(OS, SubtargetFeatures); + Rule.emit(OS); ++NumPatternEmitted; } @@ -1786,12 +1751,6 @@ void GlobalISelEmitter::run(raw_ostream &OS) { << "#endif // ifdef GET_GLOBALISEL_IMPL\n"; } -void GlobalISelEmitter::declareSubtargetFeature(Record *Predicate) { - if (SubtargetFeatures.count(Predicate) == 0) - SubtargetFeatures.emplace( - Predicate, SubtargetFeatureInfo(Predicate, SubtargetFeatures.size())); -} - } // end anonymous namespace //===----------------------------------------------------------------------===// diff --git a/llvm/utils/TableGen/SubtargetFeatureInfo.cpp b/llvm/utils/TableGen/SubtargetFeatureInfo.cpp index 96418dc77d5..72a556182b1 100644 --- a/llvm/utils/TableGen/SubtargetFeatureInfo.cpp +++ b/llvm/utils/TableGen/SubtargetFeatureInfo.cpp @@ -59,20 +59,6 @@ void SubtargetFeatureInfo::emitSubtargetFeatureFlagEnumeration( OS << "};\n\n"; } -void SubtargetFeatureInfo::emitSubtargetFeatureBitEnumeration( - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, - raw_ostream &OS) { - OS << "// Bits for subtarget features that participate in " - << "instruction matching.\n"; - OS << "enum SubtargetFeatureBits : " - << getMinimalTypeForRange(SubtargetFeatures.size()) << " {\n"; - for (const auto &SF : SubtargetFeatures) { - const SubtargetFeatureInfo &SFI = SF.second; - OS << " " << SFI.getEnumBitName() << " = " << SFI.Index << ",\n"; - } - OS << "};\n\n"; -} - void SubtargetFeatureInfo::emitNameTable( std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, raw_ostream &OS) { @@ -104,24 +90,6 @@ void SubtargetFeatureInfo::emitComputeAvailableFeatures( StringRef TargetName, StringRef ClassName, StringRef FuncName, std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, raw_ostream &OS) { - OS << "PredicateBitset " << TargetName << ClassName << "::\n" - << FuncName << "(const MachineFunction *MF, const " << TargetName - << "Subtarget *Subtarget) const {\n"; - OS << " PredicateBitset Features;\n"; - for (const auto &SF : SubtargetFeatures) { - const SubtargetFeatureInfo &SFI = SF.second; - - OS << " if (" << SFI.TheDef->getValueAsString("CondString") << ")\n"; - OS << " Features[" << SFI.getEnumBitName() << "] = 1;\n"; - } - OS << " return Features;\n"; - OS << "}\n\n"; -} - -void SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures( - StringRef TargetName, StringRef ClassName, StringRef FuncName, - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, - raw_ostream &OS) { OS << "uint64_t " << TargetName << ClassName << "::\n" << FuncName << "(const FeatureBitset& FB) const {\n"; OS << " uint64_t Features = 0;\n"; diff --git a/llvm/utils/TableGen/SubtargetFeatureInfo.h b/llvm/utils/TableGen/SubtargetFeatureInfo.h index bbaf4525960..99f380f2a1d 100644 --- a/llvm/utils/TableGen/SubtargetFeatureInfo.h +++ b/llvm/utils/TableGen/SubtargetFeatureInfo.h @@ -37,34 +37,16 @@ struct SubtargetFeatureInfo { return "Feature_" + TheDef->getName().str(); } - /// \brief The name of the enumerated constant identifying the bitnumber for - /// this feature. - std::string getEnumBitName() const { - return "Feature_" + TheDef->getName().str() + "Bit"; - } - void dump() const; static std::vector<std::pair<Record *, SubtargetFeatureInfo>> getAll(const RecordKeeper &Records); /// Emit the subtarget feature flag definitions. - /// - /// This version emits the bit value for the feature and is therefore limited - /// to 64 feature bits. static void emitSubtargetFeatureFlagEnumeration( std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, raw_ostream &OS); - /// Emit the subtarget feature flag definitions. - /// - /// This version emits the bit index for the feature and can therefore support - /// more than 64 feature bits. - static void emitSubtargetFeatureBitEnumeration( - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> - &SubtargetFeatures, - raw_ostream &OS); - static void emitNameTable(std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, raw_ostream &OS); @@ -72,9 +54,6 @@ struct SubtargetFeatureInfo { /// Emit the function to compute the list of available features given a /// subtarget. /// - /// This version is used for subtarget features defined using Predicate<> - /// and supports more than 64 feature bits. - /// /// \param TargetName The name of the target as used in class prefixes (e.g. /// <TargetName>Subtarget) /// \param ClassName The name of the class (without the <Target> prefix) @@ -87,25 +66,6 @@ struct SubtargetFeatureInfo { std::map<Record *, SubtargetFeatureInfo, LessRecordByID> &SubtargetFeatures, raw_ostream &OS); - - /// Emit the function to compute the list of available features given a - /// subtarget. - /// - /// This version is used for subtarget features defined using - /// AssemblerPredicate<> and supports up to 64 feature bits. - /// - /// \param TargetName The name of the target as used in class prefixes (e.g. - /// <TargetName>Subtarget) - /// \param ClassName The name of the class (without the <Target> prefix) - /// that will contain the generated functions. - /// \param FuncName The name of the function to emit. - /// \param SubtargetFeatures A map of TableGen records to the - /// SubtargetFeatureInfo equivalent. - static void emitComputeAssemblerAvailableFeatures( - StringRef TargetName, StringRef ClassName, StringRef FuncName, - std::map<Record *, SubtargetFeatureInfo, LessRecordByID> - &SubtargetFeatures, - raw_ostream &OS); }; } // end namespace llvm diff --git a/llvm/utils/TableGen/Types.cpp b/llvm/utils/TableGen/Types.cpp index 04d9e40f674..35458296f8f 100644 --- a/llvm/utils/TableGen/Types.cpp +++ b/llvm/utils/TableGen/Types.cpp @@ -40,6 +40,5 @@ const char *llvm::getMinimalTypeForEnumBitfield(uint64_t Size) { uint64_t MaxIndex = Size; if (MaxIndex > 0) MaxIndex--; - assert(MaxIndex <= 64 && "Too many bits"); return getMinimalTypeForRange(1ULL << MaxIndex); } |