re PR tree-optimization/51990 (ICE in copy_reference_ops_from_ref)
authorTom de Vries <tom@codesourcery.com>
Fri, 27 Jan 2012 10:38:27 +0000 (10:38 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Fri, 27 Jan 2012 10:38:27 +0000 (10:38 +0000)
2012-01-27  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/51990
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle WITH_SIZE_EXPR.
* tree-ssa-pre.c (create_component_ref_by_pieces_1): Same.

From-SVN: r183614

gcc/ChangeLog
gcc/tree-ssa-pre.c
gcc/tree-ssa-sccvn.c

index fe748f4f24e616b1f2f1a55bc57ff74e3b32b756..e7fb05d9bad32fa9cd4881911d0279335b0ad330 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-27  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/51990
+       * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle WITH_SIZE_EXPR.
+       * tree-ssa-pre.c (create_component_ref_by_pieces_1): Same.
+
 2012-01-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/52001
index b95ac78385635869a175c414439d03ee6b881043..71f945fc49175e87340bd906ae4d33d7bcd93d8f 100644 (file)
@@ -2792,6 +2792,23 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
        return folded;
       }
       break;
+    case WITH_SIZE_EXPR:
+      {
+       tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
+                                                       stmts, domstmt);
+       pre_expr op1expr = get_or_alloc_expr_for (currop->op0);
+       tree genop1;
+
+       if (!genop0)
+         return NULL_TREE;
+
+       genop1 = find_or_generate_expression (block, op1expr, stmts, domstmt);
+       if (!genop1)
+         return NULL_TREE;
+
+       return fold_build2 (currop->opcode, currop->type, genop0, genop1);
+      }
+      break;
     case BIT_FIELD_REF:
       {
        tree folded;
index 1f0360011e3d553f59a272d1133e67e1518a88d1..fdebe477a3a08e972638f03693fd3c87dedd77df 100644 (file)
@@ -628,6 +628,10 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
 
       switch (temp.opcode)
        {
+       case WITH_SIZE_EXPR:
+         temp.op0 = TREE_OPERAND (ref, 1);
+         temp.off = 0;
+         break;
        case MEM_REF:
          /* The base address gets its own vn_reference_op_s structure.  */
          temp.op0 = TREE_OPERAND (ref, 1);
@@ -744,6 +748,7 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
       VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
 
       if (REFERENCE_CLASS_P (ref)
+         || TREE_CODE (ref) == WITH_SIZE_EXPR
          || (TREE_CODE (ref) == ADDR_EXPR
              && !is_gimple_min_invariant (ref)))
        ref = TREE_OPERAND (ref, 0);