diff options
author | aldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-17 20:59:40 +0000 |
---|---|---|
committer | aldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-17 20:59:40 +0000 |
commit | 43b6ba4524af49f06807042914b69ff7be886471 (patch) | |
tree | 6246e46226dfe3ca8100baf6e693f108a7fa2483 /gcc | |
parent | 62b5416559ae6accd131515a2694372854e8f295 (diff) | |
download | gcc-43b6ba4524af49f06807042914b69ff7be886471.tar.gz |
PR rtl-optimization/54900
* ifcvt.c (noce_can_store_speculate_p): Call
memory_must_be_modified_in_insn_p.
* alias.c (memory_must_be_modified_in_insn_p): New.
(set_dest_equal_p): New.
* rtl.h (memory_must_be_modified_in_p): Protoize.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192548 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/alias.c | 33 | ||||
-rw-r--r-- | gcc/ifcvt.c | 2 | ||||
-rw-r--r-- | gcc/rtl.h | 1 |
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6571fdcd183..9c6a1d96edc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-10-17 Aldy Hernandez <aldyh@redhat.com> + + PR rtl-optimization/54900 + * ifcvt.c (noce_can_store_speculate_p): Call + memory_must_be_modified_in_insn_p. + * alias.c (memory_must_be_modified_in_insn_p): New. + (set_dest_equal_p): New. + * rtl.h (memory_must_be_modified_in_p): Protoize. + 2012-10-17 Michael Meissner <meissner@linux.vnet.ibm.com> * config/rs6000/rs6000.opt (rs6000_isa_flags): New flag word to diff --git a/gcc/alias.c b/gcc/alias.c index 244ca520c92..c5e64176313 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -2762,6 +2762,39 @@ memory_modified_in_insn_p (const_rtx mem, const_rtx insn) return memory_modified; } +/* Return TRUE if the destination of a set is rtx identical to + ITEM. */ +static inline bool +set_dest_equal_p (const_rtx set, const_rtx item) +{ + rtx dest = SET_DEST (set); + return rtx_equal_p (dest, item); +} + +/* Like memory_modified_in_insn_p, but return TRUE if INSN will + *DEFINITELY* modify the memory contents of MEM. */ +bool +memory_must_be_modified_in_insn_p (const_rtx mem, const_rtx insn) +{ + if (!INSN_P (insn)) + return false; + insn = PATTERN (insn); + if (GET_CODE (insn) == SET) + return set_dest_equal_p (insn, mem); + else if (GET_CODE (insn) == PARALLEL) + { + int i; + for (i = 0; i < XVECLEN (insn, 0); i++) + { + rtx sub = XVECEXP (insn, 0, i); + if (GET_CODE (sub) == SET + && set_dest_equal_p (sub, mem)) + return true; + } + } + return false; +} + /* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE array. */ diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 2f486a231b7..5654c667547 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -2415,7 +2415,7 @@ noce_can_store_speculate_p (basic_block top_bb, const_rtx mem) || (CALL_P (insn) && (!RTL_CONST_CALL_P (insn))))) return false; - if (memory_modified_in_insn_p (mem, insn)) + if (memory_must_be_modified_in_insn_p (mem, insn)) return true; if (modified_in_p (XEXP (mem, 0), insn)) return false; diff --git a/gcc/rtl.h b/gcc/rtl.h index eeeb6ba4de0..09f1e773899 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2616,6 +2616,7 @@ extern void init_alias_analysis (void); extern void end_alias_analysis (void); extern void vt_equate_reg_base_value (const_rtx, const_rtx); extern bool memory_modified_in_insn_p (const_rtx, const_rtx); +extern bool memory_must_be_modified_in_insn_p (const_rtx, const_rtx); extern bool may_be_sp_based_p (rtx); extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int); extern rtx get_reg_known_value (unsigned int); |