From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id 370123858CDA for ; Tue, 10 Jan 2023 11:05:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 370123858CDA 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 CB7B337DAF; Tue, 10 Jan 2023 11:05:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1673348734; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=ddvmRwy2rxStHDqFPoiBHOhrMYK/rfSNYx69Xyog2iY=; b=2LilAOsJqbOVx2RbE4s2QdVNxuXp1x7C8z9nNp1l0YNKXm5ZqHnH37PAjhRGR3CEy+NsZQ m+moUbZIVxJao4cB8pShTGHzO9QDTjrFfTje4Y+iemlffqL547N72a9fPFU5LjH4H5Zgfw nHO9ZuYA11WMdtYgI6Id+LpshlW132E= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1673348734; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=ddvmRwy2rxStHDqFPoiBHOhrMYK/rfSNYx69Xyog2iY=; b=2ueTCZ8c2ZkRn6NqYrsBIDrurK1bEt5EZbEzRvB45BEOf4kFyCnnU5nEWN7QzB1t2gu67B dVT3yccXF5dOMvBg== 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 BBDF42C141; Tue, 10 Jan 2023 11:05:31 +0000 (UTC) Date: Tue, 10 Jan 2023 11:05:34 +0000 (UTC) From: Richard Biener To: Richard Sandiford cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] tree-optimization/108314 - avoid BIT_NOT optimization for extract-last In-Reply-To: Message-ID: References: <20230110094614.0E81A1358A@imap2.suse-dmz.suse.de> 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=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,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: On Tue, 10 Jan 2023, Richard Sandiford wrote: > Richard Biener writes: > > The extract-last reduction internal function expects the then and > > else clause as vector and scalar and thus we cannot perform optimization > > of the inversion of the condition by swapping the then/else clauses. > > > > Bootstrap and regtest running on x86_64-unknown-linux-gnu, OK? > > Sorry for not having found the time to look at the PR yet. > Like you say in the trail, it seems kind-of familiar. > > I think we should instead prevent the else in: > > scalar_cond_masked_key cond (cond_expr, ncopies); > if (loop_vinfo->scalar_cond_masked_set.contains (cond)) > masks = &LOOP_VINFO_MASKS (loop_vinfo); > else > { > > for EXTRACT_LAST. We've lost as soon as swap_cond_operands gets > set to true. But we're not getting there - the above is guarded with if (reduction_type == EXTRACT_LAST_REDUCTION) masks = &LOOP_VINFO_MASKS (loop_vinfo); else { instead we run into if (masked) vec_compare = vec_cond_lhs; else { vec_cond_rhs = vec_oprnds1[i]; if (bitop1 == NOP_EXPR) { ... else { ... else if (bitop2 == BIT_NOT_EXPR { /* Instead of doing ~x ? y : z do x ? z : y. */ vec_compare = new_temp; std::swap (vec_then_clause, vec_else_clause); so we could instead reject vectorizing for EQ_EXPR but then applying the negation to the condition allows this to be vectorized just fine (which is what the patch does)? Richard. > Thanks, > Richard > > > Thanks, > > Richard. > > > > PR tree-optimization/108314 > > * tree-vect-stmts.cc (vectorizable_condition): Do not > > perform BIT_NOT_EXPR optimization for EXTRACT_LAST_REDUCTION. > > > > * gcc.dg/vect/pr108314.c: New testcase. > > --- > > gcc/testsuite/gcc.dg/vect/pr108314.c | 16 ++++++++++++++++ > > gcc/tree-vect-stmts.cc | 13 +++++++++---- > > 2 files changed, 25 insertions(+), 4 deletions(-) > > create mode 100644 gcc/testsuite/gcc.dg/vect/pr108314.c > > > > diff --git a/gcc/testsuite/gcc.dg/vect/pr108314.c b/gcc/testsuite/gcc.dg/vect/pr108314.c > > new file mode 100644 > > index 00000000000..07260e06915 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/vect/pr108314.c > > @@ -0,0 +1,16 @@ > > +/* { dg-do compile } */ > > +/* { dg-additional-options "-march=armv9-a" { target aarch64-*-* } } */ > > + > > +int x, y, z; > > + > > +void f(void) > > +{ > > + int t = 4; > > + for (; x; x++) > > + { > > + if (y) > > + continue; > > + t = 0; > > + } > > + z = t; > > +} > > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc > > index 6ddd41fb473..eb4ca1f184e 100644 > > --- a/gcc/tree-vect-stmts.cc > > +++ b/gcc/tree-vect-stmts.cc > > @@ -10677,7 +10677,8 @@ vectorizable_condition (vec_info *vinfo, > > vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi); > > if (bitop2 == NOP_EXPR) > > vec_compare = new_temp; > > - else if (bitop2 == BIT_NOT_EXPR) > > + else if (bitop2 == BIT_NOT_EXPR > > + && reduction_type != EXTRACT_LAST_REDUCTION) > > { > > /* Instead of doing ~x ? y : z do x ? z : y. */ > > vec_compare = new_temp; > > @@ -10686,9 +10687,13 @@ vectorizable_condition (vec_info *vinfo, > > else > > { > > vec_compare = make_ssa_name (vec_cmp_type); > > - new_stmt > > - = gimple_build_assign (vec_compare, bitop2, > > - vec_cond_lhs, new_temp); > > + if (bitop2 == BIT_NOT_EXPR) > > + new_stmt > > + = gimple_build_assign (vec_compare, bitop2, new_temp); > > + else > > + new_stmt > > + = gimple_build_assign (vec_compare, bitop2, > > + vec_cond_lhs, new_temp); > > vect_finish_stmt_generation (vinfo, stmt_info, > > new_stmt, gsi); > > } > -- Richard Biener SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)