diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr101856.c | 11 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.cc | 5 |
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101856.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101856.c new file mode 100644 index 0000000..987737a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr101856.c @@ -0,0 +1,11 @@ +/* PR tree-optimization/101856 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-final { scan-tree-dump " .MUL_OVERFLOW " "optimized" { target i?86-*-* x86_64-*-* aarch64*-*-* powerpc64le-*-* } } } */ + +int +foo (unsigned long x, unsigned long y) +{ + unsigned long z = x * y; + return z / y != x; +} diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc index d71c51d..d80d53d 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -4074,7 +4074,10 @@ match_arith_overflow (gimple_stmt_iterator *gsi, gimple *stmt, TYPE_MODE (type)) == CODE_FOR_nothing) || (code == MULT_EXPR && optab_handler (cast_stmt ? mulv4_optab : umulv4_optab, - TYPE_MODE (type)) == CODE_FOR_nothing)) + TYPE_MODE (type)) == CODE_FOR_nothing + && (use_seen + || cast_stmt + || !can_mult_highpart_p (TYPE_MODE (type), true)))) { if (code != PLUS_EXPR) return false; |