[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