PR tree-optimization/53436
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 May 2012 21:05:33 +0000 (21:05 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 May 2012 21:05:33 +0000 (21:05 +0000)
* omp-low.c (omp_build_component_ref): New function.
(build_receiver_ref, build_sender_ref, create_task_copyfn): Use it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187741 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/omp-low.c

index 8b24de1..798ed80 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/53436
+       * omp-low.c (omp_build_component_ref): New function.
+       (build_receiver_ref, build_sender_ref, create_task_copyfn): Use it.
+
 2012-05-21  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (put_condition_code): Change "reverse" and "fp"
index 7136a7b..980d06f 100644 (file)
@@ -852,6 +852,19 @@ omp_copy_decl_1 (tree var, omp_context *ctx)
   return omp_copy_decl_2 (var, DECL_NAME (var), TREE_TYPE (var), ctx);
 }
 
+/* Build COMPONENT_REF and set TREE_THIS_VOLATILE and TREE_READONLY on it
+   as appropriate.  */
+static tree
+omp_build_component_ref (tree obj, tree field)
+{
+  tree ret = build3 (COMPONENT_REF, TREE_TYPE (field), obj, field, NULL);
+  if (TREE_THIS_VOLATILE (field))
+    TREE_THIS_VOLATILE (ret) |= 1;
+  if (TREE_READONLY (field))
+    TREE_READONLY (ret) |= 1;
+  return ret;
+}
+
 /* Build tree nodes to access the field for VAR on the receiver side.  */
 
 static tree
@@ -866,7 +879,7 @@ build_receiver_ref (tree var, bool by_ref, omp_context *ctx)
     field = x;
 
   x = build_simple_mem_ref (ctx->receiver_decl);
-  x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL);
+  x = omp_build_component_ref (x, field);
   if (by_ref)
     x = build_simple_mem_ref (x);
 
@@ -916,8 +929,7 @@ static tree
 build_sender_ref (tree var, omp_context *ctx)
 {
   tree field = lookup_sfield (var, ctx);
-  return build3 (COMPONENT_REF, TREE_TYPE (field),
-                ctx->sender_decl, field, NULL);
+  return omp_build_component_ref (ctx->sender_decl, field);
 }
 
 /* Add a new field for VAR inside the structure CTX->SENDER_DECL.  */
@@ -6529,7 +6541,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
          sf = (tree) n->value;
          sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
          src = build_simple_mem_ref_loc (loc, sarg);
-         src = build3 (COMPONENT_REF, TREE_TYPE (sf), src, sf, NULL);
+         src = omp_build_component_ref (src, sf);
          t = build2 (MODIFY_EXPR, TREE_TYPE (*p), *p, src);
          append_to_statement_list (t, &list);
        }
@@ -6552,9 +6564,9 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
        if (tcctx.cb.decl_map)
          sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
        src = build_simple_mem_ref_loc (loc, sarg);
-       src = build3 (COMPONENT_REF, TREE_TYPE (sf), src, sf, NULL);
+       src = omp_build_component_ref (src, sf);
        dst = build_simple_mem_ref_loc (loc, arg);
-       dst = build3 (COMPONENT_REF, TREE_TYPE (f), dst, f, NULL);
+       dst = omp_build_component_ref (dst, f);
        t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
        append_to_statement_list (t, &list);
        break;
@@ -6575,14 +6587,14 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
            if (tcctx.cb.decl_map)
              sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
            src = build_simple_mem_ref_loc (loc, sarg);
-           src = build3 (COMPONENT_REF, TREE_TYPE (sf), src, sf, NULL);
+           src = omp_build_component_ref (src, sf);
            if (use_pointer_for_field (decl, NULL) || is_reference (decl))
              src = build_simple_mem_ref_loc (loc, src);
          }
        else
          src = decl;
        dst = build_simple_mem_ref_loc (loc, arg);
-       dst = build3 (COMPONENT_REF, TREE_TYPE (f), dst, f, NULL);
+       dst = omp_build_component_ref (dst, f);
        t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src);
        append_to_statement_list (t, &list);
        break;
@@ -6601,14 +6613,14 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
            if (tcctx.cb.decl_map)
              sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
            src = build_simple_mem_ref_loc (loc, sarg);
-           src = build3 (COMPONENT_REF, TREE_TYPE (sf), src, sf, NULL);
+           src = omp_build_component_ref (src, sf);
            if (use_pointer_for_field (decl, NULL))
              src = build_simple_mem_ref_loc (loc, src);
          }
        else
          src = decl;
        dst = build_simple_mem_ref_loc (loc, arg);
-       dst = build3 (COMPONENT_REF, TREE_TYPE (f), dst, f, NULL);
+       dst = omp_build_component_ref (dst, f);
        t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
        append_to_statement_list (t, &list);
        break;
@@ -6640,10 +6652,10 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
          sf = (tree) n->value;
          sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
          src = build_simple_mem_ref_loc (loc, sarg);
-         src = build3 (COMPONENT_REF, TREE_TYPE (sf), src, sf, NULL);
+         src = omp_build_component_ref (src, sf);
          src = build_simple_mem_ref_loc (loc, src);
          dst = build_simple_mem_ref_loc (loc, arg);
-         dst = build3 (COMPONENT_REF, TREE_TYPE (f), dst, f, NULL);
+         dst = omp_build_component_ref (dst, f);
          t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src);
          append_to_statement_list (t, &list);
          n = splay_tree_lookup (ctx->field_map,
@@ -6651,7 +6663,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
          df = (tree) n->value;
          df = *(tree *) pointer_map_contains (tcctx.cb.decl_map, df);
          ptr = build_simple_mem_ref_loc (loc, arg);
-         ptr = build3 (COMPONENT_REF, TREE_TYPE (df), ptr, df, NULL);
+         ptr = omp_build_component_ref (ptr, df);
          t = build2 (MODIFY_EXPR, TREE_TYPE (ptr), ptr,
                      build_fold_addr_expr_loc (loc, dst));
          append_to_statement_list (t, &list);