public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/111098] New: Missed combine .FMA + .COND_NEG
@ 2023-08-22 8:14 lehua.ding at rivai dot ai
0 siblings, 0 replies; only message in thread
From: lehua.ding at rivai dot ai @ 2023-08-22 8:14 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111098
Bug ID: 111098
Summary: Missed combine .FMA + .COND_NEG
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: lehua.ding at rivai dot ai
Target Milestone: ---
For code[1], GCC first combine a[i] + b[i] * c to a .FMA (widening_mul pass)
than fold .FMA + neg to .FNMS. But for code[2], it not fold .FMA + .COND_NEG to
.COND_FNMS. See the codes and dump tree on https://godbolt.org/z/WTKrET4sn.
Can we relax the fold condition after fuse mul+add from neg to neg or COND_NEG?
The simple try is as diff[3].
[1]
r[i] = -(a[i] + b[i] * c);
[2]
r[i] = pred[i] != 1 ? -(a[i] + b[i] * c) : c;
[3]
diff --git a/gcc/match.pd b/gcc/match.pd
index 86fdc606a79..a3719f725ab 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -8020,7 +8020,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(negate (fmas@3 @0 @1 @2))
(if (single_use (@3))
- (IFN_FNMS @0 @1 @2))))
+ (IFN_FNMS @0 @1 @2)))
+ (simplify
+ (IFN_COND_NEG @0 (fmas@5 @1 @2 @3) @4)
+ (if (single_use (@5))
+ (IFN_COND_FNMS @0 @1 @2 @3 @4))))
(simplify
(IFN_FMS:c (negate @0) @1 @2)
diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
index 712097ac5be..b9f9baba002 100644
--- a/gcc/tree-ssa-math-opts.cc
+++ b/gcc/tree-ssa-math-opts.cc
@@ -3163,8 +3163,10 @@ convert_mult_to_fma_1 (tree mul_result, tree op1, tree
op2)
&& gimple_call_lhs (orig_stmt)
&& TREE_CODE (gimple_call_lhs (orig_stmt)) == SSA_NAME
&& single_imm_use (gimple_call_lhs (orig_stmt), &use_p, &neg_stmt)
- && is_gimple_assign (neg_stmt)
- && gimple_assign_rhs_code (neg_stmt) == NEGATE_EXPR
+ && ((is_gimple_assign (neg_stmt)
+ && gimple_assign_rhs_code (neg_stmt) == NEGATE_EXPR)
+ || (gimple_call_internal_p (neg_stmt)
+ && gimple_call_internal_fn (neg_stmt) == IFN_COND_NEG))
&& !stmt_could_throw_p (cfun, neg_stmt))
{
gsi = gsi_for_stmt (neg_stmt);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-08-22 8:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-22 8:14 [Bug tree-optimization/111098] New: Missed combine .FMA + .COND_NEG lehua.ding at rivai dot ai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).