On Mon, 19 Oct 2015, Christophe Lyon wrote: > On 19 October 2015 at 15:54, Richard Biener <rguent...@suse.de> wrote: > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. > > > > Hi Richard, > > This patch caused arm and aarch64 builds of newlib to cause ICEs: > In file included from > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/newlib/newlib/libc/include/stdlib.h:11:0, > from > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/newlib/newlib/libc/time/mktm_r.c:13: > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/newlib/newlib/libc/time/mktm_r.c: > In function '_mktm_r': > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/newlib/newlib/libc/time/mktm_r.c:28:9: > internal compiler error: Segmentation fault > _DEFUN (_mktm_r, (tim_p, res, is_gmtime), > 0xa90205 crash_signal > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/toplev.c:353 > 0x7b3b0c tree_class_check > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree.h:3055 > 0x7b3b0c tree_single_nonnegative_warnv_p(tree_node*, bool*, int) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/fold-const.c:13025 > 0x814053 gimple_phi_nonnegative_warnv_p > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimple-fold.c:6239 > 0x814053 gimple_stmt_nonnegative_warnv_p(gimple*, bool*, int) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimple-fold.c:6264 > 0x7b5c94 tree_expr_nonnegative_p(tree_node*) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/fold-const.c:13325 > 0xe2f657 gimple_simplify_108 > > /tmp/884316_1.tmpdir/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-eabi/gcc1/gcc/gimple-match.c:5116 > 0xe3060d gimple_simplify_TRUNC_MOD_EXPR > > /tmp/884316_1.tmpdir/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-eabi/gcc1/gcc/gimple-match.c:24762 > 0xe0809b gimple_simplify > > /tmp/884316_1.tmpdir/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-eabi/gcc1/gcc/gimple-match.c:34389 > 0xe08c2b gimple_resimplify2(gimple**, code_helper*, tree_node*, > tree_node**, tree_node* (*)(tree_node*)) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimple-match-head.c:193 > 0xe17600 gimple_simplify(gimple*, code_helper*, tree_node**, gimple**, > tree_node* (*)(tree_node*), tree_node* (*)(tree_node*)) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimple-match-head.c:762 > 0x81c694 fold_stmt_1 > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimple-fold.c:3605 > 0xad0f6c replace_uses_by(tree_node*, tree_node*) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfg.c:1835 > 0xad1a2f gimple_merge_blocks > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfg.c:1921 > 0x67d325 merge_blocks(basic_block_def*, basic_block_def*) > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfghooks.c:776 > 0xae06da cleanup_tree_cfg_bb > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfgcleanup.c:654 > 0xae1118 cleanup_tree_cfg_1 > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfgcleanup.c:686 > 0xae1118 cleanup_tree_cfg_noloop > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfgcleanup.c:738 > 0xae1118 cleanup_tree_cfg() > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfgcleanup.c:793 > 0x9c5c94 execute_function_todo > > /tmp/884316_1.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1920 > Please submit a full bug report, > > This happens for instance with GCC configured > --target arm-none-eabi > --with-cpu cortex-a9 > > You can download logs of a failed build from > http://people.linaro.org/~christophe.lyon/cross-validation/gcc-build/trunk/228970/build.html > > Sorry, I'm out of office for one week, I can't produce further details.
Ok, without preprocessed source it's hard to track down but from the backtrace I figure it's an issue similar to that of PR67815. So a testcase would be really nice. Richard. > Christophe > > > > Richard. > > > > 2015-10-19 Richard Biener <rguent...@suse.de> > > > > * gimple-fold.c (gimple_phi_nonnegative_warnv_p): New function. > > (gimple_stmt_nonnegative_warnv_p): Use it. > > * match.pd (CPROJ): New operator list. > > (cproj (complex ...)): Move simplifications from ... > > * builtins.c (fold_builtin_cproj): ... here. > > > > * gcc.dg/torture/builtin-cproj-1.c: Skip for -O0. > > > > Index: gcc/gimple-fold.c > > =================================================================== > > --- gcc/gimple-fold.c (revision 228877) > > +++ gcc/gimple-fold.c (working copy) > > @@ -6224,6 +6224,24 @@ gimple_call_nonnegative_warnv_p (gimple > > strict_overflow_p, depth); > > } > > > > +/* Return true if return value of call STMT is known to be non-negative. > > + If the return value is based on the assumption that signed overflow is > > + undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change > > + *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. > > */ > > + > > +static bool > > +gimple_phi_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p, > > + int depth) > > +{ > > + for (unsigned i = 0; i < gimple_phi_num_args (stmt); ++i) > > + { > > + tree arg = gimple_phi_arg_def (stmt, i); > > + if (!tree_single_nonnegative_warnv_p (arg, strict_overflow_p, depth > > + 1)) > > + return false; > > + } > > + return true; > > +} > > + > > /* Return true if STMT is known to compute a non-negative value. > > If the return value is based on the assumption that signed overflow is > > undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change > > @@ -6241,6 +6259,9 @@ gimple_stmt_nonnegative_warnv_p (gimple > > case GIMPLE_CALL: > > return gimple_call_nonnegative_warnv_p (stmt, strict_overflow_p, > > depth); > > + case GIMPLE_PHI: > > + return gimple_phi_nonnegative_warnv_p (stmt, strict_overflow_p, > > + depth); > > default: > > return false; > > } > > Index: gcc/match.pd > > =================================================================== > > --- gcc/match.pd (revision 228877) > > +++ gcc/match.pd (working copy) > > @@ -61,6 +61,7 @@ (define_operator_list COS BUILT_IN_COSF > > (define_operator_list TAN BUILT_IN_TANF BUILT_IN_TAN BUILT_IN_TANL) > > (define_operator_list COSH BUILT_IN_COSHF BUILT_IN_COSH BUILT_IN_COSHL) > > (define_operator_list CEXPI BUILT_IN_CEXPIF BUILT_IN_CEXPI BUILT_IN_CEXPIL) > > +(define_operator_list CPROJ BUILT_IN_CPROJF BUILT_IN_CPROJ BUILT_IN_CPROJL) > > > > /* Simplifications of operations with one constant operand and > > simplifications to constants or single values. */ > > @@ -2361,6 +2362,32 @@ (define_operator_list CEXPI BUILT_IN_CEX > > (cbrts (pows tree_expr_nonnegative_p@0 @1)) > > (pows @0 (mult @1 { build_real_truncate (type, dconst_third ()); }))))) > > > > +/* If the real part is inf and the imag part is known to be > > + nonnegative, return (inf + 0i). */ > > +(simplify > > + (CPROJ (complex REAL_CST@0 tree_expr_nonnegative_p@1)) > > + (if (real_isinf (TREE_REAL_CST_PTR (@0))) > > + (with > > + { > > + REAL_VALUE_TYPE rinf; > > + real_inf (&rinf); > > + } > > + { build_complex (type, build_real (TREE_TYPE (type), rinf), > > + build_zero_cst (TREE_TYPE (type))); }))) > > +/* If the imag part is inf, return (inf+I*copysign(0,imag)). */ > > +(simplify > > + (CPROJ (complex @0 REAL_CST@1)) > > + (if (real_isinf (TREE_REAL_CST_PTR (@1))) > > + (with > > + { > > + REAL_VALUE_TYPE rinf, rzero = dconst0; > > + real_inf (&rinf); > > + rzero.sign = TREE_REAL_CST_PTR (@1)->sign; > > + } > > + { build_complex (type, build_real (TREE_TYPE (type), rinf), > > + build_real (TREE_TYPE (type), rzero)); }))) > > + > > + > > /* Narrowing of arithmetic and logical operations. > > > > These are conceptually similar to the transformations performed for > > Index: gcc/builtins.c > > =================================================================== > > --- gcc/builtins.c (revision 228877) > > +++ gcc/builtins.c (working copy) > > @@ -7657,33 +7657,6 @@ fold_builtin_cproj (location_t loc, tree > > else > > return arg; > > } > > - else if (TREE_CODE (arg) == COMPLEX_EXPR) > > - { > > - tree real = TREE_OPERAND (arg, 0); > > - tree imag = TREE_OPERAND (arg, 1); > > - > > - STRIP_NOPS (real); > > - STRIP_NOPS (imag); > > - > > - /* If the real part is inf and the imag part is known to be > > - nonnegative, return (inf + 0i). Remember side-effects are > > - possible in the imag part. */ > > - if (TREE_CODE (real) == REAL_CST > > - && real_isinf (TREE_REAL_CST_PTR (real)) > > - && tree_expr_nonnegative_p (imag)) > > - return omit_one_operand_loc (loc, type, > > - build_complex_cproj (type, false), > > - arg); > > - > > - /* If the imag part is inf, return (inf+I*copysign(0,imag)). > > - Remember side-effects are possible in the real part. */ > > - if (TREE_CODE (imag) == REAL_CST > > - && real_isinf (TREE_REAL_CST_PTR (imag))) > > - return > > - omit_one_operand_loc (loc, type, > > - build_complex_cproj (type, TREE_REAL_CST_PTR > > - (imag)->sign), arg); > > - } > > > > return NULL_TREE; > > } > > Index: gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c (revision 228877) > > +++ gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c (working copy) > > @@ -6,6 +6,7 @@ > > Origin: Kaveh R. Ghazi, April 9, 2010. */ > > > > /* { dg-do link } */ > > +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ > > /* { dg-add-options ieee } */ > > > > /* All references to link_error should go away at compile-time. The > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)