[PATCH] D140305: [GlobalISel][Legalizer] add minScalarIf action

Ties Stuij via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 19 06:50:41 PST 2022


stuij created this revision.
Herald added a project: All.
stuij requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Ensure scalar is at least as wide as type, but only if the specified condition
is met.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D140305

Files:
  llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
  llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp


Index: llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
===================================================================
--- llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+++ llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
@@ -321,6 +321,27 @@
     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_OR, {v2s16}));
   }
 
+  // Test minScalarIf
+  {
+    bool IfCond = true;
+    LegalizerInfo LI;
+    auto &LegacyInfo = LI.getLegacyLegalizerInfo();
+    LI.getActionDefinitionsBuilder(G_OR)
+      .legalFor({s32})
+      .minScalarIf([&](const LegalityQuery &Query) {
+                     return IfCond;
+                   }, 0, s32);
+    LegacyInfo.computeTables();
+
+    // Only handle scalars, ignore vectors.
+    EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_OR, {s16}));
+    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_OR, {v2s16}));
+
+    IfCond = false;
+    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_OR, {s16}));
+    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_OR, {v2s16}));
+  }
+
   // Test maxScalar
   {
     LegalizerInfo LI;
Index: llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
===================================================================
--- llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
+++ llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
@@ -950,6 +950,22 @@
                     changeTo(typeIdx(TypeIdx), Ty));
   }
 
+  /// Ensure the scalar is at least as wide as Ty if condition is met.
+  LegalizeRuleSet &minScalarIf(LegalityPredicate Predicate, unsigned TypeIdx,
+                               const LLT Ty) {
+    using namespace LegalityPredicates;
+    using namespace LegalizeMutations;
+    return actionIf(
+        LegalizeAction::WidenScalar,
+        [=](const LegalityQuery &Query) {
+          const LLT QueryTy = Query.Types[TypeIdx];
+          return QueryTy.isScalar() &&
+                 QueryTy.getSizeInBits() < Ty.getSizeInBits() &&
+                 Predicate(Query);
+        },
+        changeElementTo(typeIdx(TypeIdx), Ty));
+  }
+
   /// Ensure the scalar is at most as wide as Ty.
   LegalizeRuleSet &maxScalarOrElt(unsigned TypeIdx, const LLT Ty) {
     using namespace LegalityPredicates;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140305.483951.patch
Type: text/x-patch
Size: 2246 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221219/2ec48e8b/attachment.bin>


More information about the llvm-commits mailing list