aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-07 10:37:08 +0000
committerrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-07 10:37:08 +0000
commit8f9d15315de79f9b70313aaac5fb8a592d9d06c1 (patch)
treec6a5cc1bbe9e0d190e009cb18cb51b75417511aa
parent488d5367b3038c42ee6bb52b9af2b7fb9b739ebd (diff)
PR tree-ssa/54295
* tree-ssa-math-opts.c (widening_mult_conversion_strippable_p): Sign-extension of a zero-extended value can be simplified to just zero-extension. testsuite: * gcc.target/arm/pr50318-1.c: Scan for smlal. * gcc.target/arm/smlaltb-1.c: XFAIL test. * gcc.target/arm/smlaltt-1.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191066 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/arm/pr50318-1.c2
-rw-r--r--gcc/testsuite/gcc.target/arm/smlaltb-1.c2
-rw-r--r--gcc/testsuite/gcc.target/arm/smlaltt-1.c2
-rw-r--r--gcc/tree-ssa-math-opts.c6
6 files changed, 21 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cdf6a201820..360fd5642fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-09-07 Richard Earnshaw <rearnsha@arm.com>
+
+ PR tree-ssa/54295
+ * tree-ssa-math-opts.c (widening_mult_conversion_strippable_p):
+ Sign-extension of a zero-extended value can be simplified to
+ just zero-extension.
+
2012-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/53667
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8a987e1f8cf..ff3583fc525 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-07 Richard Earnshaw <rearnsha@arm.com>
+
+ * gcc.target/arm/pr50318-1.c: Scan for smlal.
+ * gcc.target/arm/smlaltb-1.c: XFAIL test.
+ * gcc.target/arm/smlaltt-1.c: Likewise.
+
2012-09-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/pr44194-1.c: Skip on Alpha and adjust regexp for SPARC64.
diff --git a/gcc/testsuite/gcc.target/arm/pr50318-1.c b/gcc/testsuite/gcc.target/arm/pr50318-1.c
index 05885e1b5ac..be270eefaef 100644
--- a/gcc/testsuite/gcc.target/arm/pr50318-1.c
+++ b/gcc/testsuite/gcc.target/arm/pr50318-1.c
@@ -8,4 +8,4 @@ long long test (unsigned int sec, unsigned long long nsecs)
long)nsecs;
}
-/* { dg-final { scan-assembler "umlal" } } */
+/* { dg-final { scan-assembler "smlal" } } */
diff --git a/gcc/testsuite/gcc.target/arm/smlaltb-1.c b/gcc/testsuite/gcc.target/arm/smlaltb-1.c
index 1472c9b3fa1..a27009d2513 100644
--- a/gcc/testsuite/gcc.target/arm/smlaltb-1.c
+++ b/gcc/testsuite/gcc.target/arm/smlaltb-1.c
@@ -11,4 +11,4 @@ foo (long long x, int in)
return x + b * a;
}
-/* { dg-final { scan-assembler "smlaltb\\t" } } */
+/* { dg-final { scan-assembler "smlaltb\\t" { xfail *-*-* } } } */
diff --git a/gcc/testsuite/gcc.target/arm/smlaltt-1.c b/gcc/testsuite/gcc.target/arm/smlaltt-1.c
index 6bcbce0b958..380e3d01be6 100644
--- a/gcc/testsuite/gcc.target/arm/smlaltt-1.c
+++ b/gcc/testsuite/gcc.target/arm/smlaltt-1.c
@@ -11,4 +11,4 @@ foo (long long x, int in1, int in2)
return x + b * a;
}
-/* { dg-final { scan-assembler "smlaltt\\t" } } */
+/* { dg-final { scan-assembler "smlaltt\\t" { xfail *-*-* } } } */
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index c3392fb14c8..94d19afc2c0 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -1985,7 +1985,11 @@ widening_mult_conversion_strippable_p (tree result_type, gimple stmt)
the operation and doesn't narrow the range. */
inner_op_type = TREE_TYPE (gimple_assign_rhs1 (stmt));
- if (TYPE_UNSIGNED (op_type) == TYPE_UNSIGNED (inner_op_type)
+ /* If the inner-most type is unsigned, then we can strip any
+ intermediate widening operation. If it's signed, then the
+ intermediate widening operation must also be signed. */
+ if ((TYPE_UNSIGNED (inner_op_type)
+ || TYPE_UNSIGNED (op_type) == TYPE_UNSIGNED (inner_op_type))
&& TYPE_PRECISION (op_type) > TYPE_PRECISION (inner_op_type))
return true;