From 606f008bed9783d2775d5c071f5361ba55904683 Mon Sep 17 00:00:00 2001 From: rguenth Date: Fri, 16 Feb 2018 07:56:16 +0000 Subject: 2018-02-16 Richard Biener PR tree-optimization/84190 * tree-ssa.c (non_rewritable_mem_ref_base): Do not touch volatile accesses if the decl isn't volatile. * g++.dg/torture/pr84190.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257721 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-ssa.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gcc/tree-ssa.c') diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index ee311ce9758..949b951e1aa 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1427,7 +1427,8 @@ non_rewritable_mem_ref_base (tree ref) if (! DECL_P (decl)) return NULL_TREE; if (! is_gimple_reg_type (TREE_TYPE (base)) - || VOID_TYPE_P (TREE_TYPE (base))) + || VOID_TYPE_P (TREE_TYPE (base)) + || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base)) return decl; if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE) -- cgit v1.2.1 From a5a5010fe7021969848db8c5a787b71781be2201 Mon Sep 17 00:00:00 2001 From: rguenth Date: Fri, 16 Feb 2018 12:01:23 +0000 Subject: 2018-02-16 Richard Biener 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. * gcc.dg/torture/pr84417.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257731 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-ssa.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'gcc/tree-ssa.c') diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 949b951e1aa..d197f99bdd2 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; } -- cgit v1.2.1