This makes fold_stmt consistently not transfer EH info from old to new
stmt as callers are responsible for that (and for removing dead EH
edges).

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2015-09-15  Richard Biener  <rguent...@suse.de>

        * gimple-fold.c (gimplify_and_update_call_from_tree): Do not
        transfer EH info from old to new stmt.
        (replace_call_with_value): Likewise.
        (replace_call_with_call_and_fold): Likewise.
        (gimple_fold_builtin_memory_op): Likewise.
        (gimple_fold_builtin_memset): Likewise.
        (gimple_fold_builtin_stpcpy): Likewise.
        (gimple_fold_call): Likewise.

        * gcc.dg/pr67563.c: New testcase.

Index: gcc/gimple-fold.c
===================================================================
*** gcc/gimple-fold.c   (revision 227779)
--- gcc/gimple-fold.c   (working copy)
*************** gimplify_and_update_call_from_tree (gimp
*** 548,554 ****
              unlink_stmt_vdef (stmt);
              release_defs (stmt);
            }
!         gsi_replace (si_p, gimple_build_nop (), true);
          return;
        }
      }
--- 549,555 ----
              unlink_stmt_vdef (stmt);
              release_defs (stmt);
            }
!         gsi_replace (si_p, gimple_build_nop (), false);
          return;
        }
      }
*************** replace_call_with_value (gimple_stmt_ite
*** 589,595 ****
        unlink_stmt_vdef (stmt);
        release_ssa_name (vdef);
      }
!   gsi_replace (gsi, repl, true);
  }
  
  /* Replace the call at *GSI with the new call REPL and fold that
--- 590,596 ----
        unlink_stmt_vdef (stmt);
        release_ssa_name (vdef);
      }
!   gsi_replace (gsi, repl, false);
  }
  
  /* Replace the call at *GSI with the new call REPL and fold that
*************** replace_call_with_call_and_fold (gimple_
*** 608,614 ****
        gimple_set_vuse (repl, gimple_vuse (stmt));
        SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl;
      }
!   gsi_replace (gsi, repl, true);
    fold_stmt (gsi);
  }
  
--- 609,615 ----
        gimple_set_vuse (repl, gimple_vuse (stmt));
        SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl;
      }
!   gsi_replace (gsi, repl, false);
    fold_stmt (gsi);
  }
  
*************** gimple_fold_builtin_memory_op (gimple_st
*** 655,661 ****
          unlink_stmt_vdef (stmt);
          release_ssa_name (vdef);
        }
!       gsi_replace (gsi, repl, true);
        return true;
      }
  
--- 656,662 ----
          unlink_stmt_vdef (stmt);
          release_ssa_name (vdef);
        }
!       gsi_replace (gsi, repl, false);
        return true;
      }
  
*************** gimple_fold_builtin_memory_op (gimple_st
*** 668,674 ****
        release_ssa_name (gimple_vdef (stmt));
        if (!lhs)
        {
!         gsi_replace (gsi, gimple_build_nop (), true);
          return true;
        }
        goto done;
--- 669,675 ----
        release_ssa_name (gimple_vdef (stmt));
        if (!lhs)
        {
!         gsi_replace (gsi, gimple_build_nop (), false);
          return true;
        }
        goto done;
*************** gimple_fold_builtin_memory_op (gimple_st
*** 750,756 ****
                        SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
                      if (!lhs)
                        {
!                         gsi_replace (gsi, new_stmt, true);
                          return true;
                        }
                      gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
--- 756,762 ----
                        SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
                      if (!lhs)
                        {
!                         gsi_replace (gsi, new_stmt, false);
                          return true;
                        }
                      gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
*************** gimple_fold_builtin_memory_op (gimple_st
*** 1030,1036 ****
        SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
        if (!lhs)
        {
!         gsi_replace (gsi, new_stmt, true);
          return true;
        }
        gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
--- 1036,1042 ----
        SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
        if (!lhs)
        {
!         gsi_replace (gsi, new_stmt, false);
          return true;
        }
        gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
*************** done:
*** 1048,1054 ****
    dest = force_gimple_operand_gsi (gsi, dest, false, NULL_TREE, true,
                                   GSI_SAME_STMT);
    gimple repl = gimple_build_assign (lhs, dest);
!   gsi_replace (gsi, repl, true);
    return true;
  }
  
--- 1054,1060 ----
    dest = force_gimple_operand_gsi (gsi, dest, false, NULL_TREE, true,
                                   GSI_SAME_STMT);
    gimple repl = gimple_build_assign (lhs, dest);
!   gsi_replace (gsi, repl, false);
    return true;
  }
  
*************** gimple_fold_builtin_memset (gimple_stmt_
*** 1130,1136 ****
    if (gimple_call_lhs (stmt))
      {
        gimple asgn = gimple_build_assign (gimple_call_lhs (stmt), dest);
!       gsi_replace (gsi, asgn, true);
      }
    else
      {
--- 1136,1142 ----
    if (gimple_call_lhs (stmt))
      {
        gimple asgn = gimple_build_assign (gimple_call_lhs (stmt), dest);
!       gsi_replace (gsi, asgn, false);
      }
    else
      {
*************** gimple_fold_builtin_stpcpy (gimple_stmt_
*** 1980,1986 ****
    gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
    gassign *ret = gimple_build_assign (gimple_call_lhs (stmt),
                                      POINTER_PLUS_EXPR, dest, tem);
!   gsi_replace (gsi, ret, true);
    /* Finally fold the memcpy call.  */
    gimple_stmt_iterator gsi2 = *gsi;
    gsi_prev (&gsi2);
--- 1986,1992 ----
    gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
    gassign *ret = gimple_build_assign (gimple_call_lhs (stmt),
                                      POINTER_PLUS_EXPR, dest, tem);
!   gsi_replace (gsi, ret, false);
    /* Finally fold the memcpy call.  */
    gimple_stmt_iterator gsi2 = *gsi;
    gsi_prev (&gsi2);
*************** gimple_fold_call (gimple_stmt_iterator *
*** 3062,3068 ****
                  && tree_int_cst_le (gimple_call_arg (stmt, 1),
                                      gimple_call_arg (stmt, 2))))
            {
!             gsi_replace (gsi, gimple_build_nop (), true);
              unlink_stmt_vdef (stmt);
              release_defs (stmt);
              return true;
--- 3068,3074 ----
                  && tree_int_cst_le (gimple_call_arg (stmt, 1),
                                      gimple_call_arg (stmt, 2))))
            {
!             gsi_replace (gsi, gimple_build_nop (), false);
              unlink_stmt_vdef (stmt);
              release_defs (stmt);
              return true;
Index: gcc/testsuite/gcc.dg/pr67563.c
===================================================================
*** gcc/testsuite/gcc.dg/pr67563.c      (revision 0)
--- gcc/testsuite/gcc.dg/pr67563.c      (working copy)
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fexceptions" } */
+ 
+ static void
+ emit_package (int p1)
+ {
+   int a;
+   int b[0];
+   a = __fprintf_chk (0, 0, "");
+ }
+ void emit_lua () { emit_package (0); }

Reply via email to