[llvm] [CodeGen] Add scalarization fallback for multi-result scalable intrinsics (PR #218634)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 14 02:08:45 PDT 2026


=?utf-8?q?Mattéo?= Rizza Murgier,=?utf-8?q?Mattéo?= Rizza Murgier,
=?utf-8?q?Mattéo?= Rizza Murgier
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/218634 at github.com>


================
@@ -808,6 +809,37 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
         return lowerUnaryVectorIntrinsicAsLoop(M, CI);
       });
       break;
+    case Intrinsic::modf:
+    case Intrinsic::sincos:
+    case Intrinsic::sincospi:
+      Changed |= forEachCall(F, [&](CallInst *CI) {
+        Type *Ty = CI->getArgOperand(0)->getType();
+        if (!isa<ScalableVectorType>(Ty))
+          return false;
+        const TargetLowering *TL = TM->getSubtargetImpl(F)->getTargetLowering();
+        unsigned Op = TL->IntrinsicIDToISD(F.getIntrinsicID());
+        assert(Op != ISD::DELETED_NODE && "unsupported intrinsic");
+        EVT VT = EVT::getEVT(Ty);
+        if (!TL->isOperationExpand(Op, VT))
+          return false;
+        // The vector legalizer can expand these to a vector math library call.
+        RTLIB::Libcall LC;
+        switch (Op) {
+        case ISD::FMODF:
+          LC = RTLIB::getMODF(VT);
+          break;
+        case ISD::FSINCOS:
+          LC = RTLIB::getSINCOS(VT);
+          break;
+        default:
+          LC = RTLIB::getSINCOSPI(VT);
----------------
arsenm wrote:

Add an explicit case for SINCOSPI and make default llvm_unreachable 

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


More information about the llvm-commits mailing list