From b8435aa9450e6c3b222eab7f1fa875f6238c2b99 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 5 Nov 2012 20:46:31 +0100 Subject: [PATCH] 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 From-SVN: r193182 --- gcc/ChangeLog | 7 +++++++ gcc/mode-switching.c | 12 +++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0c4fd1fa26..0d20017906e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-11-05 Uros Bizjak + Vladimir Yakovlev + + * 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 PR target/55204 diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index d9f83ca2a3b..2f7455a033c 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, -- 2.30.2