[PATCH] Make assert in gimple_phi_arg more strict

Richard Biener rguenther@suse.de
Thu Jul 20 10:05:00 GMT 2017


On Thu, 20 Jul 2017, Tom de Vries wrote:

> Hi,
> 
> this patch checks that gimple_phi_arg accesses args only in the inclusive
> 0..(nargs-1) region.
> 
> There are a couple of functions that manipulate args in the inclusive
> nargs..(capacity-1) region, so these have been updated to temporarily increase
> nargs to capacity while doing the manipulation.
> 
> Using this patch, I found PR81489 - "invalid phi argument used in
> find_implicit_erroneous_behavior".
> 
> Bootstrapped and reg-tested on x86_64.
> 
> OK for trunk?

I've used the following to only init the PHI node up to nargs, not
capacity (but still consistently zero things).  Currently 
bootstrapping/testing on x86_64-unknown-linux-gnu (plus the adjusted
assert of course).

I think it's slightly cleaner than adjusting nargs if it works out well.

Sorry for duplicating work here.

Thanks,
Richard.

Index: gcc/tree-phinodes.c
===================================================================
--- gcc/tree-phinodes.c	(revision 250379)
+++ gcc/tree-phinodes.c	(working copy)
@@ -190,7 +190,7 @@ make_phi_node (tree var, int len)
   else
     gimple_phi_set_result (phi, make_ssa_name (var, phi));
 
-  for (i = 0; i < capacity; i++)
+  for (i = 0; i < len; i++)
     {
       use_operand_p  imm;
 
@@ -248,6 +248,10 @@ resize_phi_node (gphi *phi, size_t len)
   new_phi = allocate_phi_node (len);
 
   memcpy (new_phi, phi, old_size);
+  memset ((char *)new_phi + old_size, 0,
+	  (sizeof (struct gphi)
+	   - sizeof (struct phi_arg_d)
+	   + sizeof (struct phi_arg_d) * len) - old_size);
 
   for (i = 0; i < gimple_phi_num_args (new_phi); i++)
     {
@@ -260,18 +264,6 @@ resize_phi_node (gphi *phi, size_t len)
 
   new_phi->capacity = len;
 
-  for (i = gimple_phi_num_args (new_phi); i < len; i++)
-    {
-      use_operand_p imm;
-
-      gimple_phi_arg_set_location (new_phi, i, UNKNOWN_LOCATION);
-      imm = gimple_phi_arg_imm_use_ptr (new_phi, i);
-      imm->use = gimple_phi_arg_def_ptr (new_phi, i);
-      imm->prev = NULL;
-      imm->next = NULL;
-      imm->loc.stmt = new_phi;
-    }
-
   return new_phi;
 }
 
@@ -300,6 +292,8 @@ reserve_phi_args_for_new_edge (basic_blo
 	  stmt = new_phi;
 	}
 
+      stmt->nargs++;
+
       /* We represent a "missing PHI argument" by placing NULL_TREE in
 	 the corresponding slot.  If PHI arguments were added
 	 immediately after an edge is created, this zeroing would not
@@ -307,10 +301,13 @@ reserve_phi_args_for_new_edge (basic_blo
 	 example, the loop optimizer duplicates several basic blocks,
 	 redirects edges, and then fixes up PHI arguments later in
 	 batch.  */
+      use_operand_p imm = gimple_phi_arg_imm_use_ptr (stmt, len - 1);
+      imm->use = gimple_phi_arg_def_ptr (stmt, len - 1);
+      imm->prev = NULL;
+      imm->next = NULL;
+      imm->loc.stmt = stmt;
       SET_PHI_ARG_DEF (stmt, len - 1, NULL_TREE);
       gimple_phi_arg_set_location (stmt, len - 1, UNKNOWN_LOCATION);
-
-      stmt->nargs++;
     }
 }
 



More information about the Gcc-patches mailing list