From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31716 invoked by alias); 23 Jun 2011 14:40:31 -0000 Received: (qmail 31705 invoked by uid 22791); 23 Jun 2011 14:40:30 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW,TW_TM X-Spam-Check-By: sourceware.org Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com) (74.125.82.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 23 Jun 2011 14:40:16 +0000 Received: by wwi14 with SMTP id 14so1362401wwi.2 for ; Thu, 23 Jun 2011 07:40:14 -0700 (PDT) Received: by 10.227.201.144 with SMTP id fa16mr2057690wbb.19.1308840014769; Thu, 23 Jun 2011 07:40:14 -0700 (PDT) Received: from [192.168.0.100] (cpc2-hawk4-0-0-cust828.aztw.cable.virginmedia.com [82.32.123.61]) by mx.google.com with ESMTPS id en1sm1282916wbb.35.2011.06.23.07.40.13 (version=SSLv3 cipher=OTHER); Thu, 23 Jun 2011 07:40:13 -0700 (PDT) Message-ID: <4E03504B.9060305@codesourcery.com> Date: Thu, 23 Jun 2011 14:42:00 -0000 From: Andrew Stubbs User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Lightning/1.0b2 Thunderbird/3.1.10 MIME-Version: 1.0 To: gcc-patches@gcc.gnu.org CC: patches@linaro.org Subject: [PATCH (3/7)] Widening multiply-and-accumulate pattern matching References: <4E034EF2.3070503@codesourcery.com> In-Reply-To: <4E034EF2.3070503@codesourcery.com> Content-Type: multipart/mixed; boundary="------------070000030502060300070604" Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg01767.txt.bz2 This is a multi-part message in MIME format. --------------070000030502060300070604 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 288 There are many cases where the widening_mult pass does not recognise widening multiply-and-accumulate cases simply because there is a type conversion step between the multiply and add statements. This patch should rectify that simply by looking beyond those conversions. OK? Andrew --------------070000030502060300070604 Content-Type: text/x-patch; name="widening-multiplies-3.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="widening-multiplies-3.patch" Content-length: 1978 2011-06-23 Andrew Stubbs gcc/ * tree-ssa-math-opts.c (convert_plusminus_to_widen): Look for multiply statement beyond NOP_EXPR statements. gcc/testsuite/ * gcc.target/arm/umlal-1.c: New file. --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/umlal-1.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=armv7-a" } */ + +long long +foo (long long a, char *b, char *c) +{ + return a + *b * *c; +} + +/* { dg-final { scan-assembler "umlal" } } */ --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -2114,26 +2114,39 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt, else wmult_code = WIDEN_MULT_PLUS_EXPR; - rhs1 = gimple_assign_rhs1 (stmt); - rhs2 = gimple_assign_rhs2 (stmt); - - if (TREE_CODE (rhs1) == SSA_NAME) + rhs1_stmt = stmt; + do { - rhs1_stmt = SSA_NAME_DEF_STMT (rhs1); - if (is_gimple_assign (rhs1_stmt)) - rhs1_code = gimple_assign_rhs_code (rhs1_stmt); + rhs1_code = ERROR_MARK; + rhs1 = gimple_assign_rhs1 (rhs1_stmt); + + if (TREE_CODE (rhs1) == SSA_NAME) + { + rhs1_stmt = SSA_NAME_DEF_STMT (rhs1); + if (is_gimple_assign (rhs1_stmt)) + rhs1_code = gimple_assign_rhs_code (rhs1_stmt); + } + else + return false; } - else - return false; + while (rhs1_code == NOP_EXPR); - if (TREE_CODE (rhs2) == SSA_NAME) + rhs2_stmt = stmt; + do { - rhs2_stmt = SSA_NAME_DEF_STMT (rhs2); - if (is_gimple_assign (rhs2_stmt)) - rhs2_code = gimple_assign_rhs_code (rhs2_stmt); + rhs2_code = ERROR_MARK; + rhs2 = gimple_assign_rhs2 (rhs2_stmt); + + if (rhs2 && TREE_CODE (rhs2) == SSA_NAME) + { + rhs2_stmt = SSA_NAME_DEF_STMT (rhs2); + if (is_gimple_assign (rhs2_stmt)) + rhs2_code = gimple_assign_rhs_code (rhs2_stmt); + } + else + return false; } - else - return false; + while (rhs2_code == NOP_EXPR); if (code == PLUS_EXPR && rhs1_code == MULT_EXPR) { --------------070000030502060300070604--