From f5109c63b126636f82f5d3ffe550bf6813d302f2 Mon Sep 17 00:00:00 2001 From: zadeck Date: Wed, 4 Nov 2009 23:17:54 +0000 Subject: [PATCH] 2009-11-04 Kenneth Zadeck * df-scan.c (df-uses-record): Add case zero_extract of mem. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153924 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/df-scan.c | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 38a62e2..905978d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2009-11-04 Kenneth Zadeck + + * df-scan.c (df-uses-record): Add case zero_extract of mem. + 2009-11-04 Eric Botcazou PR target/10127 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 { -- 2.7.4