------- Additional Comments From pinskia at gcc dot gnu dot org 2005-08-17 02:23 ------- Confirmed, there are two different issues here because it looks like the pool allocator injects code which initializes a variable, even though there is a different way of doing the initialization. It should be doing the say initialization as the cout/cin/cerr initializes its streams. This causes us when we call erase: if (*_ZGVZN9__gnu_cxx20__common_pool_policyINS_6__poolELb1EE11_S_get_poolEvE7_S_pool.62 == 0) goto <L12>; else goto <L2>;
<L12>:; _S_pool.D.8154._M_options._M_align = 8; _S_pool.D.8154._M_options._M_max_bytes = 128; _S_pool.D.8154._M_options._M_min_bin = 8; _S_pool.D.8154._M_options._M_chunk_size = 4080; _S_pool.D.8154._M_options._M_max_threads = 4096; _S_pool.D.8154._M_options._M_freelist_headroom = 10; D.12526 = getenv (&"GLIBCXX_FORCE_NEW"[0]); _S_pool.D.8154._M_options._M_force_new = D.12526 != 0B; _S_pool.D.8154._M_binmap = 0B; _S_pool.D.8154._M_init = 0; _S_pool._M_bin = 0B; _S_pool._M_bin_size = 1; _S_pool._M_thread_freelist = 0B; _S_pool._M_once = 0; *_ZGVZN9__gnu_cxx20__common_pool_policyINS_6__poolELb1EE11_S_get_poolEvE7_S_pool.62 = 1; which blocks a lot of the other optimizations because there is a function call and there is always a branch. This is not a problem on PPC-darwin where we don't have this "junk". Second we don't inline erase into clear for some reason. I could not figure it out from the dumps maybe someone else will be able to. The rest is for the reporter really (and any one who is writting missed optimization bugs) A better way of seeing the different is: #include <vector> std::vector<int> v; void clear1() { v.clear(); } void clear2(){ v.erase(v.begin(), v.end()); } As using asm("#start1"); can be moved around and for your example at -O3, we actually get an empty function as v is known to be unused. -- What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |enhancement Status|UNCONFIRMED |NEW Ever Confirmed| |1 GCC host triplet|i686-unknown-linux-gnu | GCC target triplet| |i686-*-linux-gnu Keywords| |missed-optimization Last reconfirmed|0000-00-00 00:00:00 |2005-08-17 02:23:28 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23425