From patchwork Thu Nov 25 08:18:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 48122 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D5CAD385AC20 for ; Thu, 25 Nov 2021 08:19:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D5CAD385AC20 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1637828354; bh=XCpCh3lr3MXlyVksVsmcupoVuf7lijn3IYjG+wDCjdU=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=alhwmGy3JecV0VuxVZyOQ8s9wgO+ZHdSH1A3daxj+JLc2+aEpJU51V84kCIFLO3Zh hcewSOWJn3WJ3W/BvAF+VhPyx/hDtInXjruZYA9V21OjQ+WQaQFKfVm+ohKlmNm1ml /f/p1V4sxG0b22ExHaVR1VHEKV+sSwOv0CJdPC0o= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id E4E76385843B for ; Thu, 25 Nov 2021 08:18:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E4E76385843B Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-143-ciTEierHMhSAK19P7nQmow-1; Thu, 25 Nov 2021 03:18:41 -0500 X-MC-Unique: ciTEierHMhSAK19P7nQmow-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C9B9A1927838; Thu, 25 Nov 2021 08:18:39 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.23]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 429CA60854; Thu, 25 Nov 2021 08:18:39 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 1AP8Iaxs2565184 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 25 Nov 2021 09:18:36 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 1AP8IZIm2565183; Thu, 25 Nov 2021 09:18:35 +0100 Date: Thu, 25 Nov 2021 09:18:34 +0100 To: Richard Biener Subject: [PATCH] match.pd: Fix up the recent bitmask_inv_cst_vector_p simplification [PR103417] Message-ID: <20211125081834.GX2646553@tucnak> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-5.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jakub Jelinek via Gcc-patches From: Jakub Jelinek Reply-To: Jakub Jelinek Cc: gcc-patches@gcc.gnu.org Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi! The following testcase is miscompiled since the r12-5489-g0888d6bbe97e10 changes. The simplification triggers on (x & 4294967040U) >= 0U and turns it into: x <= 255U which is incorrect, it should fold to 1 because unsigned >= 0U is always true and normally the /* Non-equality compare simplifications from fold_binary */ (if (wi::to_wide (cst) == min) (if (cmp == GE_EXPR) { constant_boolean_node (true, type); }) simplification folds that, but this simplification was done earlier. The simplification correctly doesn't include lt which has the same reason why it shouldn't be handled, we'll fold it to 0 elsewhere. But, IMNSHO while it isn't incorrect to handle le and gt there, it is unnecessary. Because (x & cst) <= 0U and (x & cst) > 0U should never appear, again in /* Non-equality compare simplifications from fold_binary */ we have a simplification for it: (if (cmp == LE_EXPR) (eq @2 @1)) (if (cmp == GT_EXPR) (ne @2 @1)))) This is done for (cmp (convert?@2 @0) uniform_integer_cst_p@1) and so should be done for both integers and vectors. As the bitmask_inv_cst_vector_p simplification only handles eq and ne for signed types, I think it can be simplified to just following patch. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? I wonder if (for cst (VECTOR_CST INTEGER_CST) is good for the best size of *-match.c, wouldn't accepting just CONSTANT_CLASS_P@1 and then just say in bitmask_inv_cst_vector_p return NULL_TREE if it isn't INTEGER_CST or VECTOR_CST? Also, without/with this patch I see on i686-linux (can be reproduced with RUNTESTFLAGS="--target_board=unix/-m32/-mno-sse dg.exp='bic-bitmask* signbit-2*'" too): FAIL: gcc.dg/bic-bitmask-10.c scan-tree-dump dce7 "<=\\\\s*.+{ 255,.+}" FAIL: gcc.dg/bic-bitmask-11.c scan-tree-dump dce7 ">\\\\s*.+{ 255,.+}" FAIL: gcc.dg/bic-bitmask-12.c scan-tree-dump dce7 "<=\\\\s*.+{ 255,.+}" FAIL: gcc.dg/bic-bitmask-2.c scan-tree-dump-times dce7 "<=\\\\s*.+{ 255,.+}" 1 FAIL: gcc.dg/bic-bitmask-23.c (test for excess errors) FAIL: gcc.dg/bic-bitmask-23.c scan-tree-dump dce7 "<=\\\\s*.+{ 255, 15, 1, 65535 }" FAIL: gcc.dg/bic-bitmask-3.c scan-tree-dump-times dce7 "<=\\\\s*.+{ 255,.+}" 1 FAIL: gcc.dg/bic-bitmask-4.c scan-tree-dump-times dce7 "=\\\\s*.+{ 1,.+}" 1 FAIL: gcc.dg/bic-bitmask-5.c scan-tree-dump-times dce7 ">\\\\s*.+{ 255,.+}" 1 FAIL: gcc.dg/bic-bitmask-6.c scan-tree-dump-times dce7 "<=\\\\s*.+{ 255,.+}" 1 FAIL: gcc.dg/bic-bitmask-8.c scan-tree-dump-times dce7 ">\\\\s*.+{ 1,.+}" 1 FAIL: gcc.dg/bic-bitmask-9.c scan-tree-dump dce7 "&\\\\s*.+{ 4294967290,.+}" FAIL: gcc.dg/signbit-2.c scan-tree-dump optimized "\\\\s+>\\\\s+{ 0(, 0)+ }" Those tests use vect_int effective target, but AFAIK that can be used only in *.dg/vect/ because it relies on vect.exp enabling options to support vectorization on the particular target (e.g. for i686-linux that -msse2). I think there isn't other way to get the DEFAULT_VECTCFLAGS into dg-options other than having the test driven by vect.exp. And, finally, I've noticed incorrect formatting in the new bitmask_inv_cst_vector_p routine: do { if (idx > 0) cst = vector_cst_elt (t, idx); ... builder.quick_push (newcst); } while (++idx < nelts); It should be do { if (idx > 0) cst = vector_cst_elt (t, idx); ... builder.quick_push (newcst); } while (++idx < nelts); 2021-11-25 Jakub Jelinek PR tree-optimization/103417 * match.pd ((X & Y) CMP 0): Only handle eq and ne. Commonalize common tests. * gcc.c-torture/execute/pr103417.c: New test. Jakub --- gcc/match.pd.jj 2021-11-24 11:46:03.191918052 +0100 +++ gcc/match.pd 2021-11-24 22:33:43.852575772 +0100 @@ -5214,20 +5214,16 @@ (define_operator_list SYNC_FETCH_AND_AND /* Transform comparisons of the form (X & Y) CMP 0 to X CMP2 Z where ~Y + 1 == pow2 and Z = ~Y. */ (for cst (VECTOR_CST INTEGER_CST) - (for cmp (le eq ne ge gt) - icmp (le le gt le gt) - (simplify - (cmp (bit_and:c@2 @0 cst@1) integer_zerop) - (with { tree csts = bitmask_inv_cst_vector_p (@1); } - (switch - (if (csts && TYPE_UNSIGNED (TREE_TYPE (@1)) - && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2))) - (icmp @0 { csts; })) - (if (csts && !TYPE_UNSIGNED (TREE_TYPE (@1)) - && (cmp == EQ_EXPR || cmp == NE_EXPR) - && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2))) + (for cmp (eq ne) + icmp (le gt) + (simplify + (cmp (bit_and:c@2 @0 cst@1) integer_zerop) + (with { tree csts = bitmask_inv_cst_vector_p (@1); } + (if (csts && (VECTOR_TYPE_P (TREE_TYPE (@1)) || single_use (@2))) + (if (TYPE_UNSIGNED (TREE_TYPE (@1))) + (icmp @0 { csts; }) (with { tree utype = unsigned_type_for (TREE_TYPE (@1)); } - (icmp (convert:utype @0) { csts; })))))))) + (icmp (convert:utype @0) { csts; })))))))) /* -A CMP -B -> B CMP A. */ (for cmp (tcc_comparison) --- gcc/testsuite/gcc.c-torture/execute/pr103417.c.jj 2021-11-24 22:36:00.732626424 +0100 +++ gcc/testsuite/gcc.c-torture/execute/pr103417.c 2021-11-24 22:35:43.964865218 +0100 @@ -0,0 +1,11 @@ +/* PR tree-optimization/103417 */ + +struct { int a : 8; int b : 24; } c = { 0, 1 }; + +int +main () +{ + if (c.b && !c.b) + __builtin_abort (); + return 0; +}