From patchwork Fri Sep 3 20:04:59 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Pop X-Patchwork-Id: 63721 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 3F356B714B for ; Sat, 4 Sep 2010 06:06:57 +1000 (EST) Received: (qmail 12563 invoked by alias); 3 Sep 2010 20:06:55 -0000 Received: (qmail 12539 invoked by uid 22791); 3 Sep 2010 20:06:49 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, TW_TM, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-px0-f175.google.com (HELO mail-px0-f175.google.com) (209.85.212.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 03 Sep 2010 20:06:06 +0000 Received: by pxi11 with SMTP id 11so293662pxi.20 for ; Fri, 03 Sep 2010 13:06:04 -0700 (PDT) Received: by 10.114.89.11 with SMTP id m11mr267822wab.23.1283544364352; Fri, 03 Sep 2010 13:06:04 -0700 (PDT) Received: from napoca ([163.181.251.115]) by mx.google.com with ESMTPS id d38sm4400666wam.8.2010.09.03.13.06.01 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 03 Sep 2010 13:06:03 -0700 (PDT) Received: by napoca (sSMTP sendmail emulation); Fri, 03 Sep 2010 15:06:01 -0500 From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: Sebastian Pop Subject: [PATCH] Use DR_IS_WRITE instead of !DR_IS_READ. Date: Fri, 3 Sep 2010 15:04:59 -0500 Message-Id: <1283544299-18814-1-git-send-email-sebpop@gmail.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org I committed this patch to trunk after bootstrap and regression test on amd64-linux. Sebastian 2010-09-03 Sebastian Pop * tree-data-ref.c (dr_may_alias_p): Replace !DR_IS_READ with DR_IS_WRITE. (compute_all_dependences): Same. (create_rdg_edge_for_ddr): Same. * tree-data-ref.h (DR_IS_WRITE): New. (ddr_is_anti_dependent): Replace !DR_IS_READ with DR_IS_WRITE. * tree-if-conv.c (write_memrefs_written_at_least_once): Same. (write_memrefs_written_at_least_once): Same. * tree-predcom.c (suitable_component_p): Same. (determine_roots_comp): Same. (execute_load_motion): Same. * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Same. (vect_enhance_data_refs_alignment): Same. (vect_analyze_group_access): Same. --- gcc/ChangeLog | 17 +++++++++++++++++ gcc/tree-data-ref.c | 14 +++++++------- gcc/tree-data-ref.h | 3 ++- gcc/tree-if-conv.c | 4 ++-- gcc/tree-predcom.c | 8 ++++---- gcc/tree-vect-data-refs.c | 14 +++++++------- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af1c53e..19b86e1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2010-09-03 Sebastian Pop + + * tree-data-ref.c (dr_may_alias_p): Replace !DR_IS_READ with + DR_IS_WRITE. + (compute_all_dependences): Same. + (create_rdg_edge_for_ddr): Same. + * tree-data-ref.h (DR_IS_WRITE): New. + (ddr_is_anti_dependent): Replace !DR_IS_READ with DR_IS_WRITE. + * tree-if-conv.c (write_memrefs_written_at_least_once): Same. + (write_memrefs_written_at_least_once): Same. + * tree-predcom.c (suitable_component_p): Same. + (determine_roots_comp): Same. + (execute_load_motion): Same. + * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Same. + (vect_enhance_data_refs_alignment): Same. + (vect_analyze_group_access): Same. + 2010-09-03 Joern Rennecke PR testsuite/42843 diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index ee181a6..e1d2dfc 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1335,12 +1335,12 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b) return false; /* Query the alias oracle. */ - if (!DR_IS_READ (a) && !DR_IS_READ (b)) + if (DR_IS_WRITE (a) && DR_IS_WRITE (b)) { if (!refs_output_dependent_p (DR_REF (a), DR_REF (b))) return false; } - else if (DR_IS_READ (a) && !DR_IS_READ (b)) + else if (DR_IS_READ (a) && DR_IS_WRITE (b)) { if (!refs_anti_dependent_p (DR_REF (a), DR_REF (b))) return false; @@ -1372,7 +1372,7 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b) decl_b = SSA_NAME_VAR (addr_b); if (TYPE_RESTRICT (type_a) && TYPE_RESTRICT (type_b) - && (!DR_IS_READ (a) || !DR_IS_READ (b)) + && (DR_IS_WRITE (a) || DR_IS_WRITE (b)) && decl_a && DECL_P (decl_a) && decl_b && DECL_P (decl_b) && decl_a != decl_b @@ -4107,7 +4107,7 @@ compute_all_dependences (VEC (data_reference_p, heap) *datarefs, FOR_EACH_VEC_ELT (data_reference_p, datarefs, i, a) for (j = i + 1; VEC_iterate (data_reference_p, datarefs, j, b); j++) - if (!DR_IS_READ (a) || !DR_IS_READ (b) || compute_self_and_rr) + if (DR_IS_WRITE (a) || DR_IS_WRITE (b) || compute_self_and_rr) { ddr = initialize_data_dependence_relation (a, b, loop_nest); VEC_safe_push (ddr_p, heap, *dependence_relations, ddr); @@ -4772,11 +4772,11 @@ create_rdg_edge_for_ddr (struct graph *rdg, ddr_p ddr) /* Determines the type of the data dependence. */ if (DR_IS_READ (dra) && DR_IS_READ (drb)) RDGE_TYPE (e) = input_dd; - else if (!DR_IS_READ (dra) && !DR_IS_READ (drb)) + else if (DR_IS_WRITE (dra) && DR_IS_WRITE (drb)) RDGE_TYPE (e) = output_dd; - else if (!DR_IS_READ (dra) && DR_IS_READ (drb)) + else if (DR_IS_WRITE (dra) && DR_IS_READ (drb)) RDGE_TYPE (e) = flow_dd; - else if (DR_IS_READ (dra) && !DR_IS_READ (drb)) + else if (DR_IS_READ (dra) && DR_IS_WRITE (drb)) RDGE_TYPE (e) = anti_dd; } diff --git a/gcc/tree-data-ref.h b/gcc/tree-data-ref.h index 757c3c1..844a2ae 100644 --- a/gcc/tree-data-ref.h +++ b/gcc/tree-data-ref.h @@ -193,6 +193,7 @@ struct data_reference #define DR_ACCESS_FN(DR, I) VEC_index (tree, DR_ACCESS_FNS (DR), I) #define DR_NUM_DIMENSIONS(DR) VEC_length (tree, DR_ACCESS_FNS (DR)) #define DR_IS_READ(DR) (DR)->is_read +#define DR_IS_WRITE(DR) (!DR_IS_READ (DR)) #define DR_BASE_ADDRESS(DR) (DR)->innermost.base_address #define DR_OFFSET(DR) (DR)->innermost.offset #define DR_INIT(DR) (DR)->innermost.init @@ -473,7 +474,7 @@ ddr_is_anti_dependent (ddr_p ddr) { return (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DR_IS_READ (DDR_A (ddr)) - && !DR_IS_READ (DDR_B (ddr)) + && DR_IS_WRITE (DDR_B (ddr)) && !same_access_functions (ddr)); } diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 86b8f26..e92090f 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -533,7 +533,7 @@ write_memrefs_written_at_least_once (gimple stmt, for (i = 0; VEC_iterate (data_reference_p, drs, i, a); i++) if (DR_STMT (a) == stmt - && !DR_IS_READ (a)) + && DR_IS_WRITE (a)) { bool found = false; int x = DR_WRITTEN_AT_LEAST_ONCE (a); @@ -546,7 +546,7 @@ write_memrefs_written_at_least_once (gimple stmt, for (j = 0; VEC_iterate (data_reference_p, drs, j, b); j++) if (DR_STMT (b) != stmt - && !DR_IS_READ (b) + && DR_IS_WRITE (b) && same_data_refs_base_objects (a, b)) { tree cb = bb_predicate (gimple_bb (DR_STMT (b))); diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c index 712cc68..be2cfc4 100644 --- a/gcc/tree-predcom.c +++ b/gcc/tree-predcom.c @@ -829,7 +829,7 @@ suitable_component_p (struct loop *loop, struct component *comp) gcc_assert (dominated_by_p (CDI_DOMINATORS, ba, bp)); bp = ba; - if (!DR_IS_READ (a->ref)) + if (DR_IS_WRITE (a->ref)) has_write = true; } @@ -1197,7 +1197,7 @@ determine_roots_comp (struct loop *loop, FOR_EACH_VEC_ELT (dref, comp->refs, i, a) { - if (!chain || !DR_IS_READ (a->ref) + if (!chain || DR_IS_WRITE (a->ref) || double_int_ucmp (uhwi_to_double_int (MAX_DISTANCE), double_int_sub (a->offset, last_ofs)) <= 0) { @@ -1611,7 +1611,7 @@ execute_load_motion (struct loop *loop, chain_p chain, bitmap tmp_vars) gcc_assert (chain->type == CT_INVARIANT); gcc_assert (!chain->combined); FOR_EACH_VEC_ELT (dref, chain->refs, i, a) - if (!DR_IS_READ (a->ref)) + if (DR_IS_WRITE (a->ref)) n_writes++; /* If there are no reads in the loop, there is nothing to do. */ @@ -1627,7 +1627,7 @@ execute_load_motion (struct loop *loop, chain_p chain, bitmap tmp_vars) bool is_read = DR_IS_READ (a->ref); mark_virtual_ops_for_renaming (a->stmt); - if (!DR_IS_READ (a->ref)) + if (DR_IS_WRITE (a->ref)) { n_writes--; if (n_writes) diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index c76c60b..7944d8b 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -614,7 +614,7 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr, } /* We do not vectorize basic blocks with write-write dependencies. */ - if (!DR_IS_READ (dra) && !DR_IS_READ (drb)) + if (DR_IS_WRITE (dra) && DR_IS_WRITE (drb)) return true; /* We deal with read-write dependencies in basic blocks later (by @@ -641,7 +641,7 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr, } /* Do not vectorize basic blcoks with write-write dependences. */ - if (!DR_IS_READ (dra) && !DR_IS_READ (drb)) + if (DR_IS_WRITE (dra) && DR_IS_WRITE (drb)) return true; /* Check if this dependence is allowed in basic block vectorization. */ @@ -1553,7 +1553,7 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) dr0 = dr; } - if (!first_store && !DR_IS_READ (dr)) + if (!first_store && DR_IS_WRITE (dr)) first_store = dr; } @@ -1565,7 +1565,7 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) if (!supportable_dr_alignment) { dr0 = dr; - if (!first_store && !DR_IS_READ (dr)) + if (!first_store && DR_IS_WRITE (dr)) first_store = dr; } } @@ -2078,7 +2078,7 @@ vect_analyze_group_access (struct data_reference *dr) DR_INIT (STMT_VINFO_DATA_REF ( vinfo_for_stmt (next))))) { - if (!DR_IS_READ (data_ref)) + if (DR_IS_WRITE (data_ref)) { if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "Two store stmts share the same dr."); @@ -2123,7 +2123,7 @@ vect_analyze_group_access (struct data_reference *dr) { /* FORNOW: SLP of accesses with gaps is not supported. */ slp_impossible = true; - if (!DR_IS_READ (data_ref)) + if (DR_IS_WRITE (data_ref)) { if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "interleaved store with gaps"); @@ -2215,7 +2215,7 @@ vect_analyze_group_access (struct data_reference *dr) /* SLP: create an SLP data structure for every interleaving group of stores for further analysis in vect_analyse_slp. */ - if (!DR_IS_READ (dr) && !slp_impossible) + if (DR_IS_WRITE (dr) && !slp_impossible) { if (loop_vinfo) VEC_safe_push (gimple, heap, LOOP_VINFO_STRIDED_STORES (loop_vinfo),