diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2012-11-05 20:46:31 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2012-11-05 20:46:31 +0100 |
commit | b8435aa9450e6c3b222eab7f1fa875f6238c2b99 (patch) | |
tree | 033e1f770ad19a6394eaed9b596b3483d80fd1bc /gcc/mode-switching.c | |
parent | 935ec36fdd9f1ebdb32baf7c1d94ac4e390d26c6 (diff) | |
download | gcc-b8435aa9450e6c3b222eab7f1fa875f6238c2b99.zip gcc-b8435aa9450e6c3b222eab7f1fa875f6238c2b99.tar.gz gcc-b8435aa9450e6c3b222eab7f1fa875f6238c2b99.tar.bz2 |
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
Diffstat (limited to 'gcc/mode-switching.c')
-rw-r--r-- | gcc/mode-switching.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index d9f83ca..2f7455a 100644 --- a/gcc/mode-switching.c +++ b/gcc/mode-switching.c @@ -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, |