[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