[llvm-branch-commits] [llvm] AMDGPU/GlobalISel: RegBankLegalize rules for load (PR #112882)

Nicolai Hähnle via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Nov 28 07:32:22 PST 2024


================
@@ -233,6 +327,126 @@ RegBankLegalizeRules::getRulesForOpc(MachineInstr &MI) const {
   return GRules.at(GRulesAlias.at(Opc));
 }
 
+// Syntactic sugar wrapper for predicate lambda that enables '&&', '||' and '!'.
+class Predicate {
+public:
+  struct Elt {
+    // Save formula composed of Pred, '&&', '||' and '!' as a jump table.
+    // Sink ! to Pred. For example !((A && !B) || C) -> (!A || B) && !C
+    // Sequences of && and || will be represented by jumps, for example:
+    // (A && B && ... X) or (A && B && ... X) || Y
+    //   A == true jump to B
+    //   A == false jump to end or Y, result is A(false) or Y
+    // (A || B || ... X) or (A || B || ... X) && Y
+    //   A == true jump to end or Y, result is B(true) or Y
+    //   A == false jump to B
+    // Notice that when negating expression, we simply flip Neg on each Pred
+    // and swap TJumpOffset and FJumpOffset (&& becomes ||, || becomes &&).
+    std::function<bool(const MachineInstr &)> Pred;
+    bool Neg; // Neg of Pred is calculated before jump
+    unsigned TJumpOffset;
+    unsigned FJumpOffset;
+  };
+
+  SmallVector<Elt, 8> Expression;
+
+  Predicate(std::function<bool(const MachineInstr &)> Pred) {
+    Expression.push_back({Pred, false, 1, 1});
+  };
+
+  Predicate(SmallVectorImpl<Elt> &Expr) { Expression.swap(Expr); };
----------------
nhaehnle wrote:

I find having a constructor that is destructive on its argument in this way to be quite surprising. It is against good patterns in modern C++. Better have it take an rvalue reference (&&-reference). Then its callers have to explicitly `std::move`, but that makes it more obvious what happens at the call sites.

Also, this constructor should be private just like `Elt`.

https://github.com/llvm/llvm-project/pull/112882


More information about the llvm-branch-commits mailing list