From patchwork Tue Aug 9 14:04:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 657272 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3s7wyX0ShCz9sxR for ; Wed, 10 Aug 2016 00:04:51 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=CJfWTKoo; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=vn9P2IMmGGW5 WxuF+Q7vPUvQHbw4UGV7jMb8BdMlsL5+yNWksbTk0vWTvvQDQxYPPUXe/fXpIOXT zzt4q41aCtz7rE7ubBHn2nw+LthPAky6iLjD3b1XoiNwP7RVNTIPfZDrPxXBxJz+ 3p0IBU6XgFk49CNxwR+79QvbO/bH7qE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; s=default; bh=/1ccaq/lJNKh/qRRyE IzFIzkXxo=; b=CJfWTKooIHYiTSlKW5jtlCqV2EuQEQrRAZZIhLb6LH8u5juCQF DulhnBGRGVHwYHJEC7EPgqnvOA8XQ1gC10T3899ucbbcIBT6+ffh9tumCIUglhnt p2U3DksMKe7FvAOUbw/yr/Q6vtti//nvN8Iba5HY3YT7ZNLtDwk27jiFI= Received: (qmail 46366 invoked by alias); 9 Aug 2016 14:04:42 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 46341 invoked by uid 89); 9 Aug 2016 14:04:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=H*Ad:U*patrick, aos, H*Ad:D*cx X-HELO: mail-qk0-f195.google.com Received: from mail-qk0-f195.google.com (HELO mail-qk0-f195.google.com) (209.85.220.195) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 09 Aug 2016 14:04:31 +0000 Received: by mail-qk0-f195.google.com with SMTP id o1so1060288qkd.2 for ; Tue, 09 Aug 2016 07:04:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Q+50bpVCj7zlz7x6aelimA/meOgm0LB5QguOm5O6JZM=; b=CKkqJowwbfpSdCyyZOHhQGrihAXExPr+CPHKbtknstS22VCnT/qQdvdFZbb+skjcpQ TgnZ0tvGQjg94mnw9xNKXn4fa+I8MRgm5EE07J+7rU6wNy+h/LKialEL3B/uByJ3lK4x 5/OACIrjnilkJQfZWGIP/G8JWrRfhvuI9oACfxcr64snIhilnjp6aNOhHhSrgRxRnHzb 8nHhvoGtnczxhqHkBecpCyUZYbWKR2jgAkPqo4exsGXHBV7QE1ErAxkckObdYefcthOk sI3C/vE34gS+0Yejrubw7xZNzgNwfRo9mqUBoB27N5n49H4ySvmk7jwWXHB0V2x/naCI NYbg== X-Gm-Message-State: AEkoouvILKg0MOgX77FVBUIbXDHB2SGeCFXUtRCSKlrJop6uYaAveN8CUeLzWhmRPtbYCw== X-Received: by 10.55.106.131 with SMTP id f125mr9348950qkc.25.1470751467822; Tue, 09 Aug 2016 07:04:27 -0700 (PDT) Received: from localhost.localdomain (ool-4353abbc.dyn.optonline.net. [67.83.171.188]) by smtp.gmail.com with ESMTPSA id x185sm11381370qkb.14.2016.08.09.07.04.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Aug 2016 07:04:27 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Cc: Patrick Palka Subject: [PATCH] Fix PR middle-end/71654 (missed shortening of a compare) Date: Tue, 9 Aug 2016 10:04:16 -0400 Message-Id: <20160809140416.3352-1-patrick@parcs.ath.cx> Hi, this patch makes match.pd to shorten comparisons that involve a sign-changing cast from a shorter unsigned type to a wider signed type. This should be safe to do because a wider signed type can hold all the possible values of a shorter unsigned type. This change causes vrp23.c and vrp24.c to fail because it makes the "n_sets > 0" tests within get trivially simplified by forwprop and so there is nothing left to simplify by VRP. Fixed by passing -fno-tree-forwprop in these tests. Bootstrapped + regtested on x86_64-pc-linux-gnu. Does this look OK to commit? gcc/ChangeLog: PR middle-end/71654 * match.pd ((T)A CMP (T)B -> A CMP B): Allow (T)A to be a sign-changing cast from a shorter unsigned type to a wider signed type. gcc/testsuite/ChangeLog: PR middle-end/71654 * gcc.dg/c-c++-common/pr71654.c: New test. * gcc.dg/tree-ssa/vrp23: Add -fno-tree-forwprop to dg-options. * gcc.dg/tree-ssa/vrp24: Likewise. --- gcc/match.pd | 4 +++- gcc/testsuite/c-c++-common/pr71654.c | 28 ++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp23.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/vrp24.c | 2 +- 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr71654.c diff --git a/gcc/match.pd b/gcc/match.pd index ac7cfff..da87b02 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2350,7 +2350,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (TREE_TYPE (@00))) /* If possible, express the comparison in the shorter mode. */ (if ((cmp == EQ_EXPR || cmp == NE_EXPR - || TYPE_UNSIGNED (TREE_TYPE (@0)) == TYPE_UNSIGNED (TREE_TYPE (@00))) + || TYPE_UNSIGNED (TREE_TYPE (@0)) == TYPE_UNSIGNED (TREE_TYPE (@00)) + || (!TYPE_UNSIGNED (TREE_TYPE (@0)) + && TYPE_UNSIGNED (TREE_TYPE (@00)))) && (types_match (TREE_TYPE (@10), TREE_TYPE (@00)) || ((TYPE_PRECISION (TREE_TYPE (@00)) >= TYPE_PRECISION (TREE_TYPE (@10))) diff --git a/gcc/testsuite/c-c++-common/pr71654.c b/gcc/testsuite/c-c++-common/pr71654.c new file mode 100644 index 0000000..2942493 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr71654.c @@ -0,0 +1,28 @@ +/* PR middle-end/71654 */ +/* { dg-do link } */ +/* { dg-options "-O2" } */ + +unsigned char i0, i1; + +void foo (void); + +int +main (void) +{ + int j = i0; + if (j < 4) + { + if (i0 & 4) + foo (); + } + + unsigned int k = i1; + if (k < 8) + { + if (i1 & 8) + foo (); + } + + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c index b877ccc..ae68c090 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ +/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details" } */ void aa (void); void aos (void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c index e740575..853ee21 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ +/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details" } */ struct rtx_def;