From: jakub Date: Mon, 8 Feb 2016 20:07:56 +0000 (+0000) Subject: PR tree-optimization/69209 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=394a86f3f5dbab4a9d6f1675475f5b43dc1f2632;p=thirdparty%2Fgcc.git 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. * gcc.c-torture/compile/pr69209.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233228 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0dd2c3842e1..08edb4495dd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-02-08 Jakub Jelinek + + 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 * doc/tree-ssa.texi (Preserving the virtual SSA form): Remove diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index 9ecc28246986..929119abd7e9 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 9f629d6f55e2..d958e5d4814a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-08 Jakub Jelinek + + PR tree-optimization/69209 + * gcc.c-torture/compile/pr69209.c: New test. + 2016-02-08 Jeff Law 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 000000000000..fd8046f217d1 --- /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 (); +}