On 4 April 2016 at 17:30, Jan Hubicka <hubi...@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 <rguent...@suse.de> >> > > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, >> > > HRB 21284 (AG Nuernberg) >> > >> > >> >> -- >> Richard Biener <rguent...@suse.de> >> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB >> 21284 (AG Nuernberg)
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,
ChangeLog
Description: Binary data