OSDN Git Service

PR debug/50826
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Oct 2011 13:47:48 +0000 (13:47 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Oct 2011 13:47:48 +0000 (13:47 +0000)
* var-tracking.c (rtx_debug_expr_p): New.
(use_type): Don't use debug exprs to track non-VTA variables.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180525 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/var-tracking.c

index af5a87d..6d48ccd 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 8a64000..44bab38 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;