re PR tree-optimization/17468 (Java garbage collector miscompiled at -O1 and higher)
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Wed, 15 Sep 2004 07:51:33 +0000 (09:51 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Wed, 15 Sep 2004 07:51:33 +0000 (07:51 +0000)
PR tree-optimization/17468
* tree-ssa.c (verify_use, verify_phi_args, verify_ssa):  Verify that
definition inside a block precede uses.
* tree-tailcall.c (adjust_return_value): Emit statements in the
correct order.

From-SVN: r87538

gcc/ChangeLog
gcc/tree-ssa.c
gcc/tree-tailcall.c

index 113cda714d2454da49fee27a88b870ff8d1c603d..5432bd55a8577d50c47855938d0d5d1e1dadf258 100644 (file)
@@ -1,3 +1,11 @@
+2004-09-15  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       PR tree-optimization/17468
+       * tree-ssa.c (verify_use, verify_phi_args, verify_ssa):  Verify that
+       definition inside a block precede uses.
+       * tree-tailcall.c (adjust_return_value): Emit statements in the
+       correct order.
+
 2004-09-15  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips.h (POINTERS_EXTEND_UNSIGNED): Delete.
index c1efa1a1f4ec4556aa59e47bdf35298b21510965..8e0975570c2a592025e72d9a6980c84c46475d00 100644 (file)
@@ -207,11 +207,15 @@ err:
       arguments).
 
    IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
-      V_MUST_DEF.  */
+      V_MUST_DEF.
+   
+   If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
+     that are defined before STMT in basic block BB.  */
 
 static bool
 verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
-           tree stmt, bool check_abnormal, bool is_virtual)
+           tree stmt, bool check_abnormal, bool is_virtual,
+           bitmap names_defined_in_bb)
 {
   bool err = false;
 
@@ -232,6 +236,13 @@ verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
             def_bb->index, bb->index);
       err = true;
     }
+  else if (bb == def_bb
+          && names_defined_in_bb != NULL
+          && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
+    {
+      error ("Definition in block %i follows the use", def_bb->index);
+      err = true;
+    }
 
   if (check_abnormal
       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
@@ -281,7 +292,8 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
       if (TREE_CODE (op) == SSA_NAME)
        err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
                          phi, e->flags & EDGE_ABNORMAL,
-                         !is_gimple_reg (PHI_RESULT (phi)));
+                         !is_gimple_reg (PHI_RESULT (phi)),
+                         NULL);
 
       if (e->dest != bb)
        {
@@ -506,6 +518,7 @@ verify_ssa (void)
   ssa_op_iter iter;
   tree op;
   enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
+  bitmap names_defined_in_bb = BITMAP_XMALLOC ();
 
   timevar_push (TV_TREE_SSA_VERIFY);
 
@@ -578,8 +591,12 @@ verify_ssa (void)
 
       /* Verify the arguments for every PHI node in the block.  */
       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
-       if (verify_phi_args (phi, bb, definition_block))
-         goto err;
+       {
+         if (verify_phi_args (phi, bb, definition_block))
+           goto err;
+         bitmap_set_bit (names_defined_in_bb,
+                         SSA_NAME_VERSION (PHI_RESULT (phi)));
+       }
 
       /* Now verify all the uses and vuses in every statement of the block.  */
       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
@@ -589,17 +606,44 @@ verify_ssa (void)
          FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES)
            {
              if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
-                             op, stmt, false, true))
+                             op, stmt, false, true,
+                             names_defined_in_bb))
                goto err;
            }
 
          FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
            {
              if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
-                             op, stmt, false, false))
+                             op, stmt, false, false,
+                             names_defined_in_bb))
                goto err;
            }
+
+         FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
+           {
+             bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
+           }
        }
+
+      /* Verify the uses in arguments of PHI nodes at the exits from the
+        block.  */
+      for (e = bb->succ; e; e = e->succ_next)
+       {
+         for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
+           {
+             bool virtual = !is_gimple_reg (PHI_RESULT (phi));
+             op = PHI_ARG_DEF_FROM_EDGE (phi, e);
+             if (TREE_CODE (op) != SSA_NAME)
+               continue;
+
+             if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
+                             op, phi, false, virtual,
+                             names_defined_in_bb))
+               goto err;
+           }
+       }
+
+      bitmap_clear (names_defined_in_bb);
     }
 
   /* Finally, verify alias information.  */
@@ -613,6 +657,7 @@ verify_ssa (void)
   else
     dom_computed[CDI_DOMINATORS] = orig_dom_state;
   
+  BITMAP_XFREE (names_defined_in_bb);
   timevar_pop (TV_TREE_SSA_VERIFY);
   return;
 
index d6cfe4c49ed3d8fc0739029cdc24632bb6b60dae..cfe9dfaacc1e003f611be1d213b29e7ba3d7f9d2 100644 (file)
@@ -624,7 +624,7 @@ adjust_return_value (basic_block bb, tree m, tree a)
 
       var = make_ssa_name (tmp, stmt);
       TREE_OPERAND (stmt, 0) = var;
-      bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
+      bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
     }
   else
     var = ret_var;
@@ -639,7 +639,7 @@ adjust_return_value (basic_block bb, tree m, tree a)
 
       var = make_ssa_name (tmp, stmt);
       TREE_OPERAND (stmt, 0) = var;
-      bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
+      bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
     }
 
   TREE_OPERAND (ret_stmt, 0) = var;