diff options
-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 cdf6a20..360fd56 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 8a987e1..ff3583f 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 05885e1..be270ee 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 1472c9b..a27009d 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 6bcbce0..380e3d0 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 c3392fb..94d19af 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; |