OSDN Git Service

2013-01-18 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Jan 2013 18:14:52 +0000 (18:14 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Jan 2013 18:14:52 +0000 (18:14 +0000)
PR target/55433
* lra-constraints.c (curr_insn_transform): Reuse original insn for
secondary memory move.
(inherit_reload_reg): Use rclass instead of cl for
check_secondary_memory_needed_p.

2013-01-18  Vladimir Makarov  <vmakarov@redhat.com>

PR target/55433
* gcc.target/i386/pr55433.c: New.

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

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr55433.c [new file with mode: 0644]

index 6ba1e86..2be4cf3 100644 (file)
@@ -1,3 +1,11 @@
+2013-01-18  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/55433
+       * lra-constraints.c (curr_insn_transform): Reuse original insn for
+       secondary memory move.
+       (inherit_reload_reg): Use rclass instead of cl for
+       check_secondary_memory_needed_p.
+
 2013-01-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/56015
index 334e95b..f13f372 100644 (file)
@@ -2791,30 +2791,42 @@ curr_insn_transform (void)
 
   if (use_sec_mem_p)
     {
-      rtx new_reg, set, src, dest;
-      enum machine_mode sec_mode;
+      rtx new_reg, src, dest, rld, rld_subst;
+      enum machine_mode sec_mode, rld_mode;
 
       lra_assert (sec_mem_p);
-      set = single_set (curr_insn);
-      lra_assert (set != NULL_RTX && ! side_effects_p (set));
-      dest = SET_DEST (set);
-      src = SET_SRC (set);
+      lra_assert (curr_static_id->operand[0].type == OP_OUT
+                 && curr_static_id->operand[1].type == OP_IN);
+      dest = *curr_id->operand_loc[0];
+      src = *curr_id->operand_loc[1];
+      rld = (GET_MODE_SIZE (GET_MODE (dest)) <= GET_MODE_SIZE (GET_MODE (src))
+            ? dest : src);
+      rld_mode = GET_MODE (rld);
 #ifdef SECONDARY_MEMORY_NEEDED_MODE
-      sec_mode = SECONDARY_MEMORY_NEEDED_MODE (GET_MODE (src));
+      sec_mode = SECONDARY_MEMORY_NEEDED_MODE (rld_mode);
 #else
-      sec_mode = GET_MODE (src);
+      sec_mode = rld_mode;
 #endif
       new_reg = lra_create_new_reg (sec_mode, NULL_RTX,
                                    NO_REGS, "secondary");
       /* If the mode is changed, it should be wider.  */
-      lra_assert (GET_MODE_SIZE (GET_MODE (new_reg))
-                 >= GET_MODE_SIZE (GET_MODE (src)));
-      after = emit_spill_move (false, new_reg, dest);
-      lra_process_new_insns (curr_insn, NULL_RTX, after,
-                            "Inserting the sec. move");
-      before = emit_spill_move (true, new_reg, src);
-      lra_process_new_insns (curr_insn, before, NULL_RTX, "Changing on");
-      lra_set_insn_deleted (curr_insn);
+      lra_assert (GET_MODE_SIZE (sec_mode) >= GET_MODE_SIZE (rld_mode));
+      rld_subst = (sec_mode == rld_mode ? new_reg : gen_lowpart_SUBREG (rld_mode, new_reg));
+      if (dest == rld)
+       {
+         *curr_id->operand_loc[0] = rld_subst;
+         after = emit_spill_move (false, new_reg, dest);
+         lra_process_new_insns (curr_insn, NULL_RTX, after,
+                                "Inserting the sec. move");
+       }
+      else
+       {
+         *curr_id->operand_loc[1] = rld_subst;
+         before = emit_spill_move (true, new_reg, src);
+         lra_process_new_insns (curr_insn, before, NULL_RTX,
+                                "Inserting the sec. move");
+       }
+      lra_update_insn_regno_info (curr_insn);
       return true;
     }
 #endif
@@ -3801,7 +3813,7 @@ inherit_reload_reg (bool def_p, int original_regno,
 
       rclass = cl;
     }
-  if (check_secondary_memory_needed_p (cl, next_usage_insns))
+  if (check_secondary_memory_needed_p (rclass, next_usage_insns))
     {
       /* Reject inheritance resulting in secondary memory moves.
         Otherwise, there is a danger in LRA cycling.  Also such
@@ -3820,7 +3832,7 @@ inherit_reload_reg (bool def_p, int original_regno,
                   "    Rejecting inheritance for insn %d(%s)<-%d(%s) "
                   "as secondary mem is needed\n",
                   REGNO (dest), reg_class_names[get_reg_class (REGNO (dest))],
-                  original_regno, reg_class_names[cl]);
+                  original_regno, reg_class_names[rclass]);
          fprintf (lra_dump_file,
                   "    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
        }
index 13eb611..c2098a4 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-18  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/55433
+       * gcc.target/i386/pr55433.c: New.
+
 2013-01-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/56015
diff --git a/gcc/testsuite/gcc.target/i386/pr55433.c b/gcc/testsuite/gcc.target/i386/pr55433.c
new file mode 100644 (file)
index 0000000..b79b16d
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile {target { *-*-darwin* } } } */
+/* { dg-options "-O1 -m32" } */
+
+typedef unsigned long long tick_t;
+extern int foo(void);
+extern tick_t tick(void);
+double test(void) {
+  struct { tick_t ticks; } st;
+  st.ticks = tick();
+  foo();
+  return (double)st.ticks;
+}