diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-01-19 13:34:45 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-01-19 13:34:45 +0100 |
commit | 569efc34ebc4f0a01d435dc11c3146b5442132cd (patch) | |
tree | 75a7d1ce1a175bc96655f4cf67f8ea84e0f07f16 /gcc/alias.c | |
parent | e49d321f033c35d907d9d3eb339efaa6a8ba1e52 (diff) | |
download | gcc-569efc34ebc4f0a01d435dc11c3146b5442132cd.zip gcc-569efc34ebc4f0a01d435dc11c3146b5442132cd.tar.gz gcc-569efc34ebc4f0a01d435dc11c3146b5442132cd.tar.bz2 |
re PR rtl-optimization/68955 (wrong code at -O3 on x86-64-linux-gnu in 32-bit mode)
PR rtl-optimization/68955
PR rtl-optimization/64557
* dse.c (record_store, check_mem_read_rtx): Don't call get_addr
here. Fix up formatting.
* alias.c (get_addr): Handle VALUE +/- CONST_SCALAR_INT_P.
* gcc.dg/torture/pr68955.c: New test.
From-SVN: r232554
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index 352ae09..d3273e8 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -2193,8 +2193,8 @@ refs_newer_value_p (const_rtx expr, rtx v) } /* Convert the address X into something we can use. This is done by returning - it unchanged unless it is a value; in the latter case we call cselib to get - a more useful rtx. */ + it unchanged unless it is a VALUE or VALUE +/- constant; for VALUE + we call cselib to get a more useful rtx. */ rtx get_addr (rtx x) @@ -2203,7 +2203,23 @@ get_addr (rtx x) struct elt_loc_list *l; if (GET_CODE (x) != VALUE) - return x; + { + if ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS) + && GET_CODE (XEXP (x, 0)) == VALUE + && CONST_SCALAR_INT_P (XEXP (x, 1))) + { + rtx op0 = get_addr (XEXP (x, 0)); + if (op0 != XEXP (x, 0)) + { + if (GET_CODE (x) == PLUS + && GET_CODE (XEXP (x, 1)) == CONST_INT) + return plus_constant (GET_MODE (x), op0, INTVAL (XEXP (x, 1))); + return simplify_gen_binary (GET_CODE (x), GET_MODE (x), + op0, XEXP (x, 1)); + } + } + return x; + } v = CSELIB_VAL_PTR (x); if (v) { |