From: Jakub Jelinek Date: Mon, 25 Jun 2018 17:04:14 +0000 (+0200) Subject: backport: re PR tree-optimization/83523 (ICE: verify_gimple failed (error: statement... X-Git-Tag: releases/gcc-6.5.0~235 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41a10ba0de32db0c06276c1307464e06887b7b98;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/83523 (ICE: verify_gimple failed (error: statement marked for throw, but doesn't)) Backported from mainline 2017-12-21 Jakub Jelinek PR tree-optimization/83523 * tree-ssa-math-opts.c (is_widening_mult_p): Return false if for INTEGER_TYPE TYPE_OVERFLOW_TRAPS. (convert_mult_to_fma): Likewise. * g++.dg/tree-ssa/pr83523.C: New test. From-SVN: r262048 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d67b8dbebdcc..6b73af2cb423 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,11 @@ Backported from mainline 2017-12-21 Jakub Jelinek + PR tree-optimization/83523 + * tree-ssa-math-opts.c (is_widening_mult_p): Return false if + for INTEGER_TYPE TYPE_OVERFLOW_TRAPS. + (convert_mult_to_fma): Likewise. + PR tree-optimization/83521 * tree-ssa-phiopt.c (factor_out_conditional_conversion): Use gimple_build_assign without code on result of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd21e51e93c9..f8138962f272 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,11 @@ Backported from mainline 2017-12-21 Jakub Jelinek + PR tree-optimization/83523 + * g++.dg/tree-ssa/pr83523.C: New test. + + 2017-12-21 Jakub Jelinek + PR tree-optimization/83521 * gcc.dg/pr83521.c: New test. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr83523.C b/gcc/testsuite/g++.dg/tree-ssa/pr83523.C new file mode 100644 index 000000000000..d9adf90f0b5b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr83523.C @@ -0,0 +1,25 @@ +// PR tree-optimization/83523 +// { dg-do compile } +// { dg-options "-O2 -fexceptions -fnon-call-exceptions -ftrapv" } + +#ifdef __SIZEOF_INT128__ +typedef __int128 T; +typedef long long int U; +#else +typedef long long int T; +typedef int U; +#endif + +struct S { S (); ~S (); }; +void bar (); + +T +foo (U x, U y) +{ + T z = x; + S s; + bar (); + z *= y; + bar (); + return z; +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 6413bd6d1ae1..71315dc42793 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -3030,8 +3030,12 @@ is_widening_mult_p (gimple *stmt, { tree type = TREE_TYPE (gimple_assign_lhs (stmt)); - if (TREE_CODE (type) != INTEGER_TYPE - && TREE_CODE (type) != FIXED_POINT_TYPE) + if (TREE_CODE (type) == INTEGER_TYPE) + { + if (TYPE_OVERFLOW_TRAPS (type)) + return false; + } + else if (TREE_CODE (type) != FIXED_POINT_TYPE) return false; if (!is_widening_mult_rhs_p (type, gimple_assign_rhs1 (stmt), type1_out, @@ -3399,7 +3403,8 @@ convert_mult_to_fma (gimple *mul_stmt, tree op1, tree op2) /* We don't want to do bitfield reduction ops. */ if (INTEGRAL_TYPE_P (type) && (TYPE_PRECISION (type) - != GET_MODE_PRECISION (TYPE_MODE (type)))) + != GET_MODE_PRECISION (TYPE_MODE (type)) + || TYPE_OVERFLOW_TRAPS (type))) return false; /* If the target doesn't support it, don't generate it. We assume that