From patchwork Wed Aug 24 12:54:39 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 111335 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 57A30B6F6F for ; Wed, 24 Aug 2011 22:55:13 +1000 (EST) Received: (qmail 31946 invoked by alias); 24 Aug 2011 12:55:11 -0000 Received: (qmail 31935 invoked by uid 22791); 24 Aug 2011 12:55:10 -0000 X-SWARE-Spam-Status: No, hits=-3.6 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 24 Aug 2011 12:54:41 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id E3F0C8AD27 for ; Wed, 24 Aug 2011 14:54:39 +0200 (CEST) Date: Wed, 24 Aug 2011 14:54:39 +0200 (CEST) From: Richard Guenther To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-data-ref.c TLC Message-ID: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 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 This applies some TLC to the code I just changed and removes one more bogus transform which seems to be possible without regressions now. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2011-08-24 Richard Guenther * tree-data-ref.c (dr_analyze_indices): Avoid unsharing the ref in the basic-block case. Move stripping array-refs to the place we create an access-function for it. Remove bogus stripping down a MEM_REF to its base. Index: gcc/tree-data-ref.c =================================================================== --- gcc/tree-data-ref.c (revision 178031) +++ gcc/tree-data-ref.c (working copy) @@ -838,44 +838,52 @@ static void dr_analyze_indices (struct data_reference *dr, loop_p nest, loop_p loop) { VEC (tree, heap) *access_fns = NULL; - tree ref = unshare_expr (DR_REF (dr)), aref = ref, op; - tree base, off, access_fn = NULL_TREE; - basic_block before_loop = NULL; + tree ref, aref, op; + tree base, off, access_fn; + basic_block before_loop; + /* If analyzing a basic-block there are no indices to analyze + and thus no access functions. */ if (!nest) { - DR_BASE_OBJECT (dr) = ref; + DR_BASE_OBJECT (dr) = DR_REF (dr); DR_ACCESS_FNS (dr) = NULL; return; } + ref = unshare_expr (DR_REF (dr)); before_loop = block_before_loop (nest); + /* REALPART_EXPR and IMAGPART_EXPR can be handled like accesses + into a two element array with a constant index. The base is + then just the immediate underlying object. */ + if (TREE_CODE (ref) == REALPART_EXPR) + { + ref = TREE_OPERAND (ref, 0); + VEC_safe_push (tree, heap, access_fns, integer_zero_node); + } + else if (TREE_CODE (ref) == IMAGPART_EXPR) + { + ref = TREE_OPERAND (ref, 0); + VEC_safe_push (tree, heap, access_fns, integer_one_node); + } + /* Analyze access functions of dimensions we know to be independent. */ + aref = ref; while (handled_component_p (aref)) { - /* For ARRAY_REFs the base is the reference with the index replaced - by zero. */ if (TREE_CODE (aref) == ARRAY_REF) { op = TREE_OPERAND (aref, 1); access_fn = analyze_scalar_evolution (loop, op); access_fn = instantiate_scev (before_loop, loop, access_fn); VEC_safe_push (tree, heap, access_fns, access_fn); - TREE_OPERAND (aref, 1) = build_int_cst (TREE_TYPE (op), 0); - } - /* REALPART_EXPR and IMAGPART_EXPR can be handled like accesses - into a two element array with a constant index. The base is - then just the immediate underlying object. */ - else if (TREE_CODE (aref) == REALPART_EXPR) - { - ref = TREE_OPERAND (ref, 0); - VEC_safe_push (tree, heap, access_fns, integer_zero_node); - } - else if (TREE_CODE (aref) == IMAGPART_EXPR) - { - ref = TREE_OPERAND (ref, 0); - VEC_safe_push (tree, heap, access_fns, integer_one_node); + /* For ARRAY_REFs the base is the reference with the index replaced + by zero if we can not strip it as the outermost component. */ + if (aref == ref) + ref = TREE_OPERAND (ref, 0); + else + TREE_OPERAND (aref, 1) = build_int_cst (TREE_TYPE (op), 0); } aref = TREE_OPERAND (aref, 0); @@ -909,18 +917,6 @@ dr_analyze_indices (struct data_referenc } } - if (TREE_CODE (ref) == MEM_REF - && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR - && integer_zerop (TREE_OPERAND (ref, 1))) - ref = TREE_OPERAND (TREE_OPERAND (ref, 0), 0); - - /* For canonicalization purposes we'd like to strip all outermost - zero-offset component-refs. - ??? For now simply handle zero-index array-refs. */ - while (TREE_CODE (ref) == ARRAY_REF - && integer_zerop (TREE_OPERAND (ref, 1))) - ref = TREE_OPERAND (ref, 0); - DR_BASE_OBJECT (dr) = ref; DR_ACCESS_FNS (dr) = access_fns; }