From patchwork Wed May 9 03:04:26 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bill Schmidt X-Patchwork-Id: 157848 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 4BAE3B6FB9 for ; Wed, 9 May 2012 13:04:53 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1337137494; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Received:Received:Message-ID:Subject:From:To: Cc:Date:Content-Type:Content-Transfer-Encoding:Mime-Version: Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:Sender:Delivered-To; bh=RobDbBIYVpktjmSxVzZ2 uIEkRlg=; b=hRUUCLTTyM+z44A1nrSTbP05jY6953gp3y5qneutGVqUbANRUuiu MHiIUApk7Jxtq45mW2YX1NmgAxxqhHQn5OrbiTo3rTT0SeHtvrCCoqKD3W9VVZnC UMW1deRo4k0yF6XRS8v6/V1YhzDCUU6SERUOg6AyDrfFlRx0wpu8kjQ= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Received:Received:Received:Received:Message-ID:Subject:From:To:Cc:Date:Content-Type:Content-Transfer-Encoding:Mime-Version:X-Content-Scanned:x-cbid:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=mU+xPMXWxJb7Uf2p3kWCesg8qYa/qknDla7I+zFPz7R6+Nu7UKuGERU7MwK4xg 4MU5lm6GuDybJ7Qn3uI/af5ySSdT37Yl9ouTNO9UjPkRZhkpNsDIctj45ItFUpJ9 A3jUiejnvC+gBOENzr5GFnURd923Giffe1XJpNG+OCOGY=; Received: (qmail 8885 invoked by alias); 9 May 2012 03:04:48 -0000 Received: (qmail 8868 invoked by uid 22791); 9 May 2012 03:04:47 -0000 X-SWARE-Spam-Status: No, hits=-7.0 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, TW_TM, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from e35.co.us.ibm.com (HELO e35.co.us.ibm.com) (32.97.110.153) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 May 2012 03:04:29 +0000 Received: from /spool/local by e35.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 8 May 2012 21:04:27 -0600 Received: from d03dlp03.boulder.ibm.com (9.17.202.179) by e35.co.us.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 8 May 2012 21:04:25 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id 575AD19D804F for ; Tue, 8 May 2012 21:04:13 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q4934OT0139554 for ; Tue, 8 May 2012 21:04:24 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q4934OGb008332 for ; Tue, 8 May 2012 21:04:24 -0600 Received: from [9.80.52.106] ([9.80.52.106]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q4934MGT008313; Tue, 8 May 2012 21:04:23 -0600 Message-ID: <1336532666.24856.5.camel@gnopaine> Subject: [PATCH] Fix PR53217 From: "William J. Schmidt" To: gcc-patches@gcc.gnu.org Cc: rguenther@suse.de, bergner@vnet.ibm.com Date: Tue, 08 May 2012 22:04:26 -0500 Mime-Version: 1.0 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12050903-6148-0000-0000-000005AE362F 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 fixes another statement-placement issue when reassociating expressions with repeated factors. Multiplies feeding into __builtin_powi calls were not getting placed properly ahead of them in some cases. Bootstrapped and tested on powerpc64-unknown-linux-gnu with no new regressions. I've also run SPEC cpu2006 with no build or correctness issues. OK for trunk? Thanks, Bill gcc: 2012-05-08 Bill Schmidt PR tree-optimization/53217 * tree-ssa-reassoc.c (bip_map): New static variable. (possibly_move_powi): Move feeding multiplies with __builtin_powi call. (attempt_builtin_powi): Save feeding multiplies on a stack. (reassociate_bb): Create and destroy bip_map. gcc/testsuite: 2012-05-08 Bill Schmidt PR tree-optimization/53217 * gfortran.dg/pr53217.f90: New test. Index: gcc/testsuite/gfortran.dg/pr53217.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr53217.f90 (revision 0) +++ gcc/testsuite/gfortran.dg/pr53217.f90 (revision 0) @@ -0,0 +1,28 @@ +! { dg-do compile } +! { dg-options "-O1 -ffast-math" } + +! This tests only for compile-time failure, which formerly occurred +! when statements were emitted out of order, failing verify_ssa. + +MODULE xc_cs1 + INTEGER, PARAMETER :: dp=KIND(0.0D0) + REAL(KIND=dp), PARAMETER :: a = 0.04918_dp, & + c = 0.2533_dp, & + d = 0.349_dp +CONTAINS + SUBROUTINE cs1_u_2 ( rho, grho, r13, e_rho_rho, e_rho_ndrho, e_ndrho_ndrho,& + npoints, error) + REAL(KIND=dp), DIMENSION(*), & + INTENT(INOUT) :: e_rho_rho, e_rho_ndrho, & + e_ndrho_ndrho + DO ip = 1, npoints + IF ( rho(ip) > eps_rho ) THEN + oc = 1.0_dp/(r*r*r3*r3 + c*g*g) + d2rF4 = c4p*f13*f23*g**4*r3/r * (193*d*r**5*r3*r3+90*d*d*r**5*r3 & + -88*g*g*c*r**3*r3-100*d*d*c*g*g*r*r*r3*r3 & + +104*r**6)*od**3*oc**4 + e_rho_rho(ip) = e_rho_rho(ip) + d2F1 + d2rF2 + d2F3 + d2rF4 + END IF + END DO + END SUBROUTINE cs1_u_2 +END MODULE xc_cs1 Index: gcc/tree-ssa-reassoc.c =================================================================== --- gcc/tree-ssa-reassoc.c (revision 187117) +++ gcc/tree-ssa-reassoc.c (working copy) @@ -200,6 +200,10 @@ static long *bb_rank; /* Operand->rank hashtable. */ static struct pointer_map_t *operand_rank; +/* Map from inserted __builtin_powi calls to multiply chains that + feed them. */ +static struct pointer_map_t *bip_map; + /* Forward decls. */ static long get_rank (tree); @@ -2249,7 +2253,7 @@ remove_visited_stmt_chain (tree var) static void possibly_move_powi (gimple stmt, tree op) { - gimple stmt2; + gimple stmt2, *mpy; tree fndecl; gimple_stmt_iterator gsi1, gsi2; @@ -2278,9 +2282,39 @@ possibly_move_powi (gimple stmt, tree op) return; } + /* Move the __builtin_powi. */ gsi1 = gsi_for_stmt (stmt); gsi2 = gsi_for_stmt (stmt2); gsi_move_before (&gsi2, &gsi1); + + /* See if there are multiplies feeding the __builtin_powi base + argument that must also be moved. */ + while ((mpy = (gimple *) pointer_map_contains (bip_map, stmt2)) != NULL) + { + /* If we've already moved this statement, we're done. This is + identified by a NULL entry for the statement in bip_map. */ + gimple *next = (gimple *) pointer_map_contains (bip_map, *mpy); + if (next && !*next) + return; + + stmt = stmt2; + stmt2 = *mpy; + gsi1 = gsi_for_stmt (stmt); + gsi2 = gsi_for_stmt (stmt2); + gsi_move_before (&gsi2, &gsi1); + + /* The moved multiply may be DAG'd from multiple calls if it + was the result of a cached multiply. Only move it once. + Rank order ensures we move it to the right place the first + time. */ + if (next) + *next = NULL; + else + { + next = (gimple *) pointer_map_insert (bip_map, *mpy); + *next = NULL; + } + } } /* This function checks three consequtive operands in @@ -3281,6 +3315,7 @@ attempt_builtin_powi (gimple stmt, VEC(operand_ent while (true) { HOST_WIDE_INT power; + gimple last_mul = NULL; /* First look for the largest cached product of factors from preceding iterations. If found, create a builtin_powi for @@ -3318,16 +3353,25 @@ attempt_builtin_powi (gimple stmt, VEC(operand_ent } else { + gimple *value; + iter_result = get_reassoc_pow_ssa_name (target, type); pow_stmt = gimple_build_call (powi_fndecl, 2, rf1->repr, build_int_cst (integer_type_node, power)); gimple_call_set_lhs (pow_stmt, iter_result); gimple_set_location (pow_stmt, gimple_location (stmt)); - /* Temporarily place the call; we will move it to the - correct place during rewrite_expr. */ + /* Temporarily place the call; we will move it and its + feeding multiplies to the correct place during + rewrite_expr. */ gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT); + if (!operand_equal_p (rf1->repr, rf1->factor, 0)) + { + value = (gimple *) pointer_map_insert (bip_map, pow_stmt); + *value = SSA_NAME_DEF_STMT (rf1->repr); + } + if (dump_file && (dump_flags & TDF_DETAILS)) { unsigned elt; @@ -3413,6 +3457,15 @@ attempt_builtin_powi (gimple stmt, VEC(operand_ent gsi_insert_before (&gsi, mul_stmt, GSI_SAME_STMT); rf1->repr = target_ssa; + /* Chain multiplies together for later movement. */ + if (last_mul) + { + gimple *value + = (gimple *) pointer_map_insert (bip_map, mul_stmt); + *value = last_mul; + } + last_mul = mul_stmt; + /* Don't reprocess the multiply we just introduced. */ gimple_set_visited (mul_stmt, true); } @@ -3428,6 +3481,15 @@ attempt_builtin_powi (gimple stmt, VEC(operand_ent gimple_call_set_lhs (pow_stmt, iter_result); gimple_set_location (pow_stmt, gimple_location (stmt)); gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT); + + /* If we inserted a chain of multiplies before the pow_stmt, + record that fact so we can move it later when we move the + pow_stmt. */ + if (last_mul) + { + gimple *value = (gimple *) pointer_map_insert (bip_map, pow_stmt); + *value = last_mul; + } } /* Append the result of this iteration to the ops vector. */ @@ -3544,6 +3606,7 @@ reassociate_bb (basic_block bb) if (associative_tree_code (rhs_code)) { VEC(operand_entry_t, heap) *ops = NULL; + bip_map = pointer_map_create (); /* There may be no immediate uses left by the time we get here because we may have eliminated them all. */ @@ -3608,6 +3671,7 @@ reassociate_bb (basic_block bb) } VEC_free (operand_entry_t, heap, ops); + pointer_map_destroy (bip_map); } } }