diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ipa-split.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr69209.c | 28 |
4 files changed, 55 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0dd2c3..08edb44 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-02-08 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/69209 + * ipa-split.c (split_function): If split part is not + returning retval, retval has gimple type but is not + gimple value, force it into a SSA_NAME first. + 2016-02-08 Nicklas Bo Jensen <nbjensen@gmail.com> * doc/tree-ssa.texi (Preserving the virtual SSA form): Remove diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index 9ecc282..929119a 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -1628,8 +1628,22 @@ split_function (basic_block return_bb, struct split_point *split_point, gimple_call_set_lhs (call, build_simple_mem_ref (retval)); else gimple_call_set_lhs (call, retval); + gsi_insert_after (&gsi, call, GSI_NEW_STMT); + } + else + { + gsi_insert_after (&gsi, call, GSI_NEW_STMT); + if (retval + && is_gimple_reg_type (TREE_TYPE (retval)) + && !is_gimple_val (retval)) + { + gassign *g + = gimple_build_assign (make_ssa_name (TREE_TYPE (retval)), + retval); + retval = gimple_assign_lhs (g); + gsi_insert_after (&gsi, g, GSI_NEW_STMT); + } } - gsi_insert_after (&gsi, call, GSI_NEW_STMT); /* Build bndret call to obtain returned bounds. */ if (retbnd) chkp_insert_retbnd_call (retbnd, retval, &gsi); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f629d6..d958e5d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-08 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/69209 + * gcc.c-torture/compile/pr69209.c: New test. + 2016-02-08 Jeff Law <law@redhat.com> PR tree-optimization/68541 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr69209.c b/gcc/testsuite/gcc.c-torture/compile/pr69209.c new file mode 100644 index 0000000..fd8046f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr69209.c @@ -0,0 +1,28 @@ +/* PR tree-optimization/69209 */ + +int a, c, *d, e; + +void foo (void) __attribute__ ((__noreturn__)); + +int +bar (void) +{ + int f; + if (a) + { + if (e) + foo (); + foo (); + } + if (d != &f) + foo (); + if (!c) + foo (); + return f; +} + +void +baz () +{ + bar (); +} |