]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR debug/50826 (bootstrap on 64 bit pa broken by r180194, ICE in mem_loc_descriptor)
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 26 Oct 2011 13:47:48 +0000 (13:47 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 26 Oct 2011 13:47:48 +0000 (13:47 +0000)
PR debug/50826
* var-tracking.c (rtx_debug_expr_p): New.
(use_type): Don't use debug exprs to track non-VTA variables.

From-SVN: r180525

gcc/ChangeLog
gcc/var-tracking.c

index af5a87de276fe7fc82d6577333127ac11dd015f9..6d48ccd9fe5d1fe24096aa0192775589283557a0 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-26  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR debug/50826
+       * var-tracking.c (rtx_debug_expr_p): New.
+       (use_type): Don't use debug exprs to track non-VTA variables.
+
 2011-10-26  Jeff Law  <law@redhat.com>
 
        * doc/invoke.texi (sink-frequency-threshold): Document.
index 8a64000b616310304d00adf125b247d20977d38c..44bab38de0017e3b5bd7102286e4ec31e54321d1 100644 (file)
@@ -4907,6 +4907,18 @@ replace_expr_with_values (rtx loc)
     return cselib_subst_to_values (loc, VOIDmode);
 }
 
+/* Return true if *X is a DEBUG_EXPR.  Usable as an argument to
+   for_each_rtx to tell whether there are any DEBUG_EXPRs within
+   RTX.  */
+
+static int
+rtx_debug_expr_p (rtx *x, void *data ATTRIBUTE_UNUSED)
+{
+  rtx loc = *x;
+
+  return GET_CODE (loc) == DEBUG_EXPR;
+}
+
 /* Determine what kind of micro operation to choose for a USE.  Return
    MO_CLOBBER if no micro operation is to be generated.  */
 
@@ -4988,7 +5000,13 @@ use_type (rtx loc, struct count_use_info *cui, enum machine_mode *modep)
       else if (target_for_debug_bind (var_debug_decl (expr)))
        return MO_CLOBBER;
       else if (track_loc_p (loc, expr, INT_MEM_OFFSET (loc),
-                           false, modep, NULL))
+                           false, modep, NULL)
+              /* Multi-part variables shouldn't refer to one-part
+                 variable names such as VALUEs (never happens) or
+                 DEBUG_EXPRs (only happens in the presence of debug
+                 insns).  */
+              && (!MAY_HAVE_DEBUG_INSNS
+                  || !for_each_rtx (&XEXP (loc, 0), rtx_debug_expr_p, NULL)))
        return MO_USE;
       else
        return MO_CLOBBER;