From: Mark Mitchell <mmitchell@usa.net>
To: "Jeffrey A. Law" <law@schirf.cs.utah.edu>,
Jason Merrill <jason@cygnus.com>,
Fred Richardson <frichard@bbn.com>
Cc: egcs@cygnus.com
Subject: Patch for memory blowup
Date: Thu, 11 Dec 1997 17:11:00 -0000 [thread overview]
Message-ID: <199712120113.RAA26139@supernova.earthlink.net> (raw)
I believe I have a patch (attached) for the memory explosions that
occur when using g++ -O2 -Wall with lots of templates. See for
example:
http://www.cygnus.com/ml/egcs/1997-Oct/0300.html
This is also mentioned in the FAQ.
The diffs below look longer than they are due to an indentation change
that happened when a set of curly braces went away. Fred's program:
#include <stdlib.h>
#include <iostream.h>
#include <algorithm>
#include <vector.h>
int main()
{
vector<int> int_vec(size_t(5), int(1));
vector<vector<int> > int_vec_vec(size_t(7), int_vec);
vector<vector<vector<int> > > int_vec_vec_vec(size_t(9), int_vec_vec);
cout << int_vec_vec_vec[3][3][3] << endl;
cout << "wow" << endl;
}
which used to use >200M now compiles as gently as without -Wall. And,
the .s file generated (I checked -O3 -Wall, actually) is precisely the
same as without -Wall.
--
Mark Mitchell mmitchell@usa.net
Stanford University http://www.stanford.edu
Index: gcc/toplev.c
===================================================================
RCS file: /home/mitchell/Repository/egcs/gcc/toplev.c,v
retrieving revision 1.1.1.4
diff -c -p -r1.1.1.4 toplev.c
*** toplev.c 1997/12/08 07:30:40 1.1.1.4
--- toplev.c 1997/12/12 00:09:17
*************** rest_of_compilation (decl)
*** 3116,3150 ****
{
DECL_DEFER_OUTPUT (decl) = 1;
! /* If -Wreturn-type, we have to do a bit of compilation. */
! if (! warn_return_type)
{
#ifdef DWARF_DEBUGGING_INFO
! /* Generate the DWARF info for the "abstract" instance
! of a function which we may later generate inlined and/or
! out-of-line instances of. */
! if (write_symbols == DWARF_DEBUG)
! {
! set_decl_abstract_flags (decl, 1);
! TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
! set_decl_abstract_flags (decl, 0);
! }
#endif
#ifdef DWARF2_DEBUGGING_INFO
! /* Generate the DWARF2 info for the "abstract" instance
! of a function which we may later generate inlined and/or
! out-of-line instances of. */
! if (write_symbols == DWARF2_DEBUG)
! {
! set_decl_abstract_flags (decl, 1);
! TIMEVAR (symout_time, dwarf2out_decl (decl));
! set_decl_abstract_flags (decl, 0);
! }
! #endif
! TIMEVAR (integration_time, save_for_inline_nocopy (decl));
! RTX_INTEGRATED_P (DECL_SAVED_INSNS (decl)) = inlinable;
! goto exit_rest_of_compilation;
}
}
/* If we have to compile the function now, save its rtl and subdecls
--- 3116,3163 ----
{
DECL_DEFER_OUTPUT (decl) = 1;
! /* If -Wreturn-type, we have to do a bit of compilation.
! However, if we just fall through we will call
! save_for_inline_copying() which results in excessive
! memory use. Instead, we just want to call
! jump_optimize() to figure out whether or not we can fall
! off the end of the function; we do the minimum amount of
! work necessary to make that safe. And, we set optimize
! to zero to keep jump_optimize from working too hard. */
! if (warn_return_type)
{
+ int saved_optimize = optimize;
+ optimize = 0;
+ find_exception_handler_labels ();
+ jump_optimize (get_insns(), 0, 0, 0);
+ optimize = saved_optimize;
+ }
+
#ifdef DWARF_DEBUGGING_INFO
! /* Generate the DWARF info for the "abstract" instance
! of a function which we may later generate inlined and/or
! out-of-line instances of. */
! if (write_symbols == DWARF_DEBUG)
! {
! set_decl_abstract_flags (decl, 1);
! TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
! set_decl_abstract_flags (decl, 0);
! }
#endif
#ifdef DWARF2_DEBUGGING_INFO
! /* Generate the DWARF2 info for the "abstract" instance
! of a function which we may later generate inlined and/or
! out-of-line instances of. */
! if (write_symbols == DWARF2_DEBUG)
! {
! set_decl_abstract_flags (decl, 1);
! TIMEVAR (symout_time, dwarf2out_decl (decl));
! set_decl_abstract_flags (decl, 0);
}
+ #endif
+ TIMEVAR (integration_time, save_for_inline_nocopy (decl));
+ RTX_INTEGRATED_P (DECL_SAVED_INSNS (decl)) = inlinable;
+ goto exit_rest_of_compilation;
}
/* If we have to compile the function now, save its rtl and subdecls
next reply other threads:[~1997-12-11 17:11 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
1997-12-11 17:11 Mark Mitchell [this message]
1997-12-11 22:59 ` Mark Mitchell
1997-12-15 10:37 ` Jeffrey A Law
1997-12-11 23:55 ` Tudor Hulubei
1997-12-12 7:40 ` Bruce Korb
1997-12-12 7:49 ` Jeffrey A Law
1997-12-12 10:18 ` Mark Mitchell
1997-12-12 17:52 Peter Schmid
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=199712120113.RAA26139@supernova.earthlink.net \
--to=mmitchell@usa.net \
--cc=egcs@cygnus.com \
--cc=frichard@bbn.com \
--cc=jason@cygnus.com \
--cc=law@schirf.cs.utah.edu \
/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: link
Be 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).