aboutsummaryrefslogtreecommitdiff
path: root/gcc/mode-switching.c
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2012-11-05 20:46:31 +0100
committerUros Bizjak <uros@gcc.gnu.org>2012-11-05 20:46:31 +0100
commitb8435aa9450e6c3b222eab7f1fa875f6238c2b99 (patch)
tree033e1f770ad19a6394eaed9b596b3483d80fd1bc /gcc/mode-switching.c
parent935ec36fdd9f1ebdb32baf7c1d94ac4e390d26c6 (diff)
downloadgcc-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.c12
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,