2011-12-05 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/51396
+ * tree-ssa-math-opts.c (convert_mult_to_fma): Don't optimize
+ if MUL_RESULT has zero uses.
+
PR debug/51410
* c-decl.c (pop_scope): Don't add DECL_EXTERNAL decls
for debug info if scope is file_scope.
2011-12-05 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/51396
+ * g++.dg/opt/pr51396.C: New test.
+
PR debug/51410
* gcc.dg/debug/dwarf2/pr51410.c: New test.
--- /dev/null
+// PR tree-optimization/51396
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions -mfma" }
+// { dg-options "-O2 -fnon-call-exceptions -mfma" { target i?86-*-* x86_64-*-* } }
+
+double baz (double) throw ();
+
+struct C
+{
+ C (double d = 0.0) : c (d) {}
+ double c;
+};
+
+static inline void
+foo (double x, const C &y)
+{
+ x ? (y.c * baz (x)) : (C (), y);
+}
+
+void
+bar (double x, C y)
+{
+ foo (x, y);
+}
if (optab_handler (fma_optab, TYPE_MODE (type)) == CODE_FOR_nothing)
return false;
+ /* If the multiplication has zero uses, it is kept around probably because
+ of -fnon-call-exceptions. Don't optimize it away in that case,
+ it is DCE job. */
+ if (has_zero_uses (mul_result))
+ return 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