aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr101856.c11
-rw-r--r--gcc/tree-ssa-math-opts.cc5
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;