Commit a4d758d0 by Richard Biener Committed by Richard Biener

re PR c/82765 (ICE at -Os on valid code on x86_64-linux-gnu: in tree_to_shwi, at tree.c:6611)

2017-11-02  Richard Biener  <rguenther@suse.de>

	PR middle-end/82765
	* varasm.c (decode_addr_const): Make offset HOST_WIDE_INT.
	Truncate ARRAY_REF index and element size.

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

From-SVN: r254337
parent 30d124e1
2017-11-02 Richard Biener <rguenther@suse.de>
PR middle-end/82765
* varasm.c (decode_addr_const): Make offset HOST_WIDE_INT.
Truncate ARRAY_REF index and element size.
2017-11-01 Palmer Dabbelt <palmer@dabbelt.com>
* doc/invoke.texi (RISC-V Options): Use "@minus{}2 GB", not "-2 GB".
2017-11-02 Richard Biener <rguenther@suse.de>
PR middle-end/82765
* gcc.dg/pr82765.c: New testcase.
2017-11-02 Tom de Vries <tom@codesourcery.com>
* gfortran.dg/implied_do_io_1.f90: Fix scan-tree-dump-times pattern.
......
/* { dg-do compile } */
/* { dg-options "-Os -w" } */
int a[1][1];
int main() { int *b[] = {a, a[1820408606019012862278468], a, a, a}; }
......@@ -2879,7 +2879,7 @@ static void
decode_addr_const (tree exp, struct addr_const *value)
{
tree target = TREE_OPERAND (exp, 0);
int offset = 0;
HOST_WIDE_INT offset = 0;
rtx x;
while (1)
......@@ -2893,8 +2893,9 @@ decode_addr_const (tree exp, struct addr_const *value)
else if (TREE_CODE (target) == ARRAY_REF
|| TREE_CODE (target) == ARRAY_RANGE_REF)
{
offset += (tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (target)))
* tree_to_shwi (TREE_OPERAND (target, 1)));
/* Truncate big offset. */
offset += (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (target)))
* TREE_INT_CST_LOW (TREE_OPERAND (target, 1)));
target = TREE_OPERAND (target, 0);
}
else if (TREE_CODE (target) == MEM_REF
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment