public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/aoliva/heads/testme)] make sincos take type from intrinsic formal, not from actual
@ 2020-10-02  9:16 Alexandre Oliva
  0 siblings, 0 replies; only message in thread
From: Alexandre Oliva @ 2020-10-02  9:16 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:d472f1b1d6c9bf2fc0bdff9a784853fb9a0596ae

commit d472f1b1d6c9bf2fc0bdff9a784853fb9a0596ae
Author: Alexandre Oliva <oliva@adacore.com>
Date:   Tue Sep 29 09:50:05 2020 -0300

    make sincos take type from intrinsic formal, not from actual

Diff:
---
 gcc/tree-ssa-math-opts.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 8423caa3ee3..31fd241e69a 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -1139,7 +1139,7 @@ execute_cse_sincos_1 (tree name)
 {
   gimple_stmt_iterator gsi;
   imm_use_iterator use_iter;
-  tree fndecl, res, type;
+  tree fndecl = NULL_TREE, res, type = NULL_TREE;
   gimple *def_stmt, *use_stmt, *stmt;
   int seen_cos = 0, seen_sin = 0, seen_cexpi = 0;
   auto_vec<gimple *> stmts;
@@ -1147,7 +1147,6 @@ execute_cse_sincos_1 (tree name)
   int i;
   bool cfg_changed = false;
 
-  type = TREE_TYPE (name);
   FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, name)
     {
       if (gimple_code (use_stmt) != GIMPLE_CALL
@@ -1169,15 +1168,34 @@ execute_cse_sincos_1 (tree name)
 	  break;
 
 	default:;
+	  continue;
 	}
-    }
 
+      tree t = TREE_VALUE (TYPE_ARG_TYPES (gimple_call_fntype (use_stmt)));
+      if (!type)
+	type = t;
+      else if (t != type)
+	{
+	  if (!tree_nop_conversion_p (type, t))
+	    return false;
+	  /* If there is more than one type to choose from, prefer one
+	     that has a CEXPI builtin.  */
+	  else if (!fndecl
+		   && (fndecl = mathfn_built_in (t, BUILT_IN_CEXPI)))
+	    type = t;
+	}
+    }
   if (seen_cos + seen_sin + seen_cexpi <= 1)
     return false;
 
+  if (type != TREE_TYPE (name)
+      && !tree_nop_conversion_p (type, TREE_TYPE (name)))
+    return false;
+
   /* Simply insert cexpi at the beginning of top_bb but not earlier than
      the name def statement.  */
-  fndecl = mathfn_built_in (type, BUILT_IN_CEXPI);
+  if (!fndecl)
+    fndecl = mathfn_built_in (type, BUILT_IN_CEXPI);
   if (!fndecl)
     return false;
   stmt = gimple_build_call (fndecl, 1, name);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-10-02  9:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-02  9:16 [gcc(refs/users/aoliva/heads/testme)] make sincos take type from intrinsic formal, not from actual Alexandre Oliva

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).