]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix PR47691: do not abort compilation when code generation fails
authorSebastian Pop <sebastian.pop@amd.com>
Wed, 27 Jul 2011 16:52:52 +0000 (16:52 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Wed, 27 Jul 2011 16:52:52 +0000 (16:52 +0000)
2011-07-27  Sebastian Pop  <sebastian.pop@amd.com>

PR middle-end/47691
* graphite-clast-to-gimple.c (translate_clast_user): Update use of
copy_bb_and_scalar_dependences.
* sese.c (rename_uses): Do not call gcc_assert.  Set gloog_error.
(graphite_copy_stmts_from_block): Update call to rename_uses.
(copy_bb_and_scalar_dependences): Update call to
graphite_copy_stmts_from_block.
* sese.h (copy_bb_and_scalar_dependences): Update declaration.

* gfortran.dg/graphite/id-pr47691.f: New.

From-SVN: r176836

gcc/ChangeLog
gcc/graphite-clast-to-gimple.c
gcc/sese.c
gcc/sese.h
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/graphite/id-pr47691.f [new file with mode: 0644]

index 2ace76c120c3c827880d5c8d995df4672bef69f5..1c2f0562b6f6a4070ab96224f991c0599cbfd052 100644 (file)
@@ -1,5 +1,16 @@
+2011-07-27  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR middle-end/47691
+       * graphite-clast-to-gimple.c (translate_clast_user): Update use of
+       copy_bb_and_scalar_dependences.
+       * sese.c (rename_uses): Do not call gcc_assert.  Set gloog_error.
+       (graphite_copy_stmts_from_block): Update call to rename_uses.
+       (copy_bb_and_scalar_dependences): Update call to
+       graphite_copy_stmts_from_block.
+       * sese.h (copy_bb_and_scalar_dependences): Update declaration.
+
 2011-07-27  Georg-Johann Lay  <avr@gjlay.de>
-       
+
        PR target/49313
        * config/avr/libgcc.S (__ffshi2): Don't skip 2-word instruction.
        (__ctzsi2): Result for 0 may be undefined.
index ee6702012a1a15b436abe12972854640c4921f08..a911eb64c14aa7bfcbba1f30ee29675374bad806 100644 (file)
@@ -1020,7 +1020,7 @@ translate_clast_user (struct clast_user_stmt *stmt, edge next_e,
 
   build_iv_mapping (iv_map, stmt, ip);
   next_e = copy_bb_and_scalar_dependences (GBB_BB (gbb), ip->region,
-                                          next_e, iv_map);
+                                          next_e, iv_map, &gloog_error);
   VEC_free (tree, heap, iv_map);
 
   new_bb = next_e->src;
index a03cbc9a0bdab3737a7eb0af1f6dec2082876938..ec96dfba5ccef7944404e774dc7b492df02e3399 100644 (file)
@@ -458,11 +458,13 @@ set_rename (htab_t rename_map, tree old_name, tree expr)
    substitution map RENAME_MAP, inserting the gimplification code at
    GSI_TGT, for the translation REGION, with the original copied
    statement in LOOP, and using the induction variable renaming map
-   IV_MAP.  Returns true when something has been renamed.  */
+   IV_MAP.  Returns true when something has been renamed.  GLOOG_ERROR
+   is set when the code generation cannot continue.  */
 
 static bool
 rename_uses (gimple copy, htab_t rename_map, gimple_stmt_iterator *gsi_tgt,
-            sese region, loop_p loop, VEC (tree, heap) *iv_map)
+            sese region, loop_p loop, VEC (tree, heap) *iv_map,
+            bool *gloog_error)
 {
   use_operand_p use_p;
   ssa_op_iter op_iter;
@@ -522,7 +524,11 @@ rename_uses (gimple copy, htab_t rename_map, gimple_stmt_iterator *gsi_tgt,
         scalar SSA_NAME used in the scop: all the other scalar
         SSA_NAMEs should have been translated out of SSA using
         arrays with one element.  */
-      gcc_assert (!chrec_contains_undetermined (scev));
+      if (chrec_contains_undetermined (scev))
+       {
+         *gloog_error = true;
+         return false;
+       }
 
       new_expr = chrec_apply_map (scev, iv_map);
 
@@ -530,8 +536,12 @@ rename_uses (gimple copy, htab_t rename_map, gimple_stmt_iterator *gsi_tgt,
         the uses of the new induction variables.  We should be
         able to use new_expr instead of the old_name in the newly
         generated loop nest.  */
-      gcc_assert (!chrec_contains_undetermined (new_expr)
-                 && !tree_contains_chrecs (new_expr, NULL));
+      if (chrec_contains_undetermined (new_expr)
+         || tree_contains_chrecs (new_expr, NULL))
+       {
+         *gloog_error = true;
+         return false;
+       }
 
       /* Replace the old_name with the new_expr.  */
       new_expr = force_gimple_operand (unshare_expr (new_expr), &stmts,
@@ -555,12 +565,14 @@ rename_uses (gimple copy, htab_t rename_map, gimple_stmt_iterator *gsi_tgt,
 }
 
 /* Duplicates the statements of basic block BB into basic block NEW_BB
-   and compute the new induction variables according to the IV_MAP.  */
+   and compute the new induction variables according to the IV_MAP.
+   GLOOG_ERROR is set when the code generation cannot continue.  */
 
 static void
 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
                                htab_t rename_map,
-                               VEC (tree, heap) *iv_map, sese region)
+                               VEC (tree, heap) *iv_map, sese region,
+                               bool *gloog_error)
 {
   gimple_stmt_iterator gsi, gsi_tgt;
   loop_p loop = bb->loop_father;
@@ -605,27 +617,34 @@ graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
          set_rename (rename_map, old_name, new_name);
        }
 
-      if (rename_uses (copy, rename_map, &gsi_tgt, region, loop, iv_map))
+      if (rename_uses (copy, rename_map, &gsi_tgt, region, loop, iv_map,
+                      gloog_error))
        fold_stmt_inplace (copy);
 
+      if (*gloog_error)
+       break;
+
       update_stmt (copy);
     }
 }
 
 /* Copies BB and includes in the copied BB all the statements that can
    be reached following the use-def chains from the memory accesses,
-   and returns the next edge following this new block.  */
+   and returns the next edge following this new block.  GLOOG_ERROR is
+   set when the code generation cannot continue.  */
 
 edge
 copy_bb_and_scalar_dependences (basic_block bb, sese region,
-                               edge next_e, VEC (tree, heap) *iv_map)
+                               edge next_e, VEC (tree, heap) *iv_map,
+                               bool *gloog_error)
 {
   basic_block new_bb = split_edge (next_e);
   htab_t rename_map = htab_create (10, rename_map_elt_info,
                                   eq_rename_map_elts, free);
 
   next_e = single_succ_edge (new_bb);
-  graphite_copy_stmts_from_block (bb, new_bb, rename_map, iv_map, region);
+  graphite_copy_stmts_from_block (bb, new_bb, rename_map, iv_map, region,
+                                 gloog_error);
   remove_phi_nodes (new_bb);
   htab_delete (rename_map);
 
index d3b8958ce06cac512c14be85f04cc953a702c465..7c6a9c68896bd047dce20d9c49fde47b3b8991f2 100644 (file)
@@ -57,7 +57,7 @@ extern void free_sese (sese);
 extern void sese_insert_phis_for_liveouts (sese, basic_block, edge, edge);
 extern void build_sese_loop_nests (sese);
 extern edge copy_bb_and_scalar_dependences (basic_block, sese, edge,
-                                           VEC (tree, heap) *);
+                                           VEC (tree, heap) *, bool *);
 extern struct loop *outermost_loop_in_sese (sese, basic_block);
 extern void insert_loop_close_phis (htab_t, loop_p);
 extern void insert_guard_phis (basic_block, edge, edge, htab_t, htab_t);
index 9beb225f3cc83e02b98dcf5dbeb3a811d0237cc6..ab08df159f06bed789f8b7b6315038dc9f8329a0 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-27  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR middle-end/47691
+       * gfortran.dg/graphite/id-pr47691.f: New.
+
 2011-07-27  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/avx-os-support.h: New.
diff --git a/gcc/testsuite/gfortran.dg/graphite/id-pr47691.f b/gcc/testsuite/gfortran.dg/graphite/id-pr47691.f
new file mode 100644 (file)
index 0000000..0abbd55
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-options "-O -fgraphite-identity -ffast-math -fno-tree-scev-cprop" }
+      dimension b(12,8)
+      do i=1,norb
+      end do
+      b(i,j) = 0
+      call rdrsym(b)
+      end