mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
AMDGPU: Avoid emitting "true" predicates
Empty condition strings are considerde always true. This removes a lot of clutter from the generated matcher tables. This shrinks the source size of AMDGPUGenDAGISel.inc from 7.3M to 6.1M. llvm-svn: 367326
This commit is contained in:
parent
a2d6634931
commit
61ac6a1386
@ -75,7 +75,7 @@ class ILFormat<dag outs, dag ins, string asmstr, list<dag> pattern>
|
||||
let isCodeGenOnly = 1;
|
||||
}
|
||||
|
||||
def TruePredicate : Predicate<"true">;
|
||||
def TruePredicate : Predicate<"">;
|
||||
|
||||
class PredicateControl {
|
||||
Predicate SubtargetPredicate = TruePredicate;
|
||||
|
@ -1373,8 +1373,10 @@ getPatternComplexity(const CodeGenDAGPatterns &CGP) const {
|
||||
///
|
||||
std::string PatternToMatch::getPredicateCheck() const {
|
||||
SmallVector<const Predicate*,4> PredList;
|
||||
for (const Predicate &P : Predicates)
|
||||
PredList.push_back(&P);
|
||||
for (const Predicate &P : Predicates) {
|
||||
if (!P.getCondString().empty())
|
||||
PredList.push_back(&P);
|
||||
}
|
||||
llvm::sort(PredList, deref<llvm::less>());
|
||||
|
||||
std::string Check;
|
||||
|
@ -1075,8 +1075,11 @@ public:
|
||||
std::string C = IsHwMode
|
||||
? std::string("MF->getSubtarget().checkFeatures(\"" + Features + "\")")
|
||||
: std::string(Def->getValueAsString("CondString"));
|
||||
if (C.empty())
|
||||
return "";
|
||||
return IfCond ? C : "!("+C+')';
|
||||
}
|
||||
|
||||
bool operator==(const Predicate &P) const {
|
||||
return IfCond == P.IfCond && IsHwMode == P.IsHwMode && Def == P.Def;
|
||||
}
|
||||
|
@ -3212,7 +3212,7 @@ Error
|
||||
GlobalISelEmitter::importRulePredicates(RuleMatcher &M,
|
||||
ArrayRef<Predicate> Predicates) {
|
||||
for (const Predicate &P : Predicates) {
|
||||
if (!P.Def)
|
||||
if (!P.Def || P.getCondString().empty())
|
||||
continue;
|
||||
declareSubtargetFeature(P.Def);
|
||||
M.addRequiredFeature(P.Def);
|
||||
|
@ -38,6 +38,10 @@ SubtargetFeatureInfo::getAll(const RecordKeeper &Records) {
|
||||
if (Pred->getName().empty())
|
||||
PrintFatalError(Pred->getLoc(), "Predicate has no name!");
|
||||
|
||||
// Ignore always true predicates.
|
||||
if (Pred->getValueAsString("CondString").empty())
|
||||
continue;
|
||||
|
||||
SubtargetFeatures.emplace_back(
|
||||
Pred, SubtargetFeatureInfo(Pred, SubtargetFeatures.size()));
|
||||
}
|
||||
@ -95,8 +99,10 @@ void SubtargetFeatureInfo::emitComputeAvailableFeatures(
|
||||
OS << " PredicateBitset Features;\n";
|
||||
for (const auto &SF : SubtargetFeatures) {
|
||||
const SubtargetFeatureInfo &SFI = SF.second;
|
||||
StringRef CondStr = SFI.TheDef->getValueAsString("CondString");
|
||||
assert(!CondStr.empty() && "true predicate should have been filtered");
|
||||
|
||||
OS << " if (" << SFI.TheDef->getValueAsString("CondString") << ")\n";
|
||||
OS << " if (" << CondStr << ")\n";
|
||||
OS << " Features[" << SFI.getEnumBitName() << "] = 1;\n";
|
||||
}
|
||||
OS << " return Features;\n";
|
||||
|
Loading…
x
Reference in New Issue
Block a user