From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 102717 invoked by alias); 9 Feb 2017 08:01:37 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 102702 invoked by uid 89); 9 Feb 2017 08:01:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=BAYES_00,KAM_ASCII_DIVIDERS,RP_MATCHES_RCVD,SPF_PASS autolearn=no version=3.3.2 spammy=niter, ***************, 2017-02-09, 20170209 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 09 Feb 2017 08:01:26 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 98269ACD3 for ; Thu, 9 Feb 2017 08:01:24 +0000 (UTC) Date: Thu, 09 Feb 2017 08:01:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PR78847 Message-ID: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-SW-Source: 2017-02/txt/msg00661.txt.bz2 The following patch fixes a missed optimization caused by niter analysis returning a complex pointer subtraction expression instead of a constant for a loop with a pointer IV (it looks like pointer IVs are quite common in libstdc++). Bootstrapped and tested on x86_64-unknown-linux-gnu. Not a regression (well, didn't try to find a release where we optimized the testcase, but it needs c++14 library support anyway). I'm also not quite sure associate_trees handles pointer types correctly (there is some pointer type handling in the associate case but POINTER_PLUS_EXPR folding for example does not dispatch to associate). I guess trying to add some more exhaustive testcases for GENERIC input is required. Thanks, Richard. 2017-02-09 Richard Biener PR tree-optimization/78847 * fold-const.c (split_tree): Handle POINTER_PLUS_EXPR. * g++.dg/tree-ssa/pr78847.C: New testcase. Index: gcc/fold-const.c =================================================================== *** gcc/fold-const.c (revision 245276) --- gcc/fold-const.c (working copy) *************** split_tree (location_t loc, tree in, tre *** 785,791 **** the value is not affected. For reals, the value might be affected, so we can't. */ && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR) ! || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR)))) { tree op0 = TREE_OPERAND (in, 0); tree op1 = TREE_OPERAND (in, 1); --- 785,793 ---- the value is not affected. For reals, the value might be affected, so we can't. */ && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR) ! || (code == MINUS_EXPR ! && (TREE_CODE (in) == PLUS_EXPR ! || TREE_CODE (in) == POINTER_PLUS_EXPR))))) { tree op0 = TREE_OPERAND (in, 0); tree op1 = TREE_OPERAND (in, 1); Index: gcc/testsuite/g++.dg/tree-ssa/pr78847.C =================================================================== *** gcc/testsuite/g++.dg/tree-ssa/pr78847.C (nonexistent) --- gcc/testsuite/g++.dg/tree-ssa/pr78847.C (working copy) *************** *** 0 **** --- 1,26 ---- + /* { dg-do compile } */ + /* { dg-require-effective-target c++14 } */ + /* { dg-options "-O3 -fdump-tree-ldist" } */ + + #include + #include + #include + + using string_view = std::experimental::string_view; + + class Foo { + constexpr static size_t Length = 9; + char ascii_[Length]; + public: + Foo(); + string_view view() const { + return string_view(ascii_, Length); + } + }; + + void testWithLoopValue(const Foo foo, size_t ptr, char *buf_) { + for (auto c : foo.view()) + buf_[ptr++] = c; + } + + /* { dg-final { scan-tree-dump "memcpy\[^\n\r\]*, 9\\);" "ldist" } } */