diff options
author | Jeff Law <law@redhat.com> | 2017-01-05 00:38:48 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-01-05 00:38:48 -0700 |
commit | d80c6d02fdf0c37596e51392ade43414a350373a (patch) | |
tree | 8e37be87c8ec04e67bbf7f825c453fd039b46d57 /gcc/rtlanal.c | |
parent | 0f9cf7ff836bbc7d4f68e47918c878983c08e386 (diff) | |
download | gcc-d80c6d02fdf0c37596e51392ade43414a350373a.zip gcc-d80c6d02fdf0c37596e51392ade43414a350373a.tar.gz gcc-d80c6d02fdf0c37596e51392ade43414a350373a.tar.bz2 |
re PR rtl-optimization/78812 (Wrong code generation due to hoisting memory load across function call)
PR tree-optimizatin/78812
* rtl.h (contains_mem_rtx_p): Prototype.
* ifcvt.c (containts_mem_rtx_p): Move from here to...
* rtlanal.c (contains_mem_rtx_p): Here and remvoe static linkage.
* gcse.c (prune_expressions): Use contains_mem_rtx_p to discover
and prune MEMs that are not at the toplevel of a SET_SRC rtx. Look
through ZERO_EXTEND and SIGN_EXTEND when trying to avoid pruning
MEMs.
PR tree-optimization/78812
* g++.dg/torture/pr78812.C: New test.
From-SVN: r244093
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index ef93584..acb4230 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -685,6 +685,19 @@ rtx_addr_can_trap_p (const_rtx x) return rtx_addr_can_trap_p_1 (x, 0, 0, VOIDmode, false); } +/* Return true if X contains a MEM subrtx. */ + +bool +contains_mem_rtx_p (rtx x) +{ + subrtx_iterator::array_type array; + FOR_EACH_SUBRTX (iter, array, x, ALL) + if (MEM_P (*iter)) + return true; + + return false; +} + /* Return true if X is an address that is known to not be zero. */ bool |