@@ -3117,6 +3117,25 @@ dead_debug_reset (struct dead_debug *deb
else
tailp = &(*tailp)->next;
}
+
+ /* If any other dead_debug_use structs refer to the debug insns
+ that have been reset above, remove them too. */
+ if (debug->to_rescan != NULL)
+ {
+ tailp = &debug->head;
+ while ((cur = *tailp))
+ {
+ insn = DF_REF_INSN (cur->use);
+ if (bitmap_bit_p (debug->to_rescan, INSN_UID (insn))
+ && VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
+ {
+ *tailp = cur->next;
+ XDELETE (cur);
+ }
+ else
+ tailp = &(*tailp)->next;
+ }
+ }
}
/* Add USE to DEBUG. It must be a dead reference to UREGNO in a debug
@@ -3174,7 +3193,8 @@ dead_debug_insert_before (struct dead_de
tailp = &(*tailp)->next;
}
- gcc_assert (reg);
+ if (reg == NULL)
+ return;
/* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
dval = make_debug_expr_from_rtl (reg);
@@ -0,0 +1,41 @@
+/* PR debug/49522 */
+/* { dg-do compile } */
+/* { dg-options "-fcompare-debug" } */
+
+int val1 = 0L;
+volatile int val2 = 7L;
+long long val3;
+int *ptr = &val1;
+
+static int
+func1 ()
+{
+ return 0;
+}
+
+static short int
+func2 (short int a, unsigned int b)
+{
+ return !b ? a : a >> b;
+}
+
+static unsigned long long
+func3 (unsigned long long a, unsigned long long b)
+{
+ return !b ? a : a % b;
+}
+
+void
+func4 (unsigned short arg1, int arg2)
+{
+ for (arg2 = 0; arg2 < 2; arg2++)
+ {
+ *ptr = func3 (func3 (10, func2 (val3, val2)), val3);
+ for (arg1 = -14; arg1 > 14; arg1 = func1 ())
+ {
+ *ptr = -1;
+ if (foo ())
+ ;
+ }
+ }
+}