From patchwork Fri Aug 19 15:07:20 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Stubbs X-Patchwork-Id: 3570 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id E1C7D23F25 for ; Fri, 19 Aug 2011 15:07:28 +0000 (UTC) Received: from mail-gw0-f52.google.com (mail-gw0-f52.google.com [74.125.83.52]) by fiordland.canonical.com (Postfix) with ESMTP id 89B04A180FE for ; Fri, 19 Aug 2011 15:07:28 +0000 (UTC) Received: by gwj15 with SMTP id 15so2469086gwj.11 for ; Fri, 19 Aug 2011 08:07:28 -0700 (PDT) Received: by 10.150.68.26 with SMTP id q26mr2349251yba.276.1313766447985; Fri, 19 Aug 2011 08:07:27 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.150.157.17 with SMTP id f17cs102772ybe; Fri, 19 Aug 2011 08:07:27 -0700 (PDT) Received: by 10.236.200.164 with SMTP id z24mr8230329yhn.84.1313766445054; Fri, 19 Aug 2011 08:07:25 -0700 (PDT) Received: from mail.codesourcery.com (mail.codesourcery.com [38.113.113.100]) by mx.google.com with ESMTPS id o68si10511669yhk.90.2011.08.19.08.07.24 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 19 Aug 2011 08:07:25 -0700 (PDT) Received-SPF: pass (google.com: domain of ams@codesourcery.com designates 38.113.113.100 as permitted sender) client-ip=38.113.113.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ams@codesourcery.com designates 38.113.113.100 as permitted sender) smtp.mail=ams@codesourcery.com Received: (qmail 1137 invoked from network); 19 Aug 2011 15:07:23 -0000 Received: from unknown (HELO ?192.168.0.104?) (ams@127.0.0.2) by mail.codesourcery.com with ESMTPA; 19 Aug 2011 15:07:23 -0000 Message-ID: <4E4E7C28.50207@codesourcery.com> Date: Fri, 19 Aug 2011 16:07:20 +0100 From: Andrew Stubbs User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110812 Thunderbird/6.0 MIME-Version: 1.0 CC: Richard Guenther , gcc-patches@gcc.gnu.org, patches@linaro.org Subject: Re: [PATCH (9/7)] Widening multiplies with constant inputs References: <4E034EF2.3070503@codesourcery.com> <4E282148.9080100@codesourcery.com> <4E2965A5.1080301@codesourcery.com> <4E2967FC.3090101@codesourcery.com> <4E299971.4010905@codesourcery.com> In-Reply-To: <4E299971.4010905@codesourcery.com> On 22/07/11 16:38, Andrew Stubbs wrote: > Fixed in the attached. I'll commit this version when the rest of my > testing is complete. Now committed. Here's the patch with updated context. Andrew 2011-08-19 Andrew Stubbs gcc/ * tree-ssa-math-opts.c (is_widening_mult_rhs_p): Handle constants beyond conversions. (convert_mult_to_widen): Convert constant inputs to the right type. (convert_plusminus_to_widen): Don't automatically reject inputs that are not an SSA_NAME. Convert constant inputs to the right type. gcc/testsuite/ * gcc.target/arm/wmul-11.c: New file. * gcc.target/arm/wmul-12.c: New file. * gcc.target/arm/wmul-13.c: New file. --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/wmul-11.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target arm_dsp } */ + +long long +foo (int *b) +{ + return 10 * (long long)*b; +} + +/* { dg-final { scan-assembler "smull" } } */ --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/wmul-12.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target arm_dsp } */ + +long long +foo (int *b, int *c) +{ + int tmp = *b * *c; + return 10 + (long long)tmp; +} + +/* { dg-final { scan-assembler "smlal" } } */ --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/wmul-13.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target arm_dsp } */ + +long long +foo (int *a, int *b) +{ + return *a + (long long)*b * 10; +} + +/* { dg-final { scan-assembler "smlal" } } */ --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -1995,7 +1995,16 @@ is_widening_mult_rhs_p (tree type, tree rhs, tree *type_out, : rhs_code != FIXED_CONVERT_EXPR) rhs1 = rhs; else - rhs1 = gimple_assign_rhs1 (stmt); + { + rhs1 = gimple_assign_rhs1 (stmt); + + if (TREE_CODE (rhs1) == INTEGER_CST) + { + *new_rhs_out = rhs1; + *type_out = NULL; + return true; + } + } } else rhs1 = rhs; @@ -2164,6 +2173,12 @@ convert_mult_to_widen (gimple stmt, gimple_stmt_iterator *gsi) rhs2 = build_and_insert_cast (gsi, loc, tmp, rhs2); } + /* Handle constants. */ + if (TREE_CODE (rhs1) == INTEGER_CST) + rhs1 = fold_convert (type1, rhs1); + if (TREE_CODE (rhs2) == INTEGER_CST) + rhs2 = fold_convert (type2, rhs2); + gimple_assign_set_rhs1 (stmt, rhs1); gimple_assign_set_rhs2 (stmt, rhs2); gimple_assign_set_rhs_code (stmt, WIDEN_MULT_EXPR); @@ -2215,8 +2230,6 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt, if (is_gimple_assign (rhs1_stmt)) rhs1_code = gimple_assign_rhs_code (rhs1_stmt); } - else - return false; if (TREE_CODE (rhs2) == SSA_NAME) { @@ -2224,8 +2237,6 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt, if (is_gimple_assign (rhs2_stmt)) rhs2_code = gimple_assign_rhs_code (rhs2_stmt); } - else - return false; /* Allow for one conversion statement between the multiply and addition/subtraction statement. If there are more than @@ -2373,6 +2384,12 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt, add_rhs = build_and_insert_cast (gsi, loc, create_tmp_var (type, NULL), add_rhs); + /* Handle constants. */ + if (TREE_CODE (mult_rhs1) == INTEGER_CST) + rhs1 = fold_convert (type1, mult_rhs1); + if (TREE_CODE (mult_rhs2) == INTEGER_CST) + rhs2 = fold_convert (type2, mult_rhs2); + gimple_assign_set_rhs_with_ops_1 (gsi, wmult_code, mult_rhs1, mult_rhs2, add_rhs); update_stmt (gsi_stmt (*gsi));