From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id B01AB3858D39 for ; Tue, 7 Mar 2023 11:08:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B01AB3858D39 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 8DFD721A39; Tue, 7 Mar 2023 11:08:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1678187295; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=rDptbmsAvKmjfWTjFR5t5ZCYayQNAQjT1bZD1iISqNg=; b=F7m5XjD4HuelAFdZEvgRsr1/k0IYz+kcOA3OCtt9HUokWzlc4eQl29cFxEM86vJxkKaZ0N PqxF0bq2a1kUdgt6rRmamOa0RGdasEGxXW16yckGB0QWHx64U3ZNLQJVLlhznfJH90pXcx nxboNWTBsSGy+cZa5yGjoUtY+pRq0Fc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1678187295; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=rDptbmsAvKmjfWTjFR5t5ZCYayQNAQjT1bZD1iISqNg=; b=SfOwPpyGzxhStp14hDHnlpLBgjwcF9tJScMePGy02HSXMtUpRMwxxMgQ3Xbih/i86V89TK v1EobSxYWzapnqBA== Received: from wotan.suse.de (wotan.suse.de [10.160.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id 7DA002C141; Tue, 7 Mar 2023 11:08:15 +0000 (UTC) Date: Tue, 7 Mar 2023 11:08:15 +0000 (UTC) From: Richard Biener To: gcc-patches@gcc.gnu.org cc: Jakub Jelinek Subject: [PATCH] tree-optimization/109046 - re-combine complex loads User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,MISSING_MID,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Message-ID: <20230307110815.3HPoLvAsLYxgtaFLzQjUlSGRNd0tz-PUpt9vpK75IwU@z> The following addresses PR109046 by adding an optimization to forwprop to combine a piecewise complex load to a complex load when there are no uses of the components. That's something useful in general and easier to do than avoiding the splitting in complex lowering. The testcase exercises both the manual and the complex lowering case. Bootstrapped and tested on x86_64-unknown-linux-gnu, OK? Thanks, Richard. PR tree-optimization/109046 * tree-ssa-forwprop.cc (pass_forwprop::execute): Combine piecewise complex loads. * gcc.dg/tree-ssa/forwprop-39.c: New testcase. --- gcc/testsuite/gcc.dg/tree-ssa/forwprop-39.c | 15 ++++++++++ gcc/tree-ssa-forwprop.cc | 31 ++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/forwprop-39.c diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-39.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-39.c new file mode 100644 index 00000000000..eb2930e77fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-39.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -O2 -fdump-tree-forwprop1 -fdump-tree-optimized" } */ + +#include + +extern void push1(void *p, float _Complex x); +void foo (void *q, float _Complex *x) +{ + float r = __real *x; + float i = __imag *x; + push1 (q, CMPLXF (r, i)); +} + +/* { dg-final { scan-tree-dump-not "COMPLEX_EXPR" "forwprop1" } } */ +/* { dg-final { scan-tree-dump-not "REALPART_EXPR" "optimized" } } */ diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc index 03fe0a3f6df..3111a2b96a3 100644 --- a/gcc/tree-ssa-forwprop.cc +++ b/gcc/tree-ssa-forwprop.cc @@ -3669,7 +3669,8 @@ pass_forwprop::execute (function *fun) /* Rewrite stores of a single-use complex build expression to component-wise stores. */ use_operand_p use_p; - gimple *use_stmt; + gimple *use_stmt, *def1, *def2; + tree rhs2; if (single_imm_use (lhs, &use_p, &use_stmt) && gimple_store_p (use_stmt) && !gimple_has_volatile_ops (use_stmt) @@ -3703,6 +3704,34 @@ pass_forwprop::execute (function *fun) release_defs (stmt); gsi_remove (&gsi, true); } + /* Rewrite a component-wise load of a complex to a complex + load if the components are not used separately. */ + else if (TREE_CODE (rhs) == SSA_NAME + && has_single_use (rhs) + && ((rhs2 = gimple_assign_rhs2 (stmt)), true) + && TREE_CODE (rhs2) == SSA_NAME + && has_single_use (rhs2) + && (def1 = SSA_NAME_DEF_STMT (rhs), + gimple_assign_load_p (def1)) + && (def2 = SSA_NAME_DEF_STMT (rhs2), + gimple_assign_load_p (def2)) + && (gimple_vuse (def1) == gimple_vuse (def2)) + && gimple_assign_rhs_code (def1) == REALPART_EXPR + && gimple_assign_rhs_code (def2) == IMAGPART_EXPR + && operand_equal_p (TREE_OPERAND (gimple_assign_rhs1 + (def1), 0), + TREE_OPERAND (gimple_assign_rhs1 + (def2), 0))) + { + tree cl = TREE_OPERAND (gimple_assign_rhs1 (def1), 0); + gimple_assign_set_rhs_from_tree (&gsi, unshare_expr (cl)); + gcc_assert (gsi_stmt (gsi) == stmt); + gimple_set_vuse (stmt, gimple_vuse (def1)); + gimple_set_modified (stmt, true); + gimple_stmt_iterator gsi2 = gsi_for_stmt (def1); + gsi_remove (&gsi, false); + gsi_insert_after (&gsi2, stmt, GSI_SAME_STMT); + } else gsi_next (&gsi); } -- 2.35.3