re PR middle-end/70022 (ICE: in tree_to_shwi, at tree.c:7328 with out-of-bounds vector index)

2016-03-01  Richard Biener  <rguenther@suse.de>

	PR middle-end/70022
	* fold-const.c (fold_indirect_ref_1): Fix range checking for
	vector BIT_FIELD_REF extract.

	* gcc.dg/pr70022.c: New testcase.

From-SVN: r233852
This commit is contained in:
Richard Biener 2016-03-01 13:32:13 +00:00 committed by Richard Biener
parent 366298bdda
commit 1b19470d14
4 changed files with 33 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2016-03-01 Richard Biener <rguenther@suse.de>
PR middle-end/70022
* fold-const.c (fold_indirect_ref_1): Fix range checking for
vector BIT_FIELD_REF extract.
2016-03-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/69994

View File

@ -14218,17 +14218,20 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0)
if (TREE_CODE (op00type) == VECTOR_TYPE
&& type == TREE_TYPE (op00type))
{
HOST_WIDE_INT offset = tree_to_shwi (op01);
tree part_width = TYPE_SIZE (type);
unsigned HOST_WIDE_INT part_widthi = tree_to_shwi (part_width)/BITS_PER_UNIT;
unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
tree index = bitsize_int (indexi);
if (offset / part_widthi < TYPE_VECTOR_SUBPARTS (op00type))
return fold_build3_loc (loc,
BIT_FIELD_REF, type, op00,
part_width, index);
unsigned HOST_WIDE_INT max_offset
= (tree_to_uhwi (part_width) / BITS_PER_UNIT
* TYPE_VECTOR_SUBPARTS (op00type));
if (tree_int_cst_sign_bit (op01) == 0
&& compare_tree_int (op01, max_offset) == -1)
{
unsigned HOST_WIDE_INT offset = tree_to_uhwi (op01);
unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
tree index = bitsize_int (indexi);
return fold_build3_loc (loc,
BIT_FIELD_REF, type, op00,
part_width, index);
}
}
/* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
else if (TREE_CODE (op00type) == COMPLEX_TYPE

View File

@ -1,3 +1,8 @@
2016-03-01 Richard Biener <rguenther@suse.de>
PR middle-end/70022
* gcc.dg/pr70022.c: New testcase.
2016-03-01 Ilya Enkovich <enkovich.gnu@gmail.com>
PR tree-optimization/69956

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
typedef int v4si __attribute__ ((vector_size (16)));
int
foo (v4si v)
{
return v[~0UL];
}