]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/ira-emit.c
[C++] Protect call to copy_attributes_to_builtin (PR91505)
[thirdparty/gcc.git] / gcc / ira-emit.c
index 691bd1d20c4aec7ce71c75ee88c24ee1ae001ef7..255af307b3c83ba3d7173598928ccb836e65643c 100644 (file)
@@ -1,5 +1,5 @@
 /* Integrated Register Allocator.  Changing code and generating moves.
-   Copyright (C) 2006-2016 Free Software Foundation, Inc.
+   Copyright (C) 2006-2019 Free Software Foundation, Inc.
    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
 
 This file is part of GCC.
@@ -75,6 +75,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "df.h"
 #include "insn-config.h"
 #include "regs.h"
+#include "memmodel.h"
 #include "ira.h"
 #include "ira-int.h"
 #include "cfgrtl.h"
@@ -782,7 +783,7 @@ modify_move_list (move_t list)
       to = move->to;
       if ((hard_regno = ALLOCNO_HARD_REGNO (to)) < 0)
        continue;
-      nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (to)];
+      nregs = hard_regno_nregs (hard_regno, ALLOCNO_MODE (to));
       for (i = 0; i < nregs; i++)
        {
          hard_regno_last_set[hard_regno + i] = move;
@@ -795,7 +796,7 @@ modify_move_list (move_t list)
       to = move->to;
       if ((hard_regno = ALLOCNO_HARD_REGNO (from)) >= 0)
        {
-         nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (from)];
+         nregs = hard_regno_nregs (hard_regno, ALLOCNO_MODE (from));
          for (n = i = 0; i < nregs; i++)
            if (hard_regno_last_set_check[hard_regno + i] == curr_tick
                && (ALLOCNO_REGNO (hard_regno_last_set[hard_regno + i]->to)
@@ -833,7 +834,7 @@ modify_move_list (move_t list)
       to = move->to;
       if ((hard_regno = ALLOCNO_HARD_REGNO (from)) >= 0)
        {
-         nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (from)];
+         nregs = hard_regno_nregs (hard_regno, ALLOCNO_MODE (from));
          for (i = 0; i < nregs; i++)
            if (hard_regno_last_set_check[hard_regno + i] == curr_tick
                && ALLOCNO_HARD_REGNO
@@ -885,7 +886,7 @@ modify_move_list (move_t list)
        }
       if ((hard_regno = ALLOCNO_HARD_REGNO (to)) < 0)
        continue;
-      nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (to)];
+      nregs = hard_regno_nregs (hard_regno, ALLOCNO_MODE (to));
       for (i = 0; i < nregs; i++)
        {
          hard_regno_last_set[hard_regno + i] = move;
@@ -996,23 +997,30 @@ emit_moves (void)
   basic_block bb;
   edge_iterator ei;
   edge e;
-  rtx_insn *insns, *tmp;
+  rtx_insn *insns, *tmp, *next;
 
   FOR_EACH_BB_FN (bb, cfun)
     {
       if (at_bb_start[bb->index] != NULL)
        {
          at_bb_start[bb->index] = modify_move_list (at_bb_start[bb->index]);
-         insns = emit_move_list (at_bb_start[bb->index],
-                                 REG_FREQ_FROM_BB (bb));
+         insns
+           = emit_move_list (at_bb_start[bb->index], REG_FREQ_FROM_BB (bb));
          tmp = BB_HEAD (bb);
          if (LABEL_P (tmp))
            tmp = NEXT_INSN (tmp);
          if (NOTE_INSN_BASIC_BLOCK_P (tmp))
            tmp = NEXT_INSN (tmp);
+         /* Make sure to put the location of TMP or a subsequent instruction
+            to avoid inheriting the location of the previous instruction.  */
+         next = tmp;
+         while (next && !NONDEBUG_INSN_P (next))
+           next = NEXT_INSN (next);
+         if (next)
+           set_insn_locations (insns, INSN_LOCATION (next));
          if (tmp == BB_HEAD (bb))
            emit_insn_before (insns, tmp);
-         else if (tmp != NULL_RTX)
+         else if (tmp)
            emit_insn_after (insns, PREV_INSN (tmp));
          else
            emit_insn_after (insns, get_last_insn ());