diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cdf6a201820c..360fd5642fa3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-09-07 Richard Earnshaw + + 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 PR middle-end/53667 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8a987e1f8cf4..ff3583fc5259 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-09-07 Richard Earnshaw + + * 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 * 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 05885e1b5aca..be270eefaef3 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 1472c9b3fa16..a27009d25132 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 6bcbce0b9586..380e3d01be69 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 c3392fb14c8b..94d19afc2c07 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;