+2019-04-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/89956
+ * tree-ssa-math-opts.c (convert_mult_to_fma): Protect against
+ multiple negates of the same value.
+
2019-04-04 Martin Sebor <msebor@redhat.com>
PR middle-end/89957
+2019-04-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/89956
+ * gfortran.dg/pr89956.f90: New test.
+
2019-04-04 Martin Sebor <msebor@redhat.com>
PR c++/89974
--- /dev/null
+! { dg-options "-O3 -fno-tree-forwprop -fno-tree-pre -fno-tree-dominator-opts -fno-code-hoisting -ffast-math" }
+
+module de
+contains
+ function zu (az, xx) result (q3)
+ real :: az, xx, q3
+
+ q3 = 1.0 - lz (az, xx) - lz (xx, az)
+ end function zu
+
+ function lz (ho, gh) result (ye)
+ real :: ho, gh, ye
+
+ ye = sqrt (ho) - ho * gh
+ end function lz
+end module de
&& (tree_to_shwi (TYPE_SIZE (type))
<= PARAM_VALUE (PARAM_AVOID_FMA_MAX_BITS)));
bool defer = check_defer;
+ bool seen_negate_p = false;
/* Make sure that the multiplication statement becomes dead after
the transformation, thus that all uses are transformed to FMAs.
This means we assume that an FMA operation has the same cost
ssa_op_iter iter;
use_operand_p usep;
+ /* If (due to earlier missed optimizations) we have two
+ negates of the same value, treat them as equivalent
+ to a single negate with multiple uses. */
+ if (seen_negate_p)
+ return false;
+
result = gimple_assign_lhs (use_stmt);
/* Make sure the negate statement becomes dead with this
if (gimple_bb (use_stmt) != gimple_bb (mul_stmt))
return false;
- negate_p = true;
+ negate_p = seen_negate_p = true;
}
tree cond, else_value, ops[3];