public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "hubicka at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug libstdc++/109442] Dead local copy of std::vector not removed from function Date: Sat, 11 May 2024 16:05:52 +0000 [thread overview] Message-ID: <bug-109442-4-bNLdkV8s8m@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-109442-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109442 --- Comment #19 from Jan Hubicka <hubicka at gcc dot gnu.org> --- Note that the testcase from PR115037 also shows that we are not able to optimize out dead stores to the vector, which is another quite noticeable problem. void test() { std::vector<int> test; test.push_back (1); } We alocate the block, store 1 and immediately delete it. void test () { int * test$D25839$_M_impl$D25146$_M_start; struct vector test; int * _61; <bb 2> [local count: 1073741824]: _61 = operator new (4); <bb 3> [local count: 1063439392]: *_61 = 1; operator delete (_61, 4); test ={v} {CLOBBER}; test ={v} {CLOBBER(eol)}; return; <bb 4> [count: 0]: <L1>: test ={v} {CLOBBER}; resx 2 } So my understanding is that we decided to not optimize away the dead stores since the particular operator delete does not pass test: /* If the call is to a replaceable operator delete and results from a delete expression as opposed to a direct call to such operator, then we can treat it as free. */ if (fndecl && DECL_IS_OPERATOR_DELETE_P (fndecl) && DECL_IS_REPLACEABLE_OPERATOR (fndecl) && gimple_call_from_new_or_delete (stmt)) return ". o "; This is because we believe that operator delete may be implemented in an insane way that inspects the values stored in the block being freed. I can sort of see that one can write standard conforming code that allocates some data that is POD and inspects it in destructor. However for std::vector this argument is not really applicable. Standard does specify that new/delete is used to allocate/deallocate the memory but does not say how the memory is organized or what happens before deallocation. (i.e. it is probably valid for std::vector to memset the block just before deallocating it). Similar argument can IMO be used for eliding unused memory allocations. It is kind of up to std::vector implementation on how many allocations/deallocations it does, right? So we need a way to annotate the new/delete calls in the standard library as safe for such optimizations (i.e. implement clang's __bulitin_operator_new/delete?) How clang manages to optimize this out without additional hinting?
next prev parent reply other threads:[~2024-05-11 16:05 UTC|newest] Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-04-06 19:00 [Bug tree-optimization/109442] New: " hiraditya at msn dot com 2023-04-11 13:28 ` [Bug tree-optimization/109442] " rguenth at gcc dot gnu.org 2023-04-11 13:33 ` redi at gcc dot gnu.org 2023-04-11 13:38 ` redi at gcc dot gnu.org 2023-04-12 7:40 ` [Bug libstdc++/109442] " rguenth at gcc dot gnu.org 2023-04-12 9:29 ` redi at gcc dot gnu.org 2023-04-12 9:45 ` rguenth at gcc dot gnu.org 2023-04-12 10:01 ` redi at gcc dot gnu.org 2023-04-12 10:13 ` redi at gcc dot gnu.org 2023-04-12 10:22 ` rguenth at gcc dot gnu.org 2023-04-12 10:29 ` redi at gcc dot gnu.org 2023-04-12 10:35 ` redi at gcc dot gnu.org 2023-04-12 11:52 ` rguenther at suse dot de 2023-04-12 11:55 ` redi at gcc dot gnu.org 2023-04-16 18:38 ` richard-gccbugzilla at metafoo dot co.uk 2023-04-17 6:49 ` rguenth at gcc dot gnu.org 2023-04-18 2:15 ` richard-gccbugzilla at metafoo dot co.uk 2023-06-15 18:38 ` hiraditya at msn dot com 2024-05-11 0:07 ` xry111 at gcc dot gnu.org 2024-05-11 16:05 ` hubicka at gcc dot gnu.org [this message] 2024-05-14 13:47 ` Jan Hubicka 2024-05-11 16:44 ` redi at gcc dot gnu.org 2024-05-14 13:47 ` hubicka at ucw dot cz
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-109442-4-bNLdkV8s8m@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).