From: Andrew Stubbs <ams@codesourcery.com>
Cc: gcc-patches@gcc.gnu.org, patches@linaro.org
Subject: Re: [PATCH (5/7)] Widening multiplies for mis-matched mode inputs
Date: Mon, 04 Jul 2011 14:29:00 -0000 [thread overview]
Message-ID: <4E11CE4F.1020102@codesourcery.com> (raw)
In-Reply-To: <4E09EE62.9070900@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 671 bytes --]
On 28/06/11 16:08, Andrew Stubbs wrote:
> On 23/06/11 15:41, Andrew Stubbs wrote:
>> This patch removes the restriction that the inputs to a widening
>> multiply must be of the same mode.
>>
>> It does this by extending the smaller of the two inputs to match the
>> larger; therefore, it remains the case that subsequent code (in the
>> expand pass, for example) can rely on the type of rhs1 being the input
>> type of the operation, and the gimple verification code is still valid.
>>
>> OK?
>
> This update fixes the testcase issue Janis highlighted.
And this one updates the context changed by my update to patch 3.
The content of the patch has not changed.
Andrew
[-- Attachment #2: widening-multiplies-5.patch --]
[-- Type: text/x-patch, Size: 4121 bytes --]
2011-06-28 Andrew Stubbs <ams@codesourcery.com>
gcc/
* tree-ssa-math-opts.c (is_widening_mult_p): Remove FIXME.
Ensure the the larger type is the first operand.
(convert_mult_to_widen): Insert cast if type2 is smaller than type1.
(convert_plusminus_to_widen): Likewise.
gcc/testsuite/
* gcc.target/arm/wmul-7.c: New file.
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/wmul-7.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=armv7-a" } */
+
+unsigned long long
+foo (unsigned long long a, unsigned char *b, unsigned short *c)
+{
+ return a + *b * *c;
+}
+
+/* { dg-final { scan-assembler "umlal" } } */
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -2051,9 +2051,17 @@ is_widening_mult_p (gimple stmt,
*type2_out = *type1_out;
}
- /* FIXME: remove this restriction. */
- if (TYPE_PRECISION (*type1_out) != TYPE_PRECISION (*type2_out))
- return false;
+ /* Ensure that the larger of the two operands comes first. */
+ if (TYPE_PRECISION (*type1_out) < TYPE_PRECISION (*type2_out))
+ {
+ tree tmp;
+ tmp = *type1_out;
+ *type1_out = *type2_out;
+ *type2_out = tmp;
+ tmp = *rhs1_out;
+ *rhs1_out = *rhs2_out;
+ *rhs2_out = tmp;
+ }
return true;
}
@@ -2069,6 +2077,7 @@ convert_mult_to_widen (gimple stmt, gimple_stmt_iterator *gsi)
enum insn_code handler;
enum machine_mode to_mode, from_mode;
optab op;
+ int cast1 = false, cast2 = false;
lhs = gimple_assign_lhs (stmt);
type = TREE_TYPE (lhs);
@@ -2107,16 +2116,26 @@ convert_mult_to_widen (gimple stmt, gimple_stmt_iterator *gsi)
return false;
type1 = type2 = lang_hooks.types.type_for_mode (from_mode, 0);
-
- rhs1 = build_and_insert_cast (gsi, gimple_location (stmt),
- create_tmp_var (type1, NULL), rhs1, type1);
- rhs2 = build_and_insert_cast (gsi, gimple_location (stmt),
- create_tmp_var (type2, NULL), rhs2, type2);
+ cast1 = cast2 = true;
}
else
return false;
}
+ if (TYPE_MODE (type2) != from_mode)
+ {
+ type2 = lang_hooks.types.type_for_mode (from_mode,
+ TYPE_UNSIGNED (type2));
+ cast2 = true;
+ }
+
+ if (cast1)
+ rhs1 = build_and_insert_cast (gsi, gimple_location (stmt),
+ create_tmp_var (type1, NULL), rhs1, type1);
+ if (cast2)
+ rhs2 = build_and_insert_cast (gsi, gimple_location (stmt),
+ create_tmp_var (type2, NULL), rhs2, type2);
+
gimple_assign_set_rhs1 (stmt, fold_convert (type1, rhs1));
gimple_assign_set_rhs2 (stmt, fold_convert (type2, rhs2));
gimple_assign_set_rhs_code (stmt, WIDEN_MULT_EXPR);
@@ -2215,6 +2234,7 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
optab this_optab;
enum tree_code wmult_code;
enum insn_code handler;
+ int cast1 = false, cast2 = false;
lhs = gimple_assign_lhs (stmt);
type = TREE_TYPE (lhs);
@@ -2302,17 +2322,28 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (TYPE_MODE (type)))
{
type1 = type2 = lang_hooks.types.type_for_mode (mode, 0);
- mult_rhs1 = build_and_insert_cast (gsi, gimple_location (stmt),
- create_tmp_var (type1, NULL),
- mult_rhs1, type1);
- mult_rhs2 = build_and_insert_cast (gsi, gimple_location (stmt),
- create_tmp_var (type2, NULL),
- mult_rhs2, type2);
+ cast1 = cast2 = true;
}
else
return false;
}
+ if (TYPE_MODE (type2) != TYPE_MODE (type1))
+ {
+ type2 = lang_hooks.types.type_for_mode (TYPE_MODE (type1),
+ TYPE_UNSIGNED (type2));
+ cast2 = true;
+ }
+
+ if (cast1)
+ mult_rhs1 = build_and_insert_cast (gsi, gimple_location (stmt),
+ create_tmp_var (type1, NULL),
+ mult_rhs1, type1);
+ if (cast2)
+ mult_rhs2 = build_and_insert_cast (gsi, gimple_location (stmt),
+ create_tmp_var (type2, NULL),
+ mult_rhs2, type2);
+
/* Verify that the convertions between the mult and the add doesn't do
anything unexpected. */
if (!valid_types_for_madd_p (type1, type2, mult_rhs))
next prev parent reply other threads:[~2011-07-04 14:29 UTC|newest]
Thread overview: 107+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-23 14:38 [PATCH (0/7)] Improve use of Widening Multiplies Andrew Stubbs
2011-06-23 14:39 ` [PATCH (1/7)] New optab framework for widening multiplies Andrew Stubbs
2011-07-09 15:38 ` Andrew Stubbs
2011-07-14 15:29 ` Andrew Stubbs
2011-07-22 13:01 ` Bernd Schmidt
2011-07-22 13:50 ` Andrew Stubbs
2011-07-22 14:01 ` Bernd Schmidt
2011-07-22 15:52 ` Andrew Stubbs
2011-08-19 14:41 ` Andrew Stubbs
2011-08-19 14:55 ` Richard Guenther
2011-08-19 15:07 ` Andrew Stubbs
2011-08-19 16:40 ` Andrew Stubbs
2011-06-23 14:41 ` [PATCH (2/7)] Widening multiplies by more than one mode Andrew Stubbs
2011-07-12 10:15 ` Andrew Stubbs
2011-07-12 11:05 ` Richard Guenther
2011-07-12 11:14 ` Richard Guenther
2011-07-12 11:38 ` Andrew Stubbs
2011-07-12 11:51 ` Richard Guenther
2011-07-21 19:51 ` Joseph S. Myers
2011-07-22 8:58 ` Andrew Stubbs
2011-07-14 14:17 ` Andrew Stubbs
2011-07-14 14:24 ` Richard Guenther
2011-08-19 14:45 ` Andrew Stubbs
2011-06-23 14:42 ` [PATCH (3/7)] Widening multiply-and-accumulate pattern matching Andrew Stubbs
2011-06-23 16:28 ` Richard Guenther
2011-06-24 8:14 ` Andrew Stubbs
2011-06-24 9:31 ` Richard Guenther
2011-06-24 14:08 ` Stubbs, Andrew
2011-06-24 16:13 ` Richard Guenther
2011-06-24 18:22 ` Stubbs, Andrew
2011-06-25 9:58 ` Richard Guenther
2011-06-28 11:32 ` Andrew Stubbs
2011-06-28 12:48 ` Richard Guenther
2011-06-28 16:37 ` Michael Matz
2011-06-28 16:48 ` Andrew Stubbs
2011-06-28 17:09 ` Michael Matz
2011-07-01 11:58 ` Stubbs, Andrew
2011-07-01 12:25 ` Richard Guenther
2011-07-04 14:23 ` Andrew Stubbs
2011-07-07 10:00 ` Richard Guenther
2011-07-07 10:27 ` Andrew Stubbs
2011-07-07 12:18 ` Andrew Stubbs
2011-07-07 12:34 ` Richard Guenther
2011-07-07 12:49 ` Richard Guenther
2011-07-08 12:55 ` Andrew Stubbs
2011-07-08 13:22 ` Richard Guenther
2011-07-11 17:01 ` Andrew Stubbs
2011-07-12 11:05 ` Richard Guenther
2011-08-19 14:50 ` Andrew Stubbs
2011-07-14 14:26 ` Andrew Stubbs
2011-07-19 0:36 ` Janis Johnson
2011-07-19 9:01 ` Andrew Stubbs
2011-07-01 12:33 ` Paolo Bonzini
2011-07-01 13:31 ` Stubbs, Andrew
2011-07-01 14:41 ` Paolo Bonzini
2011-07-01 14:55 ` Stubbs, Andrew
2011-07-01 15:54 ` Paolo Bonzini
2011-07-01 18:18 ` Stubbs, Andrew
2011-07-01 15:10 ` Stubbs, Andrew
2011-07-01 16:40 ` Bernd Schmidt
2011-06-23 21:55 ` Janis Johnson
2011-06-23 14:43 ` [PATCH (4/7)] Unsigned multiplies using wider signed multiplies Andrew Stubbs
2011-06-28 13:28 ` Andrew Stubbs
2011-06-28 14:49 ` Andrew Stubbs
2011-07-04 14:27 ` Andrew Stubbs
2011-07-07 10:10 ` Richard Guenther
2011-07-07 10:42 ` Andrew Stubbs
2011-07-07 11:08 ` Richard Guenther
2011-07-12 14:10 ` Andrew Stubbs
2011-07-14 14:28 ` Andrew Stubbs
2011-07-14 14:31 ` Richard Guenther
2011-08-19 14:51 ` Andrew Stubbs
2011-06-28 13:30 ` Paolo Bonzini
2011-06-23 14:44 ` [PATCH (5/7)] Widening multiplies for mis-matched mode inputs Andrew Stubbs
2011-06-28 15:44 ` Andrew Stubbs
2011-07-04 14:29 ` Andrew Stubbs [this message]
2011-07-07 10:11 ` Richard Guenther
2011-07-14 14:34 ` Andrew Stubbs
2011-07-14 14:35 ` Richard Guenther
2011-08-19 14:54 ` Andrew Stubbs
2011-06-23 14:51 ` [PATCH (6/7)] More widening multiply-and-accumulate pattern matching Andrew Stubbs
2011-06-28 15:49 ` Andrew Stubbs
2011-07-04 14:32 ` Andrew Stubbs
2011-07-07 10:20 ` Richard Guenther
2011-07-14 14:35 ` Andrew Stubbs
2011-07-14 14:41 ` Richard Guenther
2011-08-19 15:03 ` Andrew Stubbs
2011-10-13 16:25 ` Matthew Gretton-Dann
2011-06-23 14:54 ` [PATCH (7/7)] Mixed-sign multiplies using narrowest mode Andrew Stubbs
2011-06-28 17:02 ` Andrew Stubbs
2011-07-14 14:44 ` Andrew Stubbs
2011-07-14 14:48 ` Richard Guenther
2011-08-19 15:56 ` Andrew Stubbs
2011-06-25 16:14 ` [PATCH (0/7)] Improve use of Widening Multiplies Bernd Schmidt
2011-06-27 9:16 ` Andrew Stubbs
2011-07-18 14:34 ` [PATCH (8/7)] Fix a bug in multiply-and-accumulate Andrew Stubbs
2011-07-18 16:09 ` Richard Guenther
2011-07-21 13:48 ` Andrew Stubbs
2011-08-19 16:22 ` Andrew Stubbs
2011-07-21 13:14 ` [PATCH (9/7)] Widening multiplies with constant inputs Andrew Stubbs
2011-07-21 14:34 ` Richard Guenther
2011-07-22 12:28 ` Andrew Stubbs
2011-07-22 12:32 ` Andrew Stubbs
2011-07-22 12:34 ` Richard Guenther
2011-07-22 16:06 ` Andrew Stubbs
2011-08-19 16:24 ` Andrew Stubbs
2011-08-19 16:52 ` H.J. Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E11CE4F.1020102@codesourcery.com \
--to=ams@codesourcery.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=patches@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).