From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 2075D39484B0; Fri, 2 Oct 2020 09:16:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2075D39484B0 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] make sincos take type from intrinsic formal, not from actual X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: 82693c4421d8a372e538ff1bd385f9ac4a34ce6f X-Git-Newrev: d472f1b1d6c9bf2fc0bdff9a784853fb9a0596ae Message-Id: <20201002091655.2075D39484B0@sourceware.org> Date: Fri, 2 Oct 2020 09:16:55 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Oct 2020 09:16:55 -0000 https://gcc.gnu.org/g:d472f1b1d6c9bf2fc0bdff9a784853fb9a0596ae commit d472f1b1d6c9bf2fc0bdff9a784853fb9a0596ae Author: Alexandre Oliva 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 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);