This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] enhance strlen to understand MEM_REF and partial overlaps (PR 86042, 86043)
- From: Martin Sebor <msebor at gmail dot com>
- To: Jeff Law <law at redhat dot com>, Gcc Patch List <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 26 Jul 2018 10:50:36 -0600
- Subject: Re: [PATCH] enhance strlen to understand MEM_REF and partial overlaps (PR 86042, 86043)
- References: <cbcae34c-0ba6-b2a4-350d-c8ea3d2f13ba@gmail.com> <ac278199-810c-2355-f901-08429940669a@redhat.com>
On 06/29/2018 11:05 AM, Jeff Law wrote:
On 06/07/2018 09:57 AM, Martin Sebor wrote:
The attached patch enhances the strlen pass to more consistently
deal with MEM_REF assignments (PR 86042) and to track string
lengths across calls to memcpy that overwrite parts of a string
with sequences of non-nul characters (PR 86043).
Fixes for both bugs rely on changes to the same code so I chose
to include them in the same patch.
To fix PR 86042 the patch extends handle_char_store() to deal with
more forms of multi-character assignments from MEM_REF (originally
introduced in r256180). To handle assignments from strings of
multiple nuls the patch also extends the initializer_zerop()
function to understand MEM_REFs of the form:
MEM[(char * {ref-all})&a] = MEM[(char * {ref-all})"..."];
The solution for PR 86043 consists of two parts: the extension
above which lets handle_char_store() recognize assignments of
sequences of non-null characters that overwrite some portion of
the leading non-zero characters in the destination and avoid
discarding the destination information, and a similar extension
to handle_builtin_memcpy().
Martin
gcc-86042.diff
PR tree-optimization/86042 - missing strlen optimization after second strcpy
gcc/ChangeLog:
PR tree-optimization/86042
* tree-ssa-strlen.c (handle_builtin_memcpy): Handle strict overlaps.
(get_string_cst_length): Rename...
(get_min_string_length): ...to this. Add argument.
(handle_char_store): Extend to handle multi-character stores by
MEM_REF.
* tree.c (initializer_zerop): Use new argument. Handle MEM_REF.
* tree.h (initializer_zerop): Add argument.
gcc/testsuite/ChangeLog:
PR tree-optimization/86042
* gcc.dg/strlenopt-44.c: New test.
OK.
I missed your approval and didn't get to committing the patch
until today. While retesting it on top of fresh trunk I noticed
a few test failures due to other recent strlen changes. I made
adjustments to the patch to avoid most of them and opened bug
86688 for one that I think needs a separate code change and
xfailed the test cases until the bug gets resolved.
Martin