diff mbox

Do not leak function local blocks to global LTO stream

Message ID 20151125081114.GC58491@kam.mff.cuni.cz
State New
Headers show

Commit Message

Jan Hubicka Nov. 25, 2015, 8:11 a.m. UTC
Hi,
ipa-inline-analysis sometimes takes random IP invariant expression and stores
it to the summary.  This is similar to situation we treated earlier in ipa-prop.
We need to produce a local copy that does not have locators pointing to
function's body.

LTO-bootstrapped x86_64-linux, commited.

Honza

	* ipa-inline-analysis.c: Include gimplify.h
	(set_cond_stmt_execution_predicate,
	set_switch_stmt_execution_predicate): Be sure to not leak locations
	to function body.
diff mbox

Patch

Index: gcc/ipa-inline-analysis.c
===================================================================
--- gcc/ipa-inline-analysis.c	(revision 230847)
+++ gcc/ipa-inline-analysis.c	(working copy)
@@ -94,6 +94,7 @@  along with GCC; see the file COPYING3.
 #include "ipa-utils.h"
 #include "cilk.h"
 #include "cfgexpand.h"
+#include "gimplify.h"
 
 /* Estimate runtime of function can easilly run into huge numbers with many
    nested loops.  Be sure we can compute time * INLINE_SIZE_SCALE * 2 in an
@@ -1773,9 +1774,9 @@  set_cond_stmt_execution_predicate (struc
 	     unordered one.  Be sure it is not confused with NON_CONSTANT.  */
 	  if (this_code != ERROR_MARK)
 	    {
-	      struct predicate p = add_condition (summary, index, &aggpos,
-						  this_code,
-						  gimple_cond_rhs (last));
+	      struct predicate p = add_condition
+		 (summary, index, &aggpos, this_code,
+		  unshare_expr_without_location (gimple_cond_rhs (last)));
 	      e->aux = edge_predicate_pool.allocate ();
 	      *(struct predicate *) e->aux = p;
 	    }
@@ -1861,12 +1862,15 @@  set_switch_stmt_execution_predicate (str
       if (!min && !max)
 	p = true_predicate ();
       else if (!max)
-	p = add_condition (summary, index, &aggpos, EQ_EXPR, min);
+	p = add_condition (summary, index, &aggpos, EQ_EXPR,
+			   unshare_expr_without_location (min));
       else
 	{
 	  struct predicate p1, p2;
-	  p1 = add_condition (summary, index, &aggpos, GE_EXPR, min);
-	  p2 = add_condition (summary, index, &aggpos, LE_EXPR, max);
+	  p1 = add_condition (summary, index, &aggpos, GE_EXPR,
+			      unshare_expr_without_location (min));
+	  p2 = add_condition (summary, index, &aggpos, LE_EXPR,
+			      unshare_expr_without_location (max));
 	  p = and_predicates (summary->conds, &p1, &p2);
 	}
       *(struct predicate *) e->aux