[PR67766] reorder handling of parallels, concats and promoted values in return
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 9 Oct 2015 12:18:40 +0000 (12:18 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 9 Oct 2015 12:18:40 +0000 (12:18 +0000)
for  gcc/ChangeLog

PR middle-end/67766
* function.c (expand_function_end): Move return value
promotion past the handling of PARALLELs and CONCATs.

From-SVN: r228651

gcc/ChangeLog
gcc/function.c

index e31c180..cba70ef 100644 (file)
@@ -1,5 +1,9 @@
 2015-10-09  Alexandre Oliva <aoliva@redhat.com>
 
+       PR middle-end/67766
+       * function.c (expand_function_end): Move return value
+       promotion past the handling of PARALLELs and CONCATs.
+
        PR rtl-optimization/67828
        * tree-ssa-loop-unswitch.c: Include tree-ssa.h.
        (tree_may_unswitch_on): Don't unswitch on expressions
index e76ba2b..d16d6d8 100644 (file)
@@ -5446,18 +5446,6 @@ expand_function_end (void)
                              decl_rtl);
              shift_return_value (GET_MODE (decl_rtl), true, real_decl_rtl);
            }
-         /* If a named return value dumped decl_return to memory, then
-            we may need to re-do the PROMOTE_MODE signed/unsigned
-            extension.  */
-         else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
-           {
-             int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
-             promote_function_mode (TREE_TYPE (decl_result),
-                                    GET_MODE (decl_rtl), &unsignedp,
-                                    TREE_TYPE (current_function_decl), 1);
-
-             convert_move (real_decl_rtl, decl_rtl, unsignedp);
-           }
          else if (GET_CODE (real_decl_rtl) == PARALLEL)
            {
              /* If expand_function_start has created a PARALLEL for decl_rtl,
@@ -5488,6 +5476,18 @@ expand_function_end (void)
              emit_move_insn (tmp, decl_rtl);
              emit_move_insn (real_decl_rtl, tmp);
            }
+         /* If a named return value dumped decl_return to memory, then
+            we may need to re-do the PROMOTE_MODE signed/unsigned
+            extension.  */
+         else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
+           {
+             int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
+             promote_function_mode (TREE_TYPE (decl_result),
+                                    GET_MODE (decl_rtl), &unsignedp,
+                                    TREE_TYPE (current_function_decl), 1);
+
+             convert_move (real_decl_rtl, decl_rtl, unsignedp);
+           }
          else
            emit_move_insn (real_decl_rtl, decl_rtl);
        }