This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Eliminate out-of-line body of local inlined subprograms


This improves a little the algorithm used to compute the set of externally
visible entities in package bodies to make it less conservative in the
presence of local inlined subprograms.  The typical effect is to eliminate
the out-of-line body if the subprogram is inlined at every call site:

package Q3 is

  procedure Caller;

end Q3;

package body Q3 is

  I : Integer := 0;

  procedure Inner is
  begin
    I := 1;
  end;

  procedure Proc;
  pragma Inline (Proc);

  procedure Proc is
  begin
    Inner;
  end;

  procedure Caller is
  begin
    Proc;
  end;

end Q3;

The out-of-line body of Proc is now eliminated at -O1 and above.

Tested on x86_64-pc-linux-gnu, committed on trunk

2017-09-06  Eric Botcazou  <ebotcazou@adacore.com>

	* inline.adb (Split_Unconstrained_Function): Also set Is_Inlined
	on the procedure created to encapsulate the body.
	* sem_ch7.adb: Add with clause for GNAT.HTable.
	(Entity_Table_Size): New constant.
	(Entity_Hash): New function.
	(Subprogram_Table): New instantiation of GNAT.Htable.Simple_HTable.
	(Is_Subprogram_Ref): Rename into...
	(Scan_Subprogram_Ref): ...this. Record references to subprograms in
	the table instead of bailing out on them. Scan the value of constants
	if it is not known at compile time.
	(Contains_Subprograms_Refs): Rename into...
	(Scan_Subprogram_Refs): ...this.
	(Has_Referencer): Scan the body of all inlined subprograms. Reset the
	Is_Public flag on subprograms if they are not actually referenced.
	(Hide_Public_Entities): Beef up comment on the algorithm.
	Reset the table of subprograms on entry.

Attachment: difs
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]