diff mbox

[RFC] introduce --param max-lto-partition for having an upper bound on partition size

Message ID CAAgBjM=3k7YMB4AvDeFAgrBJpLKeJiQPGFHtyNT9pXqLqo2LGQ@mail.gmail.com
State New
Headers show

Commit Message

Prathamesh Kulkarni April 4, 2016, 1:27 p.m. UTC
On 4 April 2016 at 17:30, Jan Hubicka <hubicka@ucw.cz> wrote:
>> > Um not sure if I understood correctly.

>> > Do we want to constrain individual partition size by adding parameter

>> > lto-max-partition

>> > for balanced partitioning but not for -flto-partition=one

>> > case (since latter would also change semantics of =one) ?

>>

>> Yes, I think so.

>

> Yep, I agree.  Having partition one that produces multiple partitions doesn't seem to make much sense.

> Given that we have such not so predictable target specific limits on size of single translation unit

> we can handle, I suppose adding a resonable limit to the default balanced partitioning makes more sense.

> One can always push the behaviour you intend by setting max partitions to 1 (I suppose max size should

> have precedence over max partitions)

Thanks for the suggestions, I have updated the patch.
Is it OK if it passes bootstrap+test ?

Thanks,
Prathamesh
>

> Honza

>>

>> Richard.

>>

>> > Thanks,

>> > Prathamesh

>> > >

>> > > Richard.

>> > >

>> > > --

>> > > Richard Biener <rguenther@suse.de>

>> > > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)

>> >

>> >

>>

>> --

>> Richard Biener <rguenther@suse.de>

>> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)
diff mbox

Patch

diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 9eb63c2..bc0c612 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -511,9 +511,20 @@  lto_balanced_map (int n_lto_partitions)
   varpool_order.qsort (varpool_node_cmp);
 
   /* Compute partition size and create the first partition.  */
+  if (PARAM_VALUE (MIN_PARTITION_SIZE) > PARAM_VALUE (MAX_PARTITION_SIZE))
+    fatal_error (input_location, "min partition size cannot be greater than max partition size");
+
   partition_size = total_size / n_lto_partitions;
   if (partition_size < PARAM_VALUE (MIN_PARTITION_SIZE))
     partition_size = PARAM_VALUE (MIN_PARTITION_SIZE);
+  else if (partition_size > PARAM_VALUE (MAX_PARTITION_SIZE))
+    {
+      n_lto_partitions = total_size / PARAM_VALUE (MAX_PARTITION_SIZE);
+      if (total_size % PARAM_VALUE (MAX_PARTITION_SIZE))
+	n_lto_partitions++;
+      partition_size = total_size / n_lto_partitions;
+    }
+
   npartitions = 1;
   partition = new_partition ("");
   if (symtab->dump_file)
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 9dd513f..294b8a4 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -3112,6 +3112,12 @@  do_whole_program_analysis (void)
   timevar_pop (TV_WHOPR_WPA);
 
   timevar_push (TV_WHOPR_PARTITIONING);
+
+  if (flag_lto_partition != LTO_PARTITION_BALANCED
+      && PARAM_VALUE (MAX_PARTITION_SIZE) != INT_MAX)
+    fatal_error (input_location, "--param max-lto-partition should only"
+		 " be used with balanced partitioning\n");
+
   if (flag_lto_partition == LTO_PARTITION_1TO1)
     lto_1_to_1_map ();
   else if (flag_lto_partition == LTO_PARTITION_MAX)
diff --git a/gcc/params.def b/gcc/params.def
index 9362c15..b6055ff 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -1029,6 +1029,11 @@  DEFPARAM (MIN_PARTITION_SIZE,
 	  "Minimal size of a partition for LTO (in estimated instructions).",
 	  1000, 0, 0)
 
+DEFPARAM (MAX_PARTITION_SIZE,
+	  "lto-max-partition",
+	  "Maximal size of a partition for LTO (in estimated instructions).",
+	  INT_MAX, 0, INT_MAX)
+
 /* Diagnostic parameters.  */
 
 DEFPARAM (CXX_MAX_NAMESPACES_FOR_DIAGNOSTIC_HELP,