diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 388076dfa28196e1eee231d3c847530c18b6bbfc..e23c31a95b260aa63a5fdfdbe9af0a559abb5097 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2002-12-24 Jim Wilson <wilson@redhat.com> + + * alias.c (record_set): Handle multi-reg hard registers. + 2002-12-24 Kazu Hirata <kazu@cs.umass.edu> * regmove.c: Fix comment typos. diff --git a/gcc/alias.c b/gcc/alias.c index 12029f053cd1484d131c24e0e494ea2f70eb7f14..fee64b1e50df27625bff57c45ef763063febee6c 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -932,6 +932,7 @@ record_set (dest, set, data) { unsigned regno; rtx src; + int n; if (GET_CODE (dest) != REG) return; @@ -941,6 +942,22 @@ record_set (dest, set, data) if (regno >= reg_base_value_size) abort (); + /* If this spans multiple hard registers, then we must indicate that every + register has an unusable value. */ + if (regno < FIRST_PSEUDO_REGISTER) + n = HARD_REGNO_NREGS (regno, GET_MODE (dest)); + else + n = 1; + if (n != 1) + { + while (--n >= 0) + { + reg_seen[regno + n] = 1; + new_reg_base_value[regno + n] = 0; + } + return; + } + if (set) { /* A CLOBBER wipes out any old value but does not prevent a previously