public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "rguenth at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/105651] [12/13 Regression] bogus "may overlap" memcpy warning with std::string and operator+ at -O3 Date: Tue, 26 Jul 2022 09:57:23 +0000 [thread overview] Message-ID: <bug-105651-4-8NVEPsgiJ6@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-105651-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105651 Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Status|NEW |ASSIGNED CC| |jakub at gcc dot gnu.org, | |jwakely at redhat dot com --- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> --- ISTR seeing this before. We are quite confused by the standard library code comparing the address of a string literal with the local buffer: MEM[(char_type &)&D.42061 + 17] = 32; if (&D.42061.D.33506._M_local_buf >= &MEM <const char[2]> [(void *)"_" + 1B]) goto <bb 6>; [50.00%] else goto <bb 7>; [50.00%] if (&D.42061.D.33506._M_local_buf <= "_") goto <bb 8>; [50.00%] else goto <bb 9>; [50.00%] <bb 9> [local count: 21728216]: _97 = &D.42061.D.33506._M_local_buf - "_"; if (_97 == 1) goto <bb 6>; [34.00%] else goto <bb 10>; [66.00%] and we are afraid of optimizing relational compares of distinct objects (well, that's simply undefined and good QOI is to DWIM, simply leave the broken code around if there's no good way to choose true or false). This is all preceeded by an "overlap condition" working on integers (so not undefined), so what might work is to aggressively simplify relational compares of known distinct objects to __builtin_unreachable () (aka isolate the errorneous path). <bb 2> [local count: 1073741824]: MEM[(struct basic_string *)&D.42061] ={v} {CLOBBER}; MEM[(struct _Alloc_hider *)&D.42061] ={v} {CLOBBER}; MEM[(struct _Alloc_hider *)&D.42061]._M_p = &D.42061.D.33506._M_local_buf; MEM[(char_type &)&D.42061 + 16] = 32; D.42061._M_string_length = 1; __x.25_69 = (long unsigned int) "_"; __y.26_70 = (long unsigned int) &D.42061.D.33506._M_local_buf; if (__x.25_69 < __y.26_70) goto <bb 4>; [50.00%] else goto <bb 3>; [50.00%] <bb 3> [local count: 347651448]: __x.25_72 = (long unsigned int) &MEM <char[16]> [(void *)&D.42061 + 17B]; if (__x.25_69 > __x.25_72) goto <bb 4>; [50.00%] else goto <bb 5>; [50.00%] Alternatively somehow re-combine the above overlap test and simplify it statically. We are getting into Breakpoint 5, maybe_fold_and_comparisons (type=<boolean_type 0x7ffff68e2b28 bool>, code1=GE_EXPR, op1a=<ssa_name 0x7ffff4a88cf0 72>, op1b=<ssa_name 0x7ffff4a88c18 69>, code2=GE_EXPR, op2a=<ssa_name 0x7ffff4a88c18 69>, op2b=<ssa_name 0x7ffff4a88c60 70>, outer_cond_bb=<basic_block 0x7ffff4d69548 (2)>) we do have a patterns optimizing an overlap test (but not statically folding) with /* For pointers @0 and @2 and nonnegative constant offset @1, look for expressions like: A: (@0 + @1 < @2) | (@2 + @1 < @0) B: (@0 + @1 <= @2) | (@2 + @1 <= @0) ... unfortunately simple matching in match.pd falls foul of the PR105142 fix given _72 is computed in the inner block and thus maybe_fold_comparisons_from_match_pd is not going to pick that up. Without that fix (for cmp1 (lt le le lt) cmp2 (lt le lt le) (simplify (bit_and (cmp1:c (convert@4 @0) (convert @1)) (cmp2:c (convert@5 @2) (convert @3))) (if (TREE_CODE (@0) == ADDR_EXPR && TREE_CODE (@1) == ADDR_EXPR && TREE_CODE (@2) == ADDR_EXPR && TREE_CODE (@3) == ADDR_EXPR && INTEGRAL_TYPE_P (TREE_TYPE (@4)) && types_match (TREE_TYPE (@4), TREE_TYPE (@5))) (with { poly_int64 diff0, diff1; } (if (ptr_difference_const (@0, @3, &diff0) && ptr_difference_const (@1, @2, &diff1) && !ptr_derefs_may_alias_p (@0, @1)) { constant_boolean_node (false, type); }))))) works to detect this for the case of invariant addresses which have the offset included. It would need to be extended for cases where the increments are variable or the base address is not invariant (but common). I'm going to improve the PR105142 fix.
next prev parent reply other threads:[~2022-07-26 9:57 UTC|newest] Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-05-18 23:38 [Bug c++/105651] New: Failure compiling constexpr/__builtin_memcpy on Cygwin with -std=c++20 mckelvey at maskull dot com 2022-05-18 23:41 ` [Bug c++/105651] " mckelvey at maskull dot com 2022-05-19 0:10 ` [Bug tree-optimization/105651] bogus "may overlap" memcpy warning with std::string pinskia at gcc dot gnu.org 2022-05-19 6:19 ` rguenth at gcc dot gnu.org 2022-05-24 17:48 ` mckelvey at maskull dot com 2022-06-07 14:58 ` jens.maurer at gmx dot net 2022-06-21 17:33 ` pinskia at gcc dot gnu.org 2022-06-21 17:34 ` [Bug tree-optimization/105651] [12/13 Regression] " pinskia at gcc dot gnu.org 2022-06-21 17:38 ` pinskia at gcc dot gnu.org 2022-07-08 11:56 ` [Bug tree-optimization/105651] [12/13 Regression] bogus "may overlap" memcpy warning with std::string and operator+ at -O3 marxin at gcc dot gnu.org 2022-07-19 23:10 ` pinskia at gcc dot gnu.org 2022-07-26 9:57 ` rguenth at gcc dot gnu.org [this message] 2022-07-26 10:16 ` redi at gcc dot gnu.org 2022-07-26 10:20 ` jakub at gcc dot gnu.org 2022-07-26 10:36 ` redi at gcc dot gnu.org 2022-07-26 10:46 ` rguenther at suse dot de 2022-07-26 12:19 ` rguenth at gcc dot gnu.org 2022-08-03 9:57 ` redi at gcc dot gnu.org 2022-10-19 10:11 ` rguenth at gcc dot gnu.org 2022-10-19 10:48 ` redi at gcc dot gnu.org 2022-10-19 11:08 ` [Bug tree-optimization/105651] [12 " rguenth at gcc dot gnu.org 2022-12-12 10:24 ` rguenth at gcc dot gnu.org 2023-02-13 11:32 ` jg at jguk dot org 2023-04-20 4:44 ` pinskia at gcc dot gnu.org 2023-04-20 12:00 ` redi at gcc dot gnu.org 2023-05-08 12:24 ` rguenth at gcc dot gnu.org 2023-06-21 12:18 ` cvs-commit at gcc dot gnu.org 2023-06-21 12:22 ` redi at gcc dot gnu.org
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-105651-4-8NVEPsgiJ6@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).