tree-ssa-math-opts.c (convert_plusminus_to_widen): Convert add_rhs to the correct...
authorAndrew Stubbs <ams@codesourcery.com>
Fri, 19 Aug 2011 15:01:41 +0000 (15:01 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Fri, 19 Aug 2011 15:01:41 +0000 (15:01 +0000)
2011-08-19  Andrew Stubbs  <ams@codesourcery.com>

gcc/
* tree-ssa-math-opts.c (convert_plusminus_to_widen): Convert add_rhs
to the correct type.

gcc/testsuite/
* gcc.target/arm/wmul-10.c: New file.

From-SVN: r177909

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/wmul-10.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.c

index 648c3b1803257fadbeb4aa7988dd31abe53e159c..ed79f12c910fe25421c5dcbd28f152edd25c564c 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-19  Andrew Stubbs  <ams@codesourcery.com>
+
+       * tree-ssa-math-opts.c (convert_plusminus_to_widen): Convert add_rhs
+       to the correct type.
+
 2011-08-19  Andrew Stubbs  <ams@codesourcery.com>
 
        * tree-ssa-math-opts.c (convert_mult_to_widen): Better handle
index 2f65d2ec57bf583c569becf277b7f13cba49b734..a711cc355a41cb7a771ccd632c3d49c04580ca48 100644 (file)
@@ -1,3 +1,7 @@
+2011-08-19  Andrew Stubbs  <ams@codesourcery.com>
+
+       * gcc.target/arm/wmul-10.c: New file.
+
 2011-08-19  Andrew Stubbs  <ams@codesourcery.com>
 
        * gcc.target/arm/wmul-9.c: New file.
diff --git a/gcc/testsuite/gcc.target/arm/wmul-10.c b/gcc/testsuite/gcc.target/arm/wmul-10.c
new file mode 100644 (file)
index 0000000..5ffd169
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-require-effective-target arm_dsp } */
+
+
+unsigned long long
+foo (unsigned short a, unsigned short *b, unsigned short *c)
+{
+  return (unsigned)a + (unsigned long long)*b * (unsigned long long)*c;
+}
+
+/* { dg-final { scan-assembler "umlal" } } */
index 5ba31b560b55af503ec4fb142ffbe024e9c86f94..73206adceba31e63bd7b7ea2101b8494ee1db64f 100644 (file)
@@ -2369,6 +2369,10 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
       mult_rhs2 = build_and_insert_cast (gsi, loc, tmp, mult_rhs2);
     }
 
+  if (!useless_type_conversion_p (type, TREE_TYPE (add_rhs)))
+    add_rhs = build_and_insert_cast (gsi, loc, create_tmp_var (type, NULL),
+                                    add_rhs);
+
   gimple_assign_set_rhs_with_ops_1 (gsi, wmult_code, mult_rhs1, mult_rhs2,
                                    add_rhs);
   update_stmt (gsi_stmt (*gsi));