mode-switching.c (create_pre_exit): Force late switching if __builtin_{apply,return} emitted a load that require...

* mode-switching.c (create_pre_exit): Force late switching if
	__builtin_{apply,return} emitted a load that require mode,
	other than MODE_EXIT.


Co-Authored-By: Vladimir Yakovlev <vladimir.b.yakovlev@intel.com>

From-SVN: r193182
This commit is contained in:
Uros Bizjak 2012-11-05 20:46:31 +01:00 committed by Uros Bizjak
parent 935ec36fdd
commit b8435aa945
2 changed files with 18 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2012-11-05 Uros Bizjak <ubizjak@gmail.com>
Vladimir Yakovlev <vladimir.b.yakovlev@intel.com>
* mode-switching.c (create_pre_exit): Force late switching if
__builtin_{apply,return} emitted a load that require mode,
other than MODE_EXIT.
2012-11-05 Richard Sandiford <rdsandiford@googlemail.com>
PR target/55204

View File

@ -1,6 +1,6 @@
/* CPU mode switching
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
2009, 2010 Free Software Foundation, Inc.
2009, 2010, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@ -342,6 +342,16 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes)
}
if (j >= 0)
{
/* __builtin_return emits a sequence of loads to all
return registers. One of them might require
another mode than MODE_EXIT, even if it is
unrelated to the return value, so we want to put
the final mode switch after it. */
if (maybe_builtin_apply
&& targetm.calls.function_value_regno_p
(copy_start))
forced_late_switch = 1;
/* For the SH4, floating point loads depend on fpscr,
thus we might need to put the final mode switch
after the return value copy. That is still OK,