From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17743 invoked by alias); 10 Mar 2015 11:54:40 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 17673 invoked by uid 48); 10 Mar 2015 11:54:36 -0000 From: "rguenth at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/44563] GCC uses a lot of RAM when compiling a large numbers of functions Date: Tue, 10 Mar 2015 11:54:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 4.3.4 X-Bugzilla-Keywords: compile-time-hog, memory-hog X-Bugzilla-Severity: normal X-Bugzilla-Who: rguenth at gcc dot gnu.org X-Bugzilla-Status: NEW X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2015-03/txt/msg01106.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44563 --- Comment #23 from Richard Biener --- Funnily apart from the IPA inline summary updating issue the next important time-hog is basic-block splitting we do for inlining a call. This is because split_block moves the tail of the block to a new one (and we process inlines from BB head to BB start). And thus we hit gimple_set_bb () quite hard (quadratic in the number of calls in main() which is composed of a single BB). So in theory it's better to work backwards from the BB - but that doesn't play well with catching all BBs in gimple_expand_calls_inline and its caller. We are talking about 8% of compile-time spent in gimple_set_bb here (according to callgrind). It's bad that splitting blocks is O(n) (but that stmt -> bb pointer saves us in other places). If we'd know that we perform multiple inlinings in a block we could use a special "split block" function that splits the block in multiple places at once, avoiding the quadraticness seen here. Basically first split all calls that we want to inline to separate blocks and then do the actual inlining run.