This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Make fold_stmt not transfer EH info


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  <rguenther@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); }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]