[llvm] [GlobalISel] Support saturated truncate (PR #150219)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 20 08:09:31 PDT 2025


================
@@ -5924,6 +5924,102 @@ void CombinerHelper::applyUMulHToLShr(MachineInstr &MI) const {
   MI.eraseFromParent();
 }
 
+bool CombinerHelper::matchTruncSSatS(MachineInstr &MI,
+                                     Register &MatchInfo) const {
+  Register Dst = MI.getOperand(0).getReg();
+  Register Src = MI.getOperand(1).getReg();
+  LLT DstTy = MRI.getType(Dst);
+  LLT SrcTy = MRI.getType(Src);
+  unsigned NumDstBits = DstTy.getScalarSizeInBits();
+  unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
+  assert(NumSrcBits > NumDstBits && "Unexpected types for truncate operation");
+
+  APInt SignedMax = APInt::getSignedMaxValue(NumDstBits).sext(NumSrcBits);
+  APInt SignedMin = APInt::getSignedMinValue(NumDstBits).sext(NumSrcBits);
+  if (LI && isLegal({TargetOpcode::G_TRUNC_SSAT_S, {DstTy, SrcTy}})) {
----------------
arsenm wrote:

Early return and reduce indent, and defer creation of the constants 

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


More information about the llvm-commits mailing list