var-tracking.c (variable_different_p): Add a parameter compare_current_location...
authorJosef Zlomek <zlomekj@suse.cz>
Wed, 28 Apr 2004 06:00:45 +0000 (08:00 +0200)
committerJosef Zlomek <zlomek@gcc.gnu.org>
Wed, 28 Apr 2004 06:00:45 +0000 (06:00 +0000)
* var-tracking.c (variable_different_p): Add a parameter
compare_current_location, compare current location of variable parts
if it is true.
(dataflow_set_different_1): Pass compare_current_location == false.
(dataflow_set_different_2): Pass compare_current_location == false.
(emit_notes_for_differences_1): Pass compare_current_location == true.

From-SVN: r81242

gcc/ChangeLog
gcc/var-tracking.c

index 1f8d3e3dea02777d0667c71b2be21698ff77d3ef..6770285e3627a588ac3187646caacd8cc5b4cdaf 100644 (file)
@@ -1,3 +1,12 @@
+2004-04-28  Josef Zlomek  <zlomekj@suse.cz>
+
+       * var-tracking.c (variable_different_p): Add a parameter
+       compare_current_location, compare current location of variable parts
+       if it is true.
+       (dataflow_set_different_1): Pass compare_current_location == false.
+       (dataflow_set_different_2): Pass compare_current_location == false.
+       (emit_notes_for_differences_1): Pass compare_current_location == true.
+
 2004-04-28  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * config/s390/s390.md ("casesi"): Mark jump table access as
index be66392f07d1902df973b661ae74243dbe1eb980..28c0c6fbdbaad2b31bd8bf6865c47546af669978 100644 (file)
@@ -304,7 +304,7 @@ static int variable_union_info_cmp_pos (const void *, const void *);
 static int variable_union (void **, void *);
 static void dataflow_set_union (dataflow_set *, dataflow_set *);
 static bool variable_part_different_p (variable_part *, variable_part *);
-static bool variable_different_p (variable, variable);
+static bool variable_different_p (variable, variable, bool);
 static int dataflow_set_different_1 (void **, void *);
 static int dataflow_set_different_2 (void **, void *);
 static bool dataflow_set_different (dataflow_set *, dataflow_set *);
@@ -1260,12 +1260,13 @@ variable_part_different_p (variable_part *vp1, variable_part *vp2)
   return false;
 }
 
-/* Return true if variables VAR1 and VAR2 are different (only the first
-   location in the list of locations is checked for each offset,
-   i.e. when true is returned a note should be emitted).  */
+/* Return true if variables VAR1 and VAR2 are different.
+   If COMPARE_CURRENT_LOCATION is true compare also the cur_loc of each
+   variable part.  */
 
 static bool
-variable_different_p (variable var1, variable var2)
+variable_different_p (variable var1, variable var2,
+                     bool compare_current_location)
 {
   int i;
 
@@ -1279,6 +1280,16 @@ variable_different_p (variable var1, variable var2)
     {
       if (var1->var_part[i].offset != var2->var_part[i].offset)
        return true;
+      if (compare_current_location)
+       {
+         if (!((GET_CODE (var1->var_part[i].cur_loc) == REG
+                && GET_CODE (var2->var_part[i].cur_loc) == REG
+                && (REGNO (var1->var_part[i].cur_loc)
+                    == REGNO (var2->var_part[i].cur_loc)))
+               || rtx_equal_p (var1->var_part[i].cur_loc,
+                               var2->var_part[i].cur_loc)))
+           return true;
+       }
       if (variable_part_different_p (&var1->var_part[i], &var2->var_part[i]))
        return true;
       if (variable_part_different_p (&var2->var_part[i], &var1->var_part[i]))
@@ -1307,7 +1318,7 @@ dataflow_set_different_1 (void **slot, void *data)
       return 0;
     }
 
-  if (variable_different_p (var1, var2))
+  if (variable_different_p (var1, var2, false))
     {
       dataflow_set_different_value = true;
 
@@ -1342,7 +1353,7 @@ dataflow_set_different_2 (void **slot, void *data)
 #ifdef ENABLE_CHECKING
   /* If both variables are defined they have been already checked for
      equivalence.  */
-  if (variable_different_p (var1, var2))
+  if (variable_different_p (var1, var2, false))
     abort ();
 #endif
 
@@ -2286,7 +2297,7 @@ emit_notes_for_differences_1 (void **slot, void *data)
       empty_var->n_var_parts = 0;
       variable_was_changed (empty_var, NULL);
     }
-  else if (variable_different_p (old_var, new_var))
+  else if (variable_different_p (old_var, new_var, true))
     {
       variable_was_changed (new_var, NULL);
     }