On October 6, 2020 3:15:02 AM GMT+02:00, Alexandre Oliva <[email protected]>
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);