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 133F13857355 for ; Wed, 4 Oct 2023 07:19:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 133F13857355 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 28B7B21847; Wed, 4 Oct 2023 07:19:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1696403992; 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=LsWaGCPxQnGNf64Rpl7/HPwO85o8EJepZonhw0NccuI=; b=qeVUCS0VVMfRBV68SSUZfy0IEKI1lES4kjg5MHbSL8hZyIJJZU7r3xEM/uN8zpdiT3nN2T pU86eODX8AobV8A8AsdUpIwLbInsEgPNmMzCtgCmn7t2yJiFu6Fo+ReD9aqnJJ2pEMMEzC Xbw9BxiIYsTUu2w2Gy8iLVfYyMbaOn8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1696403992; 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=LsWaGCPxQnGNf64Rpl7/HPwO85o8EJepZonhw0NccuI=; b=tD/d1/TyfN3YGtoBTLql7uUlHkyd1/1atEEcwyWlafoq+KmhanT3T403+ztQNZ5OxNnDLY UutGNxiiAw7ePNCg== 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 E20212C142; Wed, 4 Oct 2023 07:19:51 +0000 (UTC) Date: Wed, 4 Oct 2023 07:19:51 +0000 (UTC) From: Richard Biener To: Jakub Jelinek cc: Andrew Pinski , gcc-patches@gcc.gnu.org Subject: Re: [PATCH] match.pd: Fix up a ? cst1 : cst2 regression on signed bool [PR111668] In-Reply-To: Message-ID: References: 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=-5.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,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, 3 Oct 2023, Jakub Jelinek wrote: > Hi! > > My relatively recent changes to these simplifiers to avoid > doing build_nonstandard_integer_type (primarily for BITINT_TYPE) > broke PR111668, a recurrence of the PR110487 bug. > I thought the build_nonstandard_integer_type isn't ever needed there, > but there is one special case where it is. > For the a ? -1 : 0 and a ? 0 : -1 simplifications there are actually > 3 different cases. One is for signed 1-bit precision types (signed > kind of implied from integer_all_onesp, because otherwise it would > match integer_onep earlier), where the simplifier wierdly was matching > them using the a ? powerof2cst : 0 -> a << (log2(powerof2cst)) > simplification and then another simplifier optimizing away the left shift > when log2(powerof2cst) was 0. Another one is signed BOOLEAN_TYPE with > precision > 1, where indeed we shouldn't be doing the negation in type, > because it isn't well defined in that type, the type only has 2 valid > values, 0 and -1. As an alternative, we could also e.g. cast to > signed 1-bit precision BOOLEAN_TYPE and then extend to type. > And the last case is what we were doing for types which have both 1 and -1 > (all all ones) as valid values (i.e. all signed/unsigned ENUMERAL_TYPEs, > INTEGRAL_TYPEs and BITINT_TYPEs with precision > 1). > > The following patch avoids the hops through << 0 for 1-bit precision > and uses build_nonstandard_integer_type solely for the BOOLEAN_TYPE types > (where we have a guarantee the precision is reasonably small, nothing ought > to be created 129+ bit precision BOOLEAN_TYPEs). > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? OK. > 2023-10-03 Jakub Jelinek > > PR tree-optimization/111668 > * match.pd (a ? CST1 : CST2): Handle the a ? -1 : 0 and > a ? 0 : -1 cases before the powerof2cst cases and differentiate > between 1-bit precision types, larger precision boolean types > and other integral types. Fix comment pastos and formatting. > > --- gcc/match.pd.jj 2023-10-02 09:42:01.657836005 +0200 > +++ gcc/match.pd 2023-10-03 10:33:30.817614648 +0200 > @@ -5100,36 +5100,53 @@ (define_operator_list SYNC_FETCH_AND_AND > (switch > (if (integer_zerop (@2)) > (switch > - /* a ? 1 : 0 -> a if 0 and 1 are integral types. */ > + /* a ? 1 : 0 -> a if 0 and 1 are integral types. */ > (if (integer_onep (@1)) > (convert (convert:boolean_type_node @0))) > + /* a ? -1 : 0 -> -a. */ > + (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@1)) > + (if (TYPE_PRECISION (type) == 1) > + /* For signed 1-bit precision just cast bool to the type. */ > + (convert (convert:boolean_type_node @0)) > + (if (TREE_CODE (type) == BOOLEAN_TYPE) > + (with { > + tree intt = build_nonstandard_integer_type (TYPE_PRECISION (type), > + TYPE_UNSIGNED (type)); > + } > + (convert (negate (convert:intt (convert:boolean_type_node @0))))) > + (negate (convert:type (convert:boolean_type_node @0)))))) > /* a ? powerof2cst : 0 -> a << (log2(powerof2cst)) */ > (if (INTEGRAL_TYPE_P (type) && integer_pow2p (@1)) > (with { > tree shift = build_int_cst (integer_type_node, tree_log2 (@1)); > } > - (lshift (convert (convert:boolean_type_node @0)) { shift; }))) > - /* a ? -1 : 0 -> -a. No need to check the TYPE_PRECISION not being 1 > - here as the powerof2cst case above will handle that case correctly. */ > - (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@1)) > - (negate (convert:type (convert:boolean_type_node @0)))))) > + (lshift (convert (convert:boolean_type_node @0)) { shift; }))))) > (if (integer_zerop (@1)) > (switch > - /* a ? 0 : 1 -> !a. */ > + /* a ? 0 : 1 -> !a. */ > (if (integer_onep (@2)) > (convert (bit_xor (convert:boolean_type_node @0) { boolean_true_node; }))) > - /* a ? powerof2cst : 0 -> (!a) << (log2(powerof2cst)) */ > + /* a ? 0 : -1 -> -(!a). */ > + (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@2)) > + (if (TYPE_PRECISION (type) == 1) > + /* For signed 1-bit precision just cast bool to the type. */ > + (convert (bit_xor (convert:boolean_type_node @0) { boolean_true_node; })) > + (if (TREE_CODE (type) == BOOLEAN_TYPE) > + (with { > + tree intt = build_nonstandard_integer_type (TYPE_PRECISION (type), > + TYPE_UNSIGNED (type)); > + } > + (convert (negate (convert:intt (bit_xor (convert:boolean_type_node @0) > + { boolean_true_node; }))))) > + (negate (convert:type (bit_xor (convert:boolean_type_node @0) > + { boolean_true_node; })))))) > + /* a ? 0 : powerof2cst -> (!a) << (log2(powerof2cst)) */ > (if (INTEGRAL_TYPE_P (type) && integer_pow2p (@2)) > (with { > tree shift = build_int_cst (integer_type_node, tree_log2 (@2)); > } > (lshift (convert (bit_xor (convert:boolean_type_node @0) > - { boolean_true_node; })) { shift; }))) > - /* a ? -1 : 0 -> -(!a). No need to check the TYPE_PRECISION not being 1 > - here as the powerof2cst case above will handle that case correctly. */ > - (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@2)) > - (negate (convert:type (bit_xor (convert:boolean_type_node @0) > - { boolean_true_node; })))))))) > + { boolean_true_node; })) { shift; }))))))) > > /* (a > 1) ? 0 : (cast)a is the same as (cast)(a == 1) > for unsigned types. */ > > Jakub > > -- Richard Biener SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)