[llvm] [GISel][RISCV] Add G_CTLS Opcode and combines, lower to cls(w) (PR #175069)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 8 18:09:47 PST 2026


================
@@ -8512,3 +8512,102 @@ bool CombinerHelper::matchSuboCarryOut(const MachineInstr &MI,
 
   return false;
 }
+
+// Fold (ctlz (xor x, (sra x, bitwidth-1))) -> (add (ctls x), 1).
+// Fold (ctlz (or (shl (xor x, (sra x, bitwidth-1)), 1), 1) -> (ctls x)
+bool CombinerHelper::matchCtls(MachineInstr &CtlzMI,
+                               BuildFnTy &MatchInfo) const {
+  assert((CtlzMI.getOpcode() == TargetOpcode::G_CTLZ ||
+          CtlzMI.getOpcode() == TargetOpcode::G_CTLZ_ZERO_UNDEF) &&
+         "Expected G_CTLZ variant");
+
+  const Register Dst = CtlzMI.getOperand(0).getReg();
+  Register Src = CtlzMI.getOperand(1).getReg();
+
+  LLT Ty = MRI.getType(Dst);
+  LLT SrcTy = MRI.getType(Src);
+
+  if (!(Ty.isValid() && Ty.isScalar()))
+    return false;
+
+  if (!LI)
+    return false;
+
+  switch (LI->getAction({TargetOpcode::G_CTLS, {Ty, SrcTy}}).Action) {
+  default:
+    return false;
+  case LegalizeActions::Legal:
+  case LegalizeActions::Custom:
+  case LegalizeActions::WidenScalar:
+    break;
+  }
+
+  const MachineInstr *RhsMI = MRI.getVRegDef(Src);
+  if (!RhsMI)
+    return false;
+
+  bool NeedAdd = true;
----------------
topperc wrote:

Can we use the MIPatternMatch.h framework to do the matching?

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


More information about the llvm-commits mailing list