From: Uros Bizjak Date: Mon, 5 Nov 2012 19:46:31 +0000 (+0100) Subject: mode-switching.c (create_pre_exit): Force late switching if __builtin_{apply,return... X-Git-Tag: releases/gcc-4.8.0~2263 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b8435aa9450e6c3b222eab7f1fa875f6238c2b99;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0c4fd1fa260..0d20017906e3 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 d9f83ca2a3b7..2f7455a033ca 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,