update_row_reg_save (cur_row, dwf_regno (dest), cfi);
 }
 
-/* A subroutine of dwarf2out_frame_debug, process a REG_CFA_RESTORE note.  */
+/* A subroutine of dwarf2out_frame_debug, process a REG_CFA_RESTORE
+   note. When called with EMIT_CFI set to false emitting a CFI
+   statement is suppressed.  */
 
 static void
-dwarf2out_frame_debug_cfa_restore (rtx reg)
+dwarf2out_frame_debug_cfa_restore (rtx reg, bool emit_cfi)
 {
   gcc_assert (REG_P (reg));
 
   if (!span)
     {
       unsigned int regno = dwf_regno (reg);
-      add_cfi_restore (regno);
+      if (emit_cfi)
+       add_cfi_restore (regno);
       update_row_reg_save (cur_row, regno, NULL);
     }
   else
          reg = XVECEXP (span, 0, par_index);
          gcc_assert (REG_P (reg));
          unsigned int regno = dwf_regno (reg);
-         add_cfi_restore (regno);
+         if (emit_cfi)
+           add_cfi_restore (regno);
          update_row_reg_save (cur_row, regno, NULL);
        }
     }
        break;
 
       case REG_CFA_RESTORE:
+      case REG_CFA_NO_RESTORE:
        n = XEXP (note, 0);
        if (n == NULL)
          {
              n = XVECEXP (n, 0, 0);
            n = XEXP (n, 0);
          }
-       dwarf2out_frame_debug_cfa_restore (n);
+       dwarf2out_frame_debug_cfa_restore (n, REG_NOTE_KIND (note) == REG_CFA_RESTORE);
        handled_one = true;
        break;
 
 
    first pattern is the register to be restored.  */
 REG_CFA_NOTE (CFA_RESTORE)
 
+/* Like CFA_RESTORE but without actually emitting CFI.  This can be
+   used to tell the verification infrastructure that a register is
+   saved without intending to restore it.  */
+REG_CFA_NOTE (CFA_NO_RESTORE)
+
 /* Attached to insns that are RTX_FRAME_RELATED_P, marks insn that sets
    vDRAP from DRAP.  If vDRAP is a register, vdrap_reg is initalized
    to the argument, if it is a MEM, it is ignored.  */