On October 6, 2020 3:15:02 AM GMT+02:00, Alexandre Oliva <ol...@adacore.com> 
wrote:
>
>This is a first step towards enabling the sincos optimization in Ada.
>
>The issue this patch solves is that sincos takes the type to be looked
>up with mathfn_built_in from variables or temporaries in which results
>of sin and cos are stored.  In Ada, sin and cos are declared in an
>internal aux package, with uses thereof in a standard generic package,
>which ensures that the types are not what mathfn_built_in expects.

But are they not compatible? 

Richard. 

>Taking the type from the intrinsic's formal parameter, as in the
>patch, ensures we get the type associated with the intrinsics,
>regardless of the types used to declare and import them, so the lookup
>of the CEXPI intrinsic for the same type finds it.
>
>
>for  gcc/ChangeLog
>
>       * tree-ssa-math-opts.c (execute_cse_sincos_1): Take the type
>       for the cexpi/sincos intrinsic interface from formals of other
>       intrinsics.
>---
> 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 8423caa..31fd241 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);

Reply via email to