gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 9 Aug 2009 15:56:27 +0000 (15:56 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 9 Aug 2009 15:56:27 +0000 (15:56 +0000)
* tree-out-of-ssa.c (insert_value_copy_on_edge): If the source
and destination have different modes, Use promote_mode to
determine the signedness of the conversion.  Assert that the
promoted source mode matches the destination mode.  Don't pass
the destination and destination mode to expand_expr if the source
mode is different.  Simplify conversion logic.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150592 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-outof-ssa.c

index f4a8a14..0be934b 100644 (file)
@@ -1,3 +1,12 @@
+2009-08-09  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * tree-out-of-ssa.c (insert_value_copy_on_edge): If the source
+       and destination have different modes, Use promote_mode to
+       determine the signedness of the conversion.  Assert that the
+       promoted source mode matches the destination mode.  Don't pass
+       the destination and destination mode to expand_expr if the source
+       mode is different.  Simplify conversion logic.
+
 2009-08-09  Ira Rosen  <irar@il.ibm.com>
 
        PR tree-optimization/41008
index 420ee80..c0826e7 100644 (file)
@@ -195,7 +195,9 @@ static void
 insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
 {
   rtx seq, x;
-  enum machine_mode mode;
+  enum machine_mode dest_mode, src_mode;
+  int unsignedp;
+
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file,
@@ -214,14 +216,21 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
     set_curr_insn_source_location (locus);
 
   start_sequence ();
-  mode = GET_MODE (SA.partition_to_pseudo[dest]);
-  x = expand_expr (src, SA.partition_to_pseudo[dest], mode, EXPAND_NORMAL);
-  if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode)
-    x = convert_to_mode (mode, x, TYPE_UNSIGNED (TREE_TYPE (src)));
-  if (CONSTANT_P (x) && GET_MODE (x) == VOIDmode
-      && mode != TYPE_MODE (TREE_TYPE (src)))
-    x = convert_modes (mode, TYPE_MODE (TREE_TYPE (src)),
-                         x, TYPE_UNSIGNED (TREE_TYPE (src)));
+
+  src_mode = TYPE_MODE (TREE_TYPE (src));
+  unsignedp = TYPE_UNSIGNED (TREE_TYPE (src));
+  dest_mode = promote_mode (TREE_TYPE (src), src_mode, &unsignedp);
+  gcc_assert (dest_mode == GET_MODE (SA.partition_to_pseudo[dest]));
+
+  if (src_mode != dest_mode)
+    {
+      x = expand_expr (src, NULL, src_mode, EXPAND_NORMAL);
+      x = convert_modes (dest_mode, src_mode, x, unsignedp);
+    }
+  else
+    x = expand_expr (src, SA.partition_to_pseudo[dest],
+                    dest_mode, EXPAND_NORMAL);
+
   if (x != SA.partition_to_pseudo[dest])
     emit_move_insn (SA.partition_to_pseudo[dest], x);
   seq = get_insns ();