aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2024-06-30 18:39:07 -0700
committerAndrew Pinski <quic_apinski@quicinc.com>2024-07-02 14:26:51 -0700
commit578ccc717937178b50db0e35554da3f77f19e304 (patch)
tree8b944e745c72f8d53a4e4c3518f3484ede8f93b8 /gcc
parent1250540a98e0a1dfa4d7834672d88d8543ea70b1 (diff)
downloadgcc-578ccc717937178b50db0e35554da3f77f19e304.zip
gcc-578ccc717937178b50db0e35554da3f77f19e304.tar.gz
gcc-578ccc717937178b50db0e35554da3f77f19e304.tar.bz2
Small optimization for complex addition, real/imag parts the same
This is just a small optimization for the case where the real and imag parts are the same when lowering complex addition/subtraction. We only need to do the addition once when the real and imag parts are the same (on both sides of the operator). This gets done later on by FRE/PRE/DOM but having it done soon allows the cabs lowering to remove the sqrt and just change it to a multiply by a constant. Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: * tree-complex.cc (expand_complex_addition): If both operands have the same real and imag parts, only add the addition once. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/complex-8.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/complex-8.c12
-rw-r--r--gcc/tree-complex.cc7
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/complex-8.c b/gcc/testsuite/gcc.dg/tree-ssa/complex-8.c
new file mode 100644
index 0000000..a9636ff
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/complex-8.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-cplxlower1-raw" } */
+
+_Complex double f(double a, double c)
+{
+ _Complex double d = __builtin_complex (a, a);
+ d+=__builtin_complex(c, c);
+ return d;
+}
+
+/* There should only be one plus as (a+c) is still (a+c) */
+/* { dg-final { scan-tree-dump-times "plus_expr, " 1 "cplxlower1" } } */
diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
index 8a879ac..dfebec1 100644
--- a/gcc/tree-complex.cc
+++ b/gcc/tree-complex.cc
@@ -984,7 +984,12 @@ expand_complex_addition (gimple_stmt_iterator *gsi, tree inner_type,
case PAIR (VARYING, VARYING):
general:
rr = gimple_build (&stmts, loc, code, inner_type, ar, br);
- ri = gimple_build (&stmts, loc, code, inner_type, ai, bi);
+ /* (a+ai) + (b+bi) -> (a+b)+(a+b)i
+ small optimization to remove one new statement. */
+ if (operand_equal_p (ar, ai) && operand_equal_p (br, bi))
+ ri = rr;
+ else
+ ri = gimple_build (&stmts, loc, code, inner_type, ai, bi);
break;
default: