re PR target/55433 ([LRA] ICE on excessive reloads)
authorVladimir Makarov <vmakarov@redhat.com>
Sun, 20 Jan 2013 19:09:58 +0000 (19:09 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Sun, 20 Jan 2013 19:09:58 +0000 (19:09 +0000)
2013-01-20  Vladimir Makarov  <vmakarov@redhat.com>

PR target/55433
* lra-constraints.c (curr_insn_transform): Don't reuse original
insn for secondary memory move when memory mode should be
different.

From-SVN: r195322

gcc/ChangeLog
gcc/lra-constraints.c

index dbc0cc1a3ba4f78733b4e4efd38c9867b74d5968..7a38ef1092dfc5273bec70df10e75b91e3ad6dda 100644 (file)
@@ -1,3 +1,10 @@
+2013-01-20  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/55433
+       * lra-constraints.c (curr_insn_transform): Don't reuse original
+       insn for secondary memory move when memory mode should be
+       different.
+
 2013-01-20  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        * config/pa/pa.md (atomic_loaddi, atomic_loaddi_1, atomic_storedi,
index f13f37233b464f5517a29d5fad1aa888069f0fb8..01c8cf143cfdc2bcb3a28c130922555f8dbca626 100644 (file)
@@ -2791,7 +2791,7 @@ curr_insn_transform (void)
 
   if (use_sec_mem_p)
     {
-      rtx new_reg, src, dest, rld, rld_subst;
+      rtx new_reg, src, dest, rld;
       enum machine_mode sec_mode, rld_mode;
 
       lra_assert (sec_mem_p);
@@ -2811,17 +2811,28 @@ curr_insn_transform (void)
                                    NO_REGS, "secondary");
       /* If the mode is changed, it should be wider.  */
       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;
+      if (sec_mode != rld_mode)
+        {
+         /* If the target says specifically to use another mode for
+            secondary memory moves we can not reuse the original
+            insn.  */
+         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);
+       }
+      else if (dest == rld)
+       {
+         *curr_id->operand_loc[0] = new_reg;
          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;
+         *curr_id->operand_loc[1] = new_reg;
          before = emit_spill_move (true, new_reg, src);
          lra_process_new_insns (curr_insn, before, NULL_RTX,
                                 "Inserting the sec. move");