Bug 37790 - limits-fnargs.c takes very long time to compile at -O2
Summary: limits-fnargs.c takes very long time to compile at -O2
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.4.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: compile-time-hog
Depends on:
Blocks:
 
Reported: 2008-10-09 22:28 UTC by Steve Ellcey
Modified: 2008-11-20 19:05 UTC (History)
3 users (show)

See Also:
Host:
Target: ia64-*-*
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Steve Ellcey 2008-10-09 22:28:37 UTC
The test case gcc-c-torture/compile/limits-fnargs.c takes multiple hours to compile at -O2 or above optimization on IA64.  It looks like most of the time is spent in IRA.  The IRA pass calls reload which calls ira_sort_regnos_for_alter_reg with n = 28977.  This in turn calls coalesce_spill_slots with num = 10061.  It is in the main loop of coalesce_spill_slots where I seem to spend a most of the time compiling limits-fnargs.c.
Comment 1 John David Anglin 2008-11-08 00:55:13 UTC
The same problem is present on hppa64.
Comment 2 Vladimir Makarov 2008-11-16 16:14:37 UTC
  I waited more than hour to compile it on 1.2Ghz itanium and canceled the compilation.  The problem is in coalescing stack slots.  The code was already rewritten for

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37448

  But it is not enough for limit-fnargs.c which has more 100K allocnos and practically the same number of final stack slots.

  So I rewrote it one more time.  The compilation time was decreased to decent 120 sec and PR37448 has still practically the same compilation time as the current version of the code.

  I'll sent the patch today for approval.
 
Comment 3 hjl@gcc.gnu.org 2008-11-16 19:49:03 UTC
Subject: Bug 37790

Author: hjl
Date: Sun Nov 16 19:47:40 2008
New Revision: 141924

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=141924
Log:
2008-11-16  Vladimir Makarov  <vmakarov@redhat.com>

	PR bootstrap/37790
	* ira-int.h (ira_copy_allocno_live_range_list,
	ira_merge_allocno_live_ranges,
	ira_allocno_live_ranges_intersect_p,
	ira_finish_allocno_live_range_list): New prototypes.
	(ira_allocno_live_ranges_intersect_p,
	ira_pseudo_live_ranges_intersect_p): Remove.

	* ira-conflicts.c (ira_allocno_live_ranges_intersect_p,
	ira_pseudo_live_ranges_intersect_p): Rename to
	allocnos_have_intersected_live_ranges_p and
	pseudos_have_intersected_live_ranges_p.  Move them from here to
	...

	* ira-color.c: ... here
	(coalesced_allocno_conflict_p): Use
	allocnos_have_intersected_live_ranges_p.
	(coalesced_allocnos_living_at_program_points,
	coalesced_allocnos_live_at_points_p,
	set_coalesced_allocnos_live_points): Remove.
	(slot_coalesced_allocnos_live_ranges,
	slot_coalesced_allocno_live_ranges_intersect_p,
	setup_slot_coalesced_allocno_live_ranges): New.
	(coalesce_spill_slots): Use ranges of coalesced allocnos.
	(ira_sort_regnos_for_alter_reg): Use
	allocnos_have_intersected_live_ranges_p.
	(ira_reuse_stack_slot): Use
	pseudos_have_intersected_live_ranges_p.

	* global.c (pseudo_for_reload_consideration_p): Check
	flag_ira_share_spill_slots too.

	* ira-build.c (copy_allocno_live_range_list): Rename to
	ira_copy_allocno_live_range_list.  Make it external.
	(merge_ranges): Rename to ira_merge_allocno_live_ranges.  Make it
	external.
	(ira_allocno_live_ranges_intersect_p): New.
	(ira_finish_allocno_live_range_list): New.
	(finish_allocno): Use it.
	(remove_unnecessary_allocnos): Use ira_merge_allocno_live_ranges.
	(copy_info_to_removed_store_destinations): Ditto.  Use
	ira_copy_allocno_live_range_list.
	(ira_flattening): Use ira_merge_allocno_live_ranges.

	* ira.c (too_high_register_pressure_p): New function.
	(ira): Switch off sharing spill slots if the pressure is too high.

Modified:
    branches/ira-merge/gcc/ChangeLog.ira
    branches/ira-merge/gcc/global.c
    branches/ira-merge/gcc/ira-build.c
    branches/ira-merge/gcc/ira-color.c
    branches/ira-merge/gcc/ira-conflicts.c
    branches/ira-merge/gcc/ira-int.h
    branches/ira-merge/gcc/ira.c

Comment 4 Vladimir Makarov 2008-11-19 21:22:11 UTC
Subject: Bug 37790

Author: vmakarov
Date: Wed Nov 19 21:20:44 2008
New Revision: 142017

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142017
Log:
2008-11-15  Vladimir Makarov  <vmakarov@redhat.com>

	PR bootstrap/37790
	* ira-int.h (ira_copy_allocno_live_range_list,
	ira_merge_allocno_live_ranges,
	ira_allocno_live_ranges_intersect_p,
	ira_finish_allocno_live_range_list): New prototypes.
	(ira_allocno_live_ranges_intersect_p,
	ira_pseudo_live_ranges_intersect_p): Remove.
	
	* ira-conflicts.c (ira_allocno_live_ranges_intersect_p,
	ira_pseudo_live_ranges_intersect_p): Rename to
	allocnos_have_intersected_live_ranges_p and
	pseudos_have_intersected_live_ranges_p.  Move them from here to
	...

	* ira-color.c: ... here
	(coalesced_allocno_conflict_p): Use
	allocnos_have_intersected_live_ranges_p.
	(coalesced_allocnos_living_at_program_points,
	coalesced_allocnos_live_at_points_p,
	set_coalesced_allocnos_live_points): Remove.
	(slot_coalesced_allocnos_live_ranges,
	slot_coalesced_allocno_live_ranges_intersect_p,
	setup_slot_coalesced_allocno_live_ranges): New.
	(coalesce_spill_slots): Use ranges of coalesced allocnos.
	(ira_sort_regnos_for_alter_reg): Use
	allocnos_have_intersected_live_ranges_p.
	(ira_reuse_stack_slot): Use
	pseudos_have_intersected_live_ranges_p.

	* global.c (pseudo_for_reload_consideration_p): Check
	flag_ira_share_spill_slots too.

	* ira-build.c (copy_allocno_live_range_list): Rename to
	ira_copy_allocno_live_range_list.  Make it external.
	(merge_ranges): Rename to ira_merge_allocno_live_ranges.  Make it
	external.
	(ira_allocno_live_ranges_intersect_p): New.
	(ira_finish_allocno_live_range_list): New.
	(finish_allocno): Use it.
	(remove_unnecessary_allocnos): Use ira_merge_allocno_live_ranges.
	(copy_info_to_removed_store_destinations): Ditto.  Use
	ira_copy_allocno_live_range_list.
	(ira_flattening): Use ira_merge_allocno_live_ranges.
	
	* ira.c (too_high_register_pressure_p): New function.
	(ira): Switch off sharing spill slots if the pressure is too high.


Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/global.c
    trunk/gcc/ira-build.c
    trunk/gcc/ira-color.c
    trunk/gcc/ira-conflicts.c
    trunk/gcc/ira-int.h
    trunk/gcc/ira.c

Comment 5 Steve Ellcey 2008-11-20 18:30:26 UTC
The limits-fnargs.c tests pass on my IA64 platforms (HP-UX and Linux).  It still failed on hppa64-*-hpux* with a timeout but my PA box is quite slow and I have other tests timing out there as well.  I am willing to call it fixed unless Dave wants to keep it open for the hppa64 platform.
Comment 6 dave 2008-11-20 18:59:07 UTC
Subject: Re:  limits-fnargs.c takes very long time to compile at -O2

> ------- Comment #5 from sje at cup dot hp dot com  2008-11-20 18:30 -------
> The limits-fnargs.c tests pass on my IA64 platforms (HP-UX and Linux).  It
> still failed on hppa64-*-hpux* with a timeout but my PA box is quite slow and I
> have other tests timing out there as well.  I am willing to call it fixed
> unless Dave wants to keep it open for the hppa64 platform.

It's no longer failing on my box, so I guess we can call it fixed.  I'm
sure things will get faster with checking off.

Still have:
WARNING: program timed out.
FAIL: gcc.dg/20020425-1.c (test for excess errors)

Dave
Comment 7 Steve Ellcey 2008-11-20 19:05:49 UTC
gcc.dg/20020425-1.c is a separate issue where the 'remove useless statements'
pass is very slow.  I will add some comments to that bug report soon if I can't come up with a fix.

Resolving this report as fixed.