* [PATCH] Move cproj simplification to match.pd
@ 2015-10-19 13:57 Richard Biener
2015-10-19 20:47 ` Christophe Lyon
2015-10-20 8:21 ` Bernhard Reutner-Fischer
0 siblings, 2 replies; 5+ messages in thread
From: Richard Biener @ 2015-10-19 13:57 UTC (permalink / raw)
To: gcc-patches
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
2015-10-19 Richard Biener <rguenther@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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Move cproj simplification to match.pd
2015-10-19 13:57 [PATCH] Move cproj simplification to match.pd Richard Biener
@ 2015-10-19 20:47 ` Christophe Lyon
2015-10-20 7:54 ` Richard Biener
2015-10-20 8:21 ` Bernhard Reutner-Fischer
1 sibling, 1 reply; 5+ messages in thread
From: Christophe Lyon @ 2015-10-19 20:47 UTC (permalink / raw)
To: Richard Biener; +Cc: gcc-patches
On 19 October 2015 at 15:54, Richard Biener <rguenther@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.
Christophe
> Richard.
>
> 2015-10-19 Richard Biener <rguenther@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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Move cproj simplification to match.pd
2015-10-19 20:47 ` Christophe Lyon
@ 2015-10-20 7:54 ` Richard Biener
2015-10-20 14:16 ` Kyrill Tkachov
0 siblings, 1 reply; 5+ messages in thread
From: Richard Biener @ 2015-10-20 7:54 UTC (permalink / raw)
To: Christophe Lyon; +Cc: gcc-patches
On Mon, 19 Oct 2015, Christophe Lyon wrote:
> On 19 October 2015 at 15:54, Richard Biener <rguenther@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 <rguenther@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 <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Move cproj simplification to match.pd
2015-10-19 13:57 [PATCH] Move cproj simplification to match.pd Richard Biener
2015-10-19 20:47 ` Christophe Lyon
@ 2015-10-20 8:21 ` Bernhard Reutner-Fischer
1 sibling, 0 replies; 5+ messages in thread
From: Bernhard Reutner-Fischer @ 2015-10-20 8:21 UTC (permalink / raw)
To: Richard Biener, gcc-patches
On October 19, 2015 3:54:05 PM GMT+02:00, Richard Biener <rguenther@suse.de> wrote:
>
>+static bool
>+gimple_phi_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p,
>+ int depth)
>+{
Shouldn't all such depth parms be unsigned short or at least unsigned int?
Thanks,
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Move cproj simplification to match.pd
2015-10-20 7:54 ` Richard Biener
@ 2015-10-20 14:16 ` Kyrill Tkachov
0 siblings, 0 replies; 5+ messages in thread
From: Kyrill Tkachov @ 2015-10-20 14:16 UTC (permalink / raw)
To: Richard Biener, Christophe Lyon; +Cc: gcc-patches
On 20/10/15 08:37, Richard Biener wrote:
> On Mon, 19 Oct 2015, Christophe Lyon wrote:
>
>> On 19 October 2015 at 15:54, Richard Biener <rguenther@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.
Seems it has been filed PR 68031.
Kyrill
> Richard.
>
>> Christophe
>>
>>
>>> Richard.
>>>
>>> 2015-10-19 Richard Biener <rguenther@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
>>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-10-20 14:14 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-19 13:57 [PATCH] Move cproj simplification to match.pd Richard Biener
2015-10-19 20:47 ` Christophe Lyon
2015-10-20 7:54 ` Richard Biener
2015-10-20 14:16 ` Kyrill Tkachov
2015-10-20 8:21 ` Bernhard Reutner-Fischer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).