[llvm] [SelectionDAG] Widen vector math libcalls when no routine is available (PR #218948)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 4 02:01:20 PDT 2026
=?utf-8?q?Mattéo?= Rizza Murgier,=?utf-8?q?Mattéo?= Rizza Murgier,
=?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/218948 at github.com>
================
@@ -2147,24 +2142,36 @@ void VectorLegalizer::ExpandREM(SDNode *Node,
}
// Try to expand libm nodes into vector math routine calls. Callers provide the
-// LibFunc equivalent of the passed in Node, which is used to lookup mappings
-// within TargetLibraryInfo. The only mappings considered are those where the
-// result and all operands are the same vector type. While predicated nodes are
-// not supported, we will emit calls to masked routines by passing in an all
-// true mask.
-bool VectorLegalizer::tryExpandVecMathCall(SDNode *Node, RTLIB::Libcall LC,
- SmallVectorImpl<SDValue> &Results) {
+// RTLIB::get<OP>(EVT) selector of the node's libcall family, which is used to
+// look up mappings within RuntimeLibcallsInfo. The only mappings considered are
+// those where the result and all operands are the same vector type. While
+// predicated nodes are not supported, we will emit calls to masked routines by
+// passing in a mask that is true for the lanes computed by the node.
+bool VectorLegalizer::tryExpandVecMathCall(
+ SDNode *Node, function_ref<RTLIB::Libcall(EVT)> GetLibcall,
+ SmallVectorImpl<SDValue> &Results) {
// Chain must be propagated but currently strict fp operations are down
// converted to their none strict counterpart.
assert(!Node->isStrictFPOpcode() && "Unexpected strict fp operation!");
- RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
- if (LCImpl == RTLIB::Unsupported)
+ EVT VT = Node->getValueType(0);
+ LLVMContext &Ctx = *DAG.getContext();
+ const LibcallLoweringInfo &Libcalls = DAG.getLibcalls();
+
+ // Try to widen the vector type when no libcall is available at that width.
+ EVT CallVT = VT;
+ RTLIB::LibcallImpl LCImpl = Libcalls.getLibcallImpl(GetLibcall(CallVT));
+ if (LCImpl == RTLIB::Unsupported && VT.getVectorElementCount().isScalar())
return false;
+ while (LCImpl == RTLIB::Unsupported) {
+ CallVT = CallVT.getDoubleNumVectorElementsVT(Ctx);
----------------
david-arm wrote:
What if the vector type is <3 x float>? Also, in general I'm a bit worried that there are cases where we get stuck in an infinite loop. We should at least have tests for non-power-of-2 element counts for fixed-width and scalable.
https://github.com/llvm/llvm-project/pull/218948
More information about the llvm-commits
mailing list