This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/30656] [4.3 Regression] ICE with -ftrapv
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 31 Jan 2007 23:24:53 -0000
- Subject: [Bug middle-end/30656] [4.3 Regression] ICE with -ftrapv
- References: <bug-30656-7427@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #5 from rguenth at gcc dot gnu dot org 2007-01-31 23:24 -------
negate_expr_p says it can negate -4 (which has the overflow flag set), but
negate_expr refuses to, because of the overflow flag.
We get there from
#69 0x080d1145 in gfc_conv_loop_setup (loop=0xbf9d6b4c)
at /home/richard/src/trunk/gcc/fortran/trans-array.c:3219
3219 tmp = fold_build2 (TRUNC_DIV_EXPR, gfc_array_index_type,
(gdb) list
3214 with start = 0, this simplifies to
3215 last = end / step;
3216 for (i = 0; i<=last; i++){...}; */
3217 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
3218 loop->to[n], loop->from[n]);
3219 tmp = fold_build2 (TRUNC_DIV_EXPR, gfc_array_index_type,
3220 tmp, info->stride[n]);
3221 loop->to[n] = gfc_evaluate_now (tmp, &loop->pre);
3222 /* Make the loop variable start at 0. */
3223 loop->from[n] = gfc_index_zero_node;
(gdb) call debug_tree (tmp)
<plus_expr 0xb7c48f0c
type <integer_type 0xb7be02d8 int4 public SI
size <integer_cst 0xb7bd1330 constant invariant 32>
unit size <integer_cst 0xb7bd1168 constant invariant 4>
align 32 symtab 0 alias set -1 canonical type 0xb7be02d8 precision 32
min <integer_cst 0xb7bd12e8 -2147483648> max <integer_cst 0xb7bd1300
2147483647>
pointer_to_this <pointer_type 0xb7be0d00>>
arg 0 <minus_expr 0xb7c48ee8 type <integer_type 0xb7be02d8 int4>
arg 0 <nop_expr 0xb7c44e60 type <integer_type 0xb7be02d8 int4>
arg 0 <var_decl 0xb7bdcb00 n>>
arg 1 <var_decl 0xb7c4b210 D.1106 type <integer_type 0xb7be02d8 int4>
used ignored SI file
/Users/eschnett/Calpha/arrangements/LSUThorns/SummationByParts/src/Dissipation_4_3_min_err_coeff.F90
line 445 size <integer_cst 0xb7bd1330 32> unit size <integer_cst 0xb7bd1168 4>
align 32 context <function_decl 0xb7c3c9a0 set_hmatrix>>>
arg 1 <integer_cst 0xb7c477b0 type <integer_type 0xb7be02d8 int4> constant
invariant public overflow -4>>
which has the overflow flag already set, created from
3217 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
3218 loop->to[n], loop->from[n]);
(gdb) call debug_generic_expr (loop->to[n])
(int4) ((<unnamed type>) n + 0x0fffffffc)
(gdb) call debug_generic_expr (loop->from[n])
D.1106
which we fold in reassociation where we finally end up calling
associate_trees with code == PLUS_EXPR
(gdb) call debug_generic_expr (t1)
(int4) n - D.1106
(gdb) call debug_generic_expr (t2)
0x0fffffffc
and returning via
1413 return build2 (code, type, fold_convert (type, t1),
1414 fold_convert (type, t2));
will cause (int4)0x0fffffffc to have the overflow flag set.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30656