[llvm] [SDAG] Avoid creating redundant stack slots when lowering FSINCOS (PR #108401)

Benjamin Maxwell via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 17 03:26:25 PDT 2024


================
@@ -2355,68 +2347,83 @@ 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::use_iterator UI = Node->use_begin(), UE = Node->use_end();
----------------
MacDue wrote:

I guess I could instead check the operand of the store

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


More information about the llvm-commits mailing list