diff options
author | Kenneth Zadeck <zadeck@naturalbridge.com> | 2009-11-04 23:17:54 +0000 |
---|---|---|
committer | Kenneth Zadeck <zadeck@gcc.gnu.org> | 2009-11-04 23:17:54 +0000 |
commit | 4f2da32b77ba98bfe2430b7873b35ab6bcb49512 (patch) | |
tree | a3da37c593fe5498cc998681f5fb2a44272ca10f /gcc/df-scan.c | |
parent | cb5f2074802fe0ca5668b6ec3f86cbaf01840637 (diff) | |
download | gcc-4f2da32b77ba98bfe2430b7873b35ab6bcb49512.zip gcc-4f2da32b77ba98bfe2430b7873b35ab6bcb49512.tar.gz gcc-4f2da32b77ba98bfe2430b7873b35ab6bcb49512.tar.bz2 |
df-scan.c (df-uses-record): Add case zero_extract of mem.
2009-11-04 Kenneth Zadeck <zadeck@naturalbridge.com>
* df-scan.c (df-uses-record): Add case zero_extract of mem.
From-SVN: r153924
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r-- | gcc/df-scan.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c index 45df29e..101234b 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -3248,10 +3248,23 @@ df_uses_record (enum df_ref_class cl, struct df_collection_rec *collection_rec, width = INTVAL (XEXP (dst, 1)); offset = INTVAL (XEXP (dst, 2)); mode = GET_MODE (dst); - df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (dst, 0), - DF_REF_REG_USE, bb, insn_info, - DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT, - width, offset, mode); + if (GET_CODE (XEXP (dst,0)) == MEM) + { + /* Handle the case of zero_extract(mem(...)) in the set dest. + This special case is allowed only if the mem is a single byte and + is useful to set a bitfield in memory. */ + df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (XEXP (dst,0), 0), + DF_REF_REG_MEM_STORE, bb, insn_info, + DF_REF_ZERO_EXTRACT, + width, offset, mode); + } + else + { + df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (dst, 0), + DF_REF_REG_USE, bb, insn_info, + DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT, + width, offset, mode); + } } else { |