diff mbox series

Fix noreorder symbol partitioning reversion.

Message ID 202e1157-ad61-efcd-da5e-14f3754e0078@suse.cz
State New
Headers show
Series Fix noreorder symbol partitioning reversion. | expand

Commit Message

Martin Liška Jan. 16, 2020, 7:43 p.m. UTC
Hi.

The patch is fixes a regression in libgcrypt package where
we incorrectly forget to stream out a definition of a no-reorder symbol.
It's caused by LTO balanced map reversion, where we do not revert
also best_noreorder_pos.

It's pre-approved patch by Honza and I'm going to install it.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Thanks,
Martin


gcc/lto/ChangeLog:

2020-01-16  Martin Liska  <mliska@suse.cz>

	* lto-partition.c (lto_balanced_map): Remember
	best_noreorder_pos and then restore to it
	when we revert.
---
  gcc/lto/lto-partition.c | 3 +++
  1 file changed, 3 insertions(+)

Comments

Jan Hubicka Jan. 16, 2020, 9:24 p.m. UTC | #1
> Hi.
> 
> The patch is fixes a regression in libgcrypt package where
> we incorrectly forget to stream out a definition of a no-reorder symbol.
> It's caused by LTO balanced map reversion, where we do not revert
> also best_noreorder_pos.
> 
> It's pre-approved patch by Honza and I'm going to install it.
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> 
> Thanks,
> Martin
> 
> 
> gcc/lto/ChangeLog:
> 
> 2020-01-16  Martin Liska  <mliska@suse.cz>
> 
> 	* lto-partition.c (lto_balanced_map): Remember
> 	best_noreorder_pos and then restore to it
> 	when we revert.

Thanks,
also please backport it to release branches once it survives some
testing in mainline.

Honza
Jeff Law Jan. 18, 2020, 12:07 a.m. UTC | #2
On Thu, 2020-01-16 at 20:43 +0100, Martin Liška wrote:
> Hi.
> 
> The patch is fixes a regression in libgcrypt package where
> we incorrectly forget to stream out a definition of a no-reorder symbol.
> It's caused by LTO balanced map reversion, where we do not revert
> also best_noreorder_pos.
> 
> It's pre-approved patch by Honza and I'm going to install it.
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> 
> Thanks,
> Martin
> 
> 
> gcc/lto/ChangeLog:
> 
> 2020-01-16  Martin Liska  <mliska@suse.cz>
> 
> 	* lto-partition.c (lto_balanced_map): Remember
> 	best_noreorder_pos and then restore to it
> 	when we revert.
Thank you!  That addressed several niggling failures.

jeff
>
Jan Hubicka Jan. 18, 2020, 11:12 a.m. UTC | #3
> On Thu, 2020-01-16 at 20:43 +0100, Martin Liška wrote:
> > Hi.
> > 
> > The patch is fixes a regression in libgcrypt package where
> > we incorrectly forget to stream out a definition of a no-reorder symbol.
> > It's caused by LTO balanced map reversion, where we do not revert
> > also best_noreorder_pos.
> > 
> > It's pre-approved patch by Honza and I'm going to install it.
> > Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> > 
> > Thanks,
> > Martin
> > 
> > 
> > gcc/lto/ChangeLog:
> > 
> > 2020-01-16  Martin Liska  <mliska@suse.cz>
> > 
> > 	* lto-partition.c (lto_balanced_map): Remember
> > 	best_noreorder_pos and then restore to it
> > 	when we revert.
> Thank you!  That addressed several niggling failures.

Yep, it is quite intereesting the bug survived multiple releases since
the initial Andi's kernel work.
On the other hand it reproduces only if you mix in -O0 modules or use
explicit -fno-toplevel-reorder.  So if you see it in packages it is
worth to investigate if build flags are not broken.
-O0 -flto is not the most powerful optimization to do.

Honza
> 
> jeff
> > 
>
Martin Liška Jan. 20, 2020, 11:09 a.m. UTC | #4
Hi.

I've just tested the backport on both GCC 8 and 9 branches.

I'm going to install it.
Martin
diff mbox series

Patch

diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 3a9990903c7..8e0488ab13e 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -471,6 +471,7 @@  void
 lto_balanced_map (int n_lto_partitions, int max_partition_size)
 {
   int n_varpool_nodes = 0, varpool_pos = 0, best_varpool_pos = 0;
+  int best_noreorder_pos = 0;
   auto_vec <cgraph_node *> order (symtab->cgraph_count);
   auto_vec<cgraph_node *> noreorder;
   auto_vec<varpool_node *> varpool_order;
@@ -732,6 +733,7 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
 	  best_i = i;
 	  best_n_nodes = lto_symtab_encoder_size (partition->encoder);
 	  best_varpool_pos = varpool_pos;
+	  best_noreorder_pos = noreorder_pos;
 	}
       if (dump_file)
 	fprintf (dump_file, "Step %i: added %s, size %i, "
@@ -752,6 +754,7 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
 			 i - best_i, best_i);
 	      undo_partition (partition, best_n_nodes);
 	      varpool_pos = best_varpool_pos;
+	      noreorder_pos = best_noreorder_pos;
 	    }
 	  gcc_assert (best_size == partition->insns);
 	  i = best_i;