[llvm] [GlobalISel] Add `combine` action for C++ combine rules (PR #135941)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 21 04:14:56 PDT 2025
================
@@ -798,17 +798,45 @@ bool CombineRuleBuilder::parseAll() {
if (!parseDefs(*RuleDef.getValueAsDag("Defs")))
return false;
- if (!Parser.parsePatternList(
- *RuleDef.getValueAsDag("Match"),
- [this](auto Pat) { return addMatchPattern(std::move(Pat)); }, "match",
- (RuleDef.getName() + "_match").str()))
- return false;
+ const DagInit &Act0 = *RuleDef.getValueAsDag("Action0");
+ const DagInit &Act1 = *RuleDef.getValueAsDag("Action1");
+
+ StringRef Act0Op = Act0.getOperatorAsDef(RuleDef.getLoc())->getName();
+ StringRef Act1Op = Act1.getOperatorAsDef(RuleDef.getLoc())->getName();
+
+ if (Act0Op == "match" && Act1Op == "apply") {
+ if (!Parser.parsePatternList(
+ Act0, [this](auto Pat) { return addMatchPattern(std::move(Pat)); },
+ "match", (RuleDef.getName() + "_match").str()))
+ return false;
+
+ if (!Parser.parsePatternList(
+ Act1, [this](auto Pat) { return addApplyPattern(std::move(Pat)); },
+ "apply", (RuleDef.getName() + "_apply").str()))
+ return false;
+
+ } else if (Act0Op == "combine" && Act1Op == "empty_action") {
+ // combine: everything is a "match" except C++ code which is an apply.
+ const auto AddCombinePat = [this](std::unique_ptr<Pattern> Pat) {
+ if (isa<CXXPattern>(Pat.get()))
+ return addApplyPattern(std::move(Pat));
+ return addMatchPattern(std::move(Pat));
+ };
- if (!Parser.parsePatternList(
- *RuleDef.getValueAsDag("Apply"),
- [this](auto Pat) { return addApplyPattern(std::move(Pat)); }, "apply",
- (RuleDef.getName() + "_apply").str()))
+ if (!Parser.parsePatternList(Act0, AddCombinePat, "combine",
+ (RuleDef.getName() + "_combine").str()))
+ return false;
+
+ if (MatchPats.empty() || ApplyPats.empty()) {
+ PrintError("'combine' action needs at least one pattern to match, and "
+ "C++ code to apply");
+ return false;
+ }
+ } else {
+ PrintError("Expected both a 'match' and 'apply' action in combine rule, "
----------------
arsenm wrote:
Error messages should start with lowercase
https://github.com/llvm/llvm-project/pull/135941
More information about the llvm-commits
mailing list