diff options
author | Richard Biener <rguenther@suse.de> | 2016-07-19 10:19:46 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-07-19 10:19:46 +0000 |
commit | cef5388d95009657bd34179e4086da5074c67dcd (patch) | |
tree | 05880e90b539eab18ab3f9cd3a92b9fd7c120e74 /gcc/tree-ssa-pre.c | |
parent | 9a4cb9733db86b7be143a2b8ab7d03406e025a5d (diff) | |
download | gcc-cef5388d95009657bd34179e4086da5074c67dcd.zip gcc-cef5388d95009657bd34179e4086da5074c67dcd.tar.gz gcc-cef5388d95009657bd34179e4086da5074c67dcd.tar.bz2 |
re PR tree-optimization/71901 (ice in find_or_generate_expression)
2016-07-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/71901
* tree-ssa-sccvn.h (struct vn_reference_op_struct): Add
align member, group stuff with the bitfield.
(vn_ref_op_align_unit): New inline.
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): For ARRAY_REFs
record element alignment and operand 3 unchanged.
(ao_ref_init_from_vn_reference): Adjust.
(valueize_refs_1): Likewise.
* tree-ssa-pre.c (create_component_ref_by_pieces_1): Likewise.
* gcc.dg/torture/pr71901.c: New testcase.
From-SVN: r238468
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index c59aab8..a5f3486 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2570,15 +2570,14 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref, here as the element alignment may be not visible. See PR43783. Simply drop the element size for constant sizes. */ - if (tree_int_cst_equal (genop3, TYPE_SIZE_UNIT (elmt_type))) + if (TREE_CODE (genop3) == INTEGER_CST + && TREE_CODE (TYPE_SIZE_UNIT (elmt_type)) == INTEGER_CST + && wi::eq_p (wi::to_offset (TYPE_SIZE_UNIT (elmt_type)), + (wi::to_offset (genop3) + * vn_ref_op_align_unit (currop)))) genop3 = NULL_TREE; else { - genop3 = size_binop (EXACT_DIV_EXPR, genop3, - size_int (TYPE_ALIGN_UNIT (elmt_type))); - /* We may have a useless conversion added by - array_ref_element_size via copy_reference_opts_from_ref. */ - STRIP_USELESS_TYPE_CONVERSION (genop3); genop3 = find_or_generate_expression (block, genop3, stmts); if (!genop3) return NULL_TREE; |