From 0fb808ea7a0f30531e9a1495b9aafa5267c2f0b5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 5 Dec 2011 21:56:14 +0100 Subject: [PATCH] re PR tree-optimization/51396 (ICE: verify_flow_info failed: BB 4 can not throw but has an EH edge with -O2 -fnon-call-exceptions -mfma4) PR tree-optimization/51396 * tree-ssa-math-opts.c (convert_mult_to_fma): Don't optimize if MUL_RESULT has zero uses. * g++.dg/opt/pr51396.C: New test. From-SVN: r182028 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/opt/pr51396.C | 24 ++++++++++++++++++++++++ gcc/tree-ssa-math-opts.c | 6 ++++++ 4 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/pr51396.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 52c1de56aef..318b4ceadb1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2011-12-05 Jakub Jelinek + 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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 654a56ea806..efb2ed42af3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-12-05 Jakub Jelinek + PR tree-optimization/51396 + * g++.dg/opt/pr51396.C: New test. + PR debug/51410 * gcc.dg/debug/dwarf2/pr51410.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr51396.C b/gcc/testsuite/g++.dg/opt/pr51396.C new file mode 100644 index 00000000000..f2b21b60d53 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr51396.C @@ -0,0 +1,24 @@ +// 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); +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 75abb3369a1..06a4505079f 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -2429,6 +2429,12 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tree op2) 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 -- 2.30.2