aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr84417.c9
-rw-r--r--gcc/tree-ssa.c11
4 files changed, 27 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9e7b575..c43637a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-02-16 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/84417
+ * tree-ssa.c (non_rewritable_mem_ref_base): Properly constrain
+ the MEM_REF offset when conversion to BIT_FIELD_REF is desired.
+ (non_rewritable_lvalue_p): Likewise, use poly-ints.
+
2018-02-16 Martin Liska <mliska@suse.cz>
PR sanitizer/84307
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2ead408..2d98e2e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-16 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/84417
+ * gcc.dg/torture/pr84417.c: New testcase.
+
2018-02-16 Jakub Jelinek <jakub@redhat.com>
PR target/84272
diff --git a/gcc/testsuite/gcc.dg/torture/pr84417.c b/gcc/testsuite/gcc.dg/torture/pr84417.c
new file mode 100644
index 0000000..9c2b023
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr84417.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32plus } */
+
+void fn1()
+{
+ __attribute__((__vector_size__(sizeof(double)))) double x;
+ double *a = (double *)&x;
+ *a + *(a + 8446744073709551615LL);
+}
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 949b951..d197f99 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -1434,6 +1434,7 @@ non_rewritable_mem_ref_base (tree ref)
|| TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
&& useless_type_conversion_p (TREE_TYPE (base),
TREE_TYPE (TREE_TYPE (decl)))
+ && known_ge (mem_ref_offset (base), 0)
&& known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
mem_ref_offset (base))
&& multiple_of_p (sizetype, TREE_OPERAND (base, 1),
@@ -1516,11 +1517,11 @@ non_rewritable_lvalue_p (tree lhs)
&& TYPE_MODE (TREE_TYPE (decl)) != BLKmode
&& operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))), 0)
- && tree_fits_uhwi_p (TREE_OPERAND (lhs, 1))
- && tree_int_cst_lt (TREE_OPERAND (lhs, 1),
- TYPE_SIZE_UNIT (TREE_TYPE (decl)))
- && (tree_to_uhwi (TREE_OPERAND (lhs, 1))
- % tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))) == 0)
+ && known_ge (mem_ref_offset (lhs), 0)
+ && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
+ mem_ref_offset (lhs))
+ && multiple_of_p (sizetype, TREE_OPERAND (lhs, 1),
+ TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
return false;
}