re PR tree-optimization/51624 (Assert_Failure atree.adb:808 during stage 3)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 4 Jan 2012 21:34:27 +0000 (21:34 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 4 Jan 2012 21:34:27 +0000 (21:34 +0000)
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
gcc/tree-sra.c

index fc6417908eb52e68e8569a4ccc9015716659bcd4..3d9bc63654c428b5d521fed7d362470632bc583d 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+       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  <jakub@redhat.com>
 
        PR debug/51695
index db9b9bf4452338a524bdef01c02ac14fb7b03687..accbc1ebaf4aa07fd578551bc35618e7a85cb17f 100644 (file)
@@ -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);