diff options
author | ams <ams@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-08-19 15:05:22 +0000 |
---|---|---|
committer | ams <ams@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-08-19 15:05:22 +0000 |
commit | ffebd9c539372d8c2780ca84b63b8600c6f3f12f (patch) | |
tree | 488815969f4c2cccebc3b8d2cb76b788a482e153 | |
parent | 124215450f37f30fc5e2ebd9c16c28c0d6542768 (diff) | |
download | gcc-ffebd9c539372d8c2780ca84b63b8600c6f3f12f.tar.gz |
2011-08-19 Andrew Stubbs <ams@codesourcery.com>
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177910 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/wmul-11.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/wmul-12.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/wmul-13.c | 11 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 27 |
6 files changed, 71 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed79f12c910..f1b85a428f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2011-08-19 Andrew Stubbs <ams@codesourcery.com> + * 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. + +2011-08-19 Andrew Stubbs <ams@codesourcery.com> + * tree-ssa-math-opts.c (convert_plusminus_to_widen): Convert add_rhs to the correct type. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a711cc355a4..ced6263db50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2011-08-19 Andrew Stubbs <ams@codesourcery.com> + * gcc.target/arm/wmul-11.c: New file. + * gcc.target/arm/wmul-12.c: New file. + * gcc.target/arm/wmul-13.c: New file. + +2011-08-19 Andrew Stubbs <ams@codesourcery.com> + * gcc.target/arm/wmul-10.c: New file. 2011-08-19 Andrew Stubbs <ams@codesourcery.com> diff --git a/gcc/testsuite/gcc.target/arm/wmul-11.c b/gcc/testsuite/gcc.target/arm/wmul-11.c new file mode 100644 index 00000000000..904f0153a8e --- /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" } } */ diff --git a/gcc/testsuite/gcc.target/arm/wmul-12.c b/gcc/testsuite/gcc.target/arm/wmul-12.c new file mode 100644 index 00000000000..556e53f8e44 --- /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" } } */ diff --git a/gcc/testsuite/gcc.target/arm/wmul-13.c b/gcc/testsuite/gcc.target/arm/wmul-13.c new file mode 100644 index 00000000000..a73d80f63c3 --- /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" } } */ diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 73206adceba..63506477a39 100644 --- 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)); |