summaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorzlomek <zlomek@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-28 06:00:45 +0000
committerzlomek <zlomek@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-28 06:00:45 +0000
commitd887990506aaf31a4aaab2a59570a18d88278a74 (patch)
tree59429b428bd2342b0855330999b0587741d5df96 /gcc/var-tracking.c
parenta6a7195f9c182768f33c7f3eafe80b806e6c8131 (diff)
downloadgcc-d887990506aaf31a4aaab2a59570a18d88278a74.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81242 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r--gcc/var-tracking.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index be66392f07d..28c0c6fbdba 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -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);
}