Hi.
This is partial fix for the PR, where I calculate 2 offsets in offset_int type.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
Ready to be installed?
Martin
gcc/ChangeLog:
2017-09-20 Martin Liska <[email protected]>
PR tree-optimization/82042
* alias.c (memrefs_conflict_p): Calculate offset in offset_int
type.
* cse.c (use_related_value): Likewise.
---
gcc/alias.c | 10 ++++++++--
gcc/cse.c | 14 ++++++++++----
2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/gcc/alias.c b/gcc/alias.c
index e4865729a9b..6121e61e1bc 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2580,8 +2580,14 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
{
if (CONST_INT_P (x) && CONST_INT_P (y))
{
- c += (INTVAL (y) - INTVAL (x));
- return offset_overlap_p (c, xsize, ysize);
+ offset_int offset = (offset_int (INTVAL (y)) - INTVAL (x));
+ if (wi::fits_shwi_p (offset))
+ {
+ c += offset.to_shwi ();
+ return offset_overlap_p (c, xsize, ysize);
+ }
+ else
+ return -1;
}
if (GET_CODE (x) == CONST)
diff --git a/gcc/cse.c b/gcc/cse.c
index 672fd2eaea9..0b331983c20 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2135,7 +2135,7 @@ use_related_value (rtx x, struct table_elt *elt)
{
struct table_elt *relt = 0;
struct table_elt *p, *q;
- HOST_WIDE_INT offset;
+ offset_int offset;
/* First, is there anything related known?
If we have a table element, we can tell from that.
@@ -2192,9 +2192,15 @@ use_related_value (rtx x, struct table_elt *elt)
if (q == 0)
return 0;
- offset = (get_integer_term (x) - get_integer_term (p->exp));
- /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
- return plus_constant (q->mode, q->exp, offset);
+ offset = (offset_int (get_integer_term (x)) - get_integer_term (p->exp));
+ if (wi::fits_shwi_p (offset))
+ {
+ /* Note: OFFSET may be 0 if P->xexp and X are related
+ by commutativity. */
+ return plus_constant (q->mode, q->exp, offset.to_shwi ());
+ }
+ else
+ return 0;
}