diff options
author | rearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-07 10:37:08 +0000 |
---|---|---|
committer | rearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-07 10:37:08 +0000 |
commit | 8f9d15315de79f9b70313aaac5fb8a592d9d06c1 (patch) | |
tree | c6a5cc1bbe9e0d190e009cb18cb51b75417511aa | |
parent | 488d5367b3038c42ee6bb52b9af2b7fb9b739ebd (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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/pr50318-1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/smlaltb-1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/smlaltt-1.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 6 |
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; |