[llvm] [SDAG] Avoid creating redundant stack slots when lowering FSINCOS (PR #108401)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 21 00:01:07 PDT 2024
================
@@ -2355,68 +2347,80 @@ static bool useSinCos(SDNode *Node) {
}
/// Issue libcalls to sincos to compute sin / cos pairs.
-void
-SelectionDAGLegalize::ExpandSinCosLibCall(SDNode *Node,
- SmallVectorImpl<SDValue> &Results) {
- RTLIB::Libcall LC;
- switch (Node->getSimpleValueType(0).SimpleTy) {
- default: llvm_unreachable("Unexpected request for libcall!");
- case MVT::f32: LC = RTLIB::SINCOS_F32; break;
- case MVT::f64: LC = RTLIB::SINCOS_F64; break;
- case MVT::f80: LC = RTLIB::SINCOS_F80; break;
- case MVT::f128: LC = RTLIB::SINCOS_F128; break;
- case MVT::ppcf128: LC = RTLIB::SINCOS_PPCF128; break;
+void SelectionDAGLegalize::ExpandSinCosLibCall(
+ SDNode *Node, SmallVectorImpl<SDValue> &Results) {
+ EVT VT = Node->getValueType(0);
+ Type *Ty = VT.getTypeForEVT(*DAG.getContext());
+ RTLIB::Libcall LC = RTLIB::getFSINCOS(VT);
+
+ // Find users of the node that store the results. The destination pointers
+ // can be used instead of creating stack allocations.
+ std::array<StoreSDNode *, 2> ResultStores = {nullptr};
+ for (SDNode *User : Node->uses()) {
+ if (!ISD::isNormalStore(User))
+ continue;
+ auto *ST = cast<StoreSDNode>(User);
+ if (!ST->isSimple() || ST->getAddressSpace() != 0 ||
+ ST->getAlign() < DAG.getDataLayout().getABITypeAlign(Ty))
+ continue;
----------------
arsenm wrote:
I'm not sure it's safe to just ignore those. Can you try adding a test with other uses of the pointers? Something like
%sin = llvm.sin..
store %sin, %stack.0
%reload = load %stack.0
%cos = llvm.cos
store %cos, %stack.0
https://github.com/llvm/llvm-project/pull/108401
More information about the llvm-commits
mailing list