aboutsummaryrefslogtreecommitdiff
path: root/gcc/global.c
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2008-01-30 11:18:27 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2008-01-30 11:18:27 +0000
commitf36a5a8853c2407900cdc21b3a400130aa6f6dda (patch)
tree6593f73075d1b463fa35f873cbf27a2fb1776eb3 /gcc/global.c
parent393c005884c547ee6d4cebb2fb938e6214714e9e (diff)
downloadgcc-f36a5a8853c2407900cdc21b3a400130aa6f6dda.zip
gcc-f36a5a8853c2407900cdc21b3a400130aa6f6dda.tar.gz
gcc-f36a5a8853c2407900cdc21b3a400130aa6f6dda.tar.bz2
re PR rtl-optimization/34998 (gcc.c-torture/execute/20040709-1.c fails for -EL -mips16 -O3)
gcc/ PR rtl-optimization/34998 * global.c (build_insn_chain): Treat non-subreg_lowpart SUBREGs of pseudos as clobbering all the words covered by the SUBREG, not just all the bytes. * ra-conflict.c (clear_reg_in_live): Likewise. Take the original df_ref rather than an extract parameter. (global_conflicts): Update call accordingly. From-SVN: r131960
Diffstat (limited to 'gcc/global.c')
-rw-r--r--gcc/global.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/global.c b/gcc/global.c
index b8a0ec7..12641a6 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -1501,6 +1501,17 @@ build_insn_chain (void)
live_subregs,
live_subregs_used,
regno, reg);
+
+ if (!DF_REF_FLAGS_IS_SET
+ (def, DF_REF_STRICT_LOWER_PART))
+ {
+ /* Expand the range to cover entire words.
+ Bytes added here are "don't care". */
+ start = start / UNITS_PER_WORD * UNITS_PER_WORD;
+ last = ((last + UNITS_PER_WORD - 1)
+ / UNITS_PER_WORD * UNITS_PER_WORD);
+ }
+
/* Ignore the paradoxical bits. */
if ((int)last > live_subregs_used[regno])
last = live_subregs_used[regno];