From 8594273a73ffb731659f16b9d469112dc0e4c113 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 4 Jan 2012 21:34:27 +0000 Subject: [PATCH] re PR tree-optimization/51624 (Assert_Failure atree.adb:808 during stage 3) PR tree-optimization/51624 * tree-sra.c (build_ref_for_model): When replicating a chain of COMPONENT_REFs, stop as soon as the offset would become negative. From-SVN: r182889 --- gcc/ChangeLog | 6 ++++++ gcc/tree-sra.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc6417908eb..3d9bc63654c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-04 Eric Botcazou + + PR tree-optimization/51624 + * tree-sra.c (build_ref_for_model): When replicating a chain of + COMPONENT_REFs, stop as soon as the offset would become negative. + 2012-01-04 Jakub Jelinek PR debug/51695 diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index db9b9bf4452..accbc1ebaf4 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1520,11 +1520,16 @@ build_ref_for_model (location_t loc, tree base, HOST_WIDE_INT offset, do { tree field = TREE_OPERAND (expr, 1); tree cr_offset = component_ref_field_offset (expr); - gcc_assert (cr_offset && host_integerp (cr_offset, 1)); + HOST_WIDE_INT bit_pos + = tree_low_cst (cr_offset, 1) * BITS_PER_UNIT + + TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field)); - offset -= TREE_INT_CST_LOW (cr_offset) * BITS_PER_UNIT; - offset -= TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field)); + /* We can be called with a model different from the one associated + with BASE so we need to avoid going up the chain too far. */ + if (offset - bit_pos < 0) + break; + offset -= bit_pos; VEC_safe_push (tree, stack, cr_stack, expr); expr = TREE_OPERAND (expr, 0);