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);