This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][GCC][mid-end] Fix single use requirement for xorsign (x * copysign (1, y))
- From: Tamar Christina <tamar dot christina at arm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: nd at arm dot com, law at redhat dot com
- Date: Tue, 22 Aug 2017 17:27:23 +0100
- Subject: [PATCH][GCC][mid-end] Fix single use requirement for xorsign (x * copysign (1, y))
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Tamar dot Christina at arm dot com;
- Nodisclaimer: True
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
Hi All,
This patch fixes the placement of the single-use requirement for xorsign.
on `x = a * copysign (1, b)` the intention was that `copysign (1, b)` be
single use, and not `x`. Requiring `x` to be single use blocks transformation
where we do want it to occur.
Regtested on aarch64-none-linux-gnu and no regressions
(only target currently supporting this).
Ok for trunk?
gcc/
2017-08-22 Tamar Christina <tamar.christina@arm.com>
PR middle-end/19706
* tree-ssa-math-opts.c (convert_expand_mult_copysign):
Fix single-use check.
--
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 87940b6e00db0d34a472504cf70923d1d334eccb..f26d105c16145bc77dd5e3a05b13f22aff43d4d8 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -3200,21 +3200,20 @@ convert_expand_mult_copysign (gimple *stmt, gimple_stmt_iterator *gsi)
type = TREE_TYPE (lhs);
machine_mode mode = TYPE_MODE (type);
- if (HONOR_SNANS (type) || !has_single_use (lhs))
+ if (HONOR_SNANS (type))
return false;
if (TREE_CODE (treeop0) == SSA_NAME && TREE_CODE (treeop1) == SSA_NAME)
{
gimple *call0 = SSA_NAME_DEF_STMT (treeop0);
- if (!is_copysign_call_with_1 (call0))
+ if (!is_copysign_call_with_1 (call0) || !has_single_use (treeop0))
{
call0 = SSA_NAME_DEF_STMT (treeop1);
- if (!is_copysign_call_with_1 (call0))
+ if (!is_copysign_call_with_1 (call0) || !has_single_use (treeop1))
return false;
treeop1 = treeop0;
}
-
if (optab_handler (xorsign_optab, mode) == CODE_FOR_nothing)
return false;