This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug ipa/68470] [4.9/5/6 Regression] Internal Compiler Error observed by g++-4.9.2 and a few other versions (reported to Debian)
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 27 Nov 2015 09:26:05 +0000
- Subject: [Bug ipa/68470] [4.9/5/6 Regression] Internal Compiler Error observed by g++-4.9.2 and a few other versions (reported to Debian)
- Auto-submitted: auto-generated
- References: <bug-68470-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68470
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, so the issue is the non-split part doesn't return but we keep and wire
the original return block (duplicated into the split part) into the
split-return
part of the main function. That leaves us with stmts that have no defs for
their uses. The following works for me.
Index: gcc/ipa-split.c
===================================================================
--- gcc/ipa-split.c (revision 230998)
+++ gcc/ipa-split.c (working copy)
@@ -1205,7 +1205,6 @@ split_function (basic_block return_bb, s
edge e;
edge_iterator ei;
tree retval = NULL, real_retval = NULL, retbnd = NULL;
- bool split_part_return_p = false;
bool with_bounds = chkp_function_instrumented_p (current_function_decl);
gimple *last_stmt = NULL;
unsigned int i;
@@ -1246,12 +1245,16 @@ split_function (basic_block return_bb, s
args_to_pass.safe_push (arg);
}
- /* See if the split function will return. */
+ /* See if the split function or the main part will return. */
+ bool main_part_return_p = false;
+ bool split_part_return_p = false;
FOR_EACH_EDGE (e, ei, return_bb->preds)
- if (bitmap_bit_p (split_point->split_bbs, e->src->index))
- break;
- if (e)
- split_part_return_p = true;
+ {
+ if (bitmap_bit_p (split_point->split_bbs, e->src->index))
+ split_part_return_p = true;
+ else
+ main_part_return_p = true;
+ }
/* Add return block to what will become the split function.
We do not return; no return block is needed. */
@@ -1295,6 +1298,11 @@ split_function (basic_block return_bb, s
else
bitmap_set_bit (split_point->split_bbs, return_bb->index);
+ /* If the main part doesn't return pretend the return block wasn't
+ found for all of the following. */
+ if (! main_part_return_p)
+ return_bb = EXIT_BLOCK_PTR_FOR_FN (cfun);
+
/* If RETURN_BB has virtual operand PHIs, they must be removed and the
virtual operand marked for renaming as we change the CFG in a way that
tree-inline is not able to compensate for.