X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fmode-switching.c;h=5f4f95fa8995eaae531d30de760b8a2c4699dd34;hb=d08091cb4d423b7e196a6c77d999b8adfdaed5ec;hp=9667d965a27bd985a84a4bddb443f1b080e2660a;hpb=81a410b1e4f861bb1eb31c7fa7daedf6bf70abc4;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index 9667d965a27..5f4f95fa899 100644 --- a/gcc/mode-switching.c +++ b/gcc/mode-switching.c @@ -245,6 +245,17 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes) if (INSN_P (return_copy)) { + /* When using SJLJ exceptions, the call to the + unregister function is inserted between the + clobber of the return value and the copy. + We do not want to split the block before this + or any other call; if we have not found the + copy yet, the copy must have been deleted. */ + if (CALL_P (return_copy)) + { + short_block = 1; + break; + } return_copy_pat = PATTERN (return_copy); switch (GET_CODE (return_copy_pat)) { @@ -758,7 +769,7 @@ struct tree_opt_pass pass_mode_switching = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_df_finish | + TODO_df_finish | TODO_verify_rtl_sharing | TODO_dump_func, /* todo_flags_finish */ 0 /* letter */ };