diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2010-05-04 15:47:25 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2010-05-04 08:47:25 -0700 |
commit | 2147c71c10b3441840bed9d1ef7ee5eb503e8113 (patch) | |
tree | 63a4b6bfbf9c88a0625283367e3485c454e33e20 /gcc/alias.c | |
parent | 85912441e43f7cf1fae2a156198362fb0cb1da81 (diff) | |
download | gcc-2147c71c10b3441840bed9d1ef7ee5eb503e8113.zip gcc-2147c71c10b3441840bed9d1ef7ee5eb503e8113.tar.gz gcc-2147c71c10b3441840bed9d1ef7ee5eb503e8113.tar.bz2 |
Handle the same VALUE for true dependence.
gcc/
2010-05-04 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/43671
* alias.c (true_dependence): Handle the same VALUE in x and mem.
(canon_true_dependence): Likewise.
(write_dependence_p): Likewise.
gcc/testsuite/
2010-05-04 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/43671
* gcc.target/i386/pr43671.c: New.
From-SVN: r159033
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index baf0a62..1d69d9d 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -2357,8 +2357,18 @@ true_dependence (const_rtx mem, enum machine_mode mem_mode, const_rtx x, if (mem_mode == VOIDmode) mem_mode = GET_MODE (mem); - x_addr = get_addr (XEXP (x, 0)); - mem_addr = get_addr (XEXP (mem, 0)); + x_addr = XEXP (x, 0); + mem_addr = XEXP (mem, 0); + if (!((GET_CODE (x_addr) == VALUE + && GET_CODE (mem_addr) != VALUE + && reg_mentioned_p (x_addr, mem_addr)) + || (GET_CODE (x_addr) != VALUE + && GET_CODE (mem_addr) == VALUE + && reg_mentioned_p (mem_addr, x_addr)))) + { + x_addr = get_addr (x_addr); + mem_addr = get_addr (mem_addr); + } base = find_base_term (x_addr); if (base && (GET_CODE (base) == LABEL_REF @@ -2440,7 +2450,16 @@ canon_true_dependence (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, return 1; if (! x_addr) - x_addr = get_addr (XEXP (x, 0)); + { + x_addr = XEXP (x, 0); + if (!((GET_CODE (x_addr) == VALUE + && GET_CODE (mem_addr) != VALUE + && reg_mentioned_p (x_addr, mem_addr)) + || (GET_CODE (x_addr) != VALUE + && GET_CODE (mem_addr) == VALUE + && reg_mentioned_p (mem_addr, x_addr)))) + x_addr = get_addr (x_addr); + } if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode)) return 0; @@ -2509,8 +2528,18 @@ write_dependence_p (const_rtx mem, const_rtx x, int writep) if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) return 1; - x_addr = get_addr (XEXP (x, 0)); - mem_addr = get_addr (XEXP (mem, 0)); + x_addr = XEXP (x, 0); + mem_addr = XEXP (mem, 0); + if (!((GET_CODE (x_addr) == VALUE + && GET_CODE (mem_addr) != VALUE + && reg_mentioned_p (x_addr, mem_addr)) + || (GET_CODE (x_addr) != VALUE + && GET_CODE (mem_addr) == VALUE + && reg_mentioned_p (mem_addr, x_addr)))) + { + x_addr = get_addr (x_addr); + mem_addr = get_addr (mem_addr); + } if (! writep) { |