[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-25 Thread dcb314 at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #21 from David Binderman  ---
(In reply to rsand...@gcc.gnu.org from comment #20)
> Thanks for the testing.  

You are welcome.

> Could you open new PRs for the new backtraces?

Done. Most of them were already mentioned in bugzilla, but for
the rest, I have raised 90241, 90242 and 90244.

> But whether the operation triggers
> UB is usually determined by the operation being done (i.e. by the
> caller) rather than the way poly-int.h implements it.  

Thanks for the explanation. It is a lot clearer now.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-24 Thread rsandifo at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #20 from rsandifo at gcc dot gnu.org  
---
> Most of these are array bounds. I'll find out stack backtraces for
> each of these.

Thanks for the testing.  Could you open new PRs for the new backtraces?
These are really independent bugs, and it'd be useful to keep this PR
specific to the two problems fixed in r270442.

> I got 26 runtime errors, of which 20 are poly-int.h

FWIW, whether something occurs in poly-int.h or not isn't usually
that relevant.  A lot of arithmetic that used to be open-coded now
goes through functions in poly-int.h, so it tends to show up a lot
as the immediate point of failure.  But whether the operation triggers
UB is usually determined by the operation being done (i.e. by the
caller) rather than the way poly-int.h implements it.  On x86 targets,
what poly-int.h does is usually the same as what the original pre-poly-int
code did.

This was the case in both of the bugs fixed in r270442 for example.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-24 Thread dcb314 at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #19 from David Binderman  ---
For ./c-c++-common/Warray-bounds-2.c

../../trunk/gcc/poly-int.h:1107:5: runtime error: signed integer overflow: 8 *
-9223372036854775796 cannot be represented in type 'long int'
#0 0x2ddd587 in poly_int<1u, poly_result::is_poly>::type, long,
poly_coeff_pair_traits::is_poly>::type, long>::result_kind>::type> operator*<1u,
int, long>(int const&, poly_int_pod<1u, long> const&)
../../trunk/gcc/poly-int.h:1107
#1 0x2ddd587 in ao_ref_init_from_ptr_and_size(ao_ref*, tree_node*,
tree_node*) ../../trunk/gcc/tree-ssa-alias.c:703
#2 0x2ea1f49 in initialize_ao_ref_for_dse
../../trunk/gcc/tree-ssa-dse.c:106
#3 0x2ea1f49 in initialize_ao_ref_for_dse ../../trunk/gcc/tree-ssa-dse.c:91
#4 0x2ea784b in dse_dom_walker::dse_optimize_stmt(gimple_stmt_iterator*)
../../trunk/gcc/tree-ssa-dse.c:851

For ./c-c++-common/Warray-bounds.c

../../trunk/gcc/poly-int.h:715:21: runtime error: signed integer overflow:
9223372036854775804 + 4 cannot be represented in type 'long int'
#0 0x318ecb2 in poly_int<1u, long>& poly_int<1u,
long>::operator+=(poly_int_pod<1u, long> const&)
../../trunk/gcc/poly-int.h:715
#1 0x318ecb2 in vn_reference_compute_hash
../../trunk/gcc/tree-ssa-sccvn.c:657
#2 0x31b26b5 in vn_reference_lookup(tree_node*, tree_node*, vn_lookup_kind,
vn_reference_s**, bool) ../../trunk/gcc/tree-ssa-sccvn.c:2714
#3 0x31ea070 in visit_reference_op_load
../../trunk/gcc/tree-ssa-sccvn.c:4091
#4 0x31ea070 in visit_stmt ../../trunk/gcc/tree-ssa-sccvn.c:4509

For /gcc.dg/strlenopt-55.c

../../trunk/gcc/poly-int.h:1095:5: runtime error: signed integer overflow:
9223372036854775805 * 8 cannot be represented in type 'long int'
#0 0x31917e4 in poly_int<1u, poly_result::is_poly>::type, poly_coeff_pair_traits::is_poly>::type>::result_kind>::type>
operator*<1u, long, int>(poly_int_pod<1u, long> const&, int const&)
../../trunk/gcc/poly-int.h:1095
#1 0x31917e4 in fully_constant_vn_reference_p(vn_reference_s*)
../../trunk/gcc/tree-ssa-sccvn.c:1485
#2 0x31b26c3 in vn_reference_lookup(tree_node*, tree_node*, vn_lookup_kind,
vn_reference_s**, bool) ../../trunk/gcc/tree-ssa-sccvn.c:2715
#3 0x31ea070 in visit_reference_op_load
../../trunk/gcc/tree-ssa-sccvn.c:4091
#4 0x31ea070 in visit_stmt ../../trunk/gcc/tree-ssa-sccvn.c:4509

For ./gcc.dg/torture/pr84811.c

../../trunk/gcc/cse.c:2215:34: runtime error: signed integer overflow:
162675373468811328 - -9060696663385964544 cannot be represented in type 'long
int'
#0 0x4e5f416 in use_related_value ../../trunk/gcc/cse.c:2215
#1 0x4e5f416 in cse_insn ../../trunk/gcc/cse.c:4877
#2 0x4e60b7e in cse_extended_basic_block ../../trunk/gcc/cse.c:6662
#3 0x4e60b7e in cse_main ../../trunk/gcc/cse.c:6841
#4 0x4e680ee in rest_of_handle_cse2 ../../trunk/gcc/cse.c:7743


For /gcc.dg/torture/pr84929.c

../../trunk/gcc/poly-int.h:753:21: runtime error: signed integer overflow:
-5621332293356458048 * 8 cannot be represented in type 'long int'
#0 0x1929e14 in if_nonpoly,
poly_int_traits::is_poly>::type& poly_int<1u, long>::operator*=(int
const&) ../../trunk/gcc/poly-int.h:753
#1 0x1929e14 in fold_const_aggregate_ref_1(tree_node*, tree_node*
(*)(tree_node*)) ../../trunk/gcc/gimple-fold.c:6992
#2 0x192b422 in gimple_fold_stmt_to_constant_1(gimple*, tree_node*
(*)(tree_node*), tree_node* (*)(tree_node*)) ../../trunk/gcc/gimple-fold.c:6426
#3 0x2e1ab24 in ccp_fold ../../trunk/gcc/tree-ssa-ccp.c:1257
#4 0x2e1ab24 in evaluate_stmt ../../trunk/gcc/tree-ssa-ccp.c:1785

For ./gcc.dg/Warray-bounds-22.c

../../trunk/gcc/poly-int.h:1095:5: runtime error: signed integer overflow:
9223372036854775807 * 8 cannot be represented in type 'long int'
#0 0xf85e20 in poly_int<1u, poly_result::is_poly>::type, poly_coeff_pair_traits::is_poly>::type>::result_kind>::type>
operator*<1u, long, int>(poly_int_pod<1u, long> const&, int const&)
../../trunk/gcc/poly-int.h:1095
#1 0xf85e20 in get_object_alignment_2 ../../trunk/gcc/builtins.c:344
#2 0xf86d9d in get_object_alignment_1(tree_node*, unsigned int*, unsigned
long*) ../../trunk/gcc/builtins.c:394
#3 0xf86d9d in get_object_alignment(tree_node*)
../../trunk/gcc/builtins.c:405
#4 0x1690d75 in expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool) ../../trunk/gcc/expr.c:10343

For ./gcc.dg/Warray-bounds-30.c

../../trunk/gcc/cse.c:2215:34: runtime error: signed integer overflow: 0 -
-9223372036854775808 cannot be represented in type 'long int'
#0 0x4e5f416 in use_related_value ../../trunk/gcc/cse.c:2215
#1 0x4e5f416 in cse_insn ../../trunk/gcc/cse.c:4877
#2 0x4e60b7e in cse_extended_basic_block ../../trunk/gcc/cse.c:6662
#3 0x4e60b7e in cse_main ../../trunk/gcc/cse.c:6841
#4 0x4e67ef5 in rest_of_handle_cse ../../trunk/gcc/cse.c:7678

For ./gcc.dg/Warray-bounds-31.c

../../trunk/gcc/poly-int.h:1095:5: runtime error: signed integer overflo

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-24 Thread dcb314 at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #18 from David Binderman  ---

(In reply to rsand...@gcc.gnu.org from comment #14)
> Yeah, the patch I committed fixed two separate instances of
> undefined overflow, but I think there are a lot more left.

Excellent results so far, but I have new data on remaining
runtime errors.

I tried all the C code in the testsuite with a ubsan
version of gcc trunk 270500. I used compiler flags -g -O3 -march=native -Wall.

I got 26 runtime errors, of which 20 are poly-int.h

C++ and fortran remain untested. I'll get to those soon.
Of the C errors, the 6 that aren't poly-int.h, I will report on
in other bug reports.

Of the 20 runtime errors from poly-int.h, they are produced
by this list of C source code files:

./c-c++-common/Warray-bounds-2.c
./c-c++-common/Warray-bounds.c
./gcc.dg/strlenopt-55.c
./gcc.dg/torture/pr84811.c
./gcc.dg/torture/pr84929.c
./gcc.dg/Warray-bounds-22.c
./gcc.dg/Warray-bounds-30.c
./gcc.dg/Warray-bounds-31.c

Most of these are array bounds. I'll find out stack backtraces for
each of these.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-23 Thread marxin at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #17 from Martin Liška  ---
> Could you open separate PRs for the new tests?  We could perhaps
> have a meta-bug for ubsan failures too, if we don't already.

I did so: PR90213 and PR90214.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-23 Thread zeccav at gmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #16 from Vittorio Zecca  ---
On Saturday afternoon I had a power failure that probably damaged my disk,
so I cannot help you now.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-23 Thread marxin at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #15 from Martin Liška  ---
> 
> Could you open separate PRs for the new tests?  We could perhaps
> have a meta-bug for ubsan failures too, if we don't already.

We do have one ('ubsan' alias name):
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63426

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-23 Thread rsandifo at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #14 from rsandifo at gcc dot gnu.org  
---
Yeah, the patch I committed fixed two separate instances of
undefined overflow, but I think there are a lot more left.
The testsuite results with bootstrap-ubsan show a lot of failures
generally, so the compiler isn't UB-free even for our existing tests.

I fixed another instance in r85164 that was unrelated to the testcases
in this PR, so if you're just applying the patches locally, it'd be worth
trying that as well.

Could you open separate PRs for the new tests?  We could perhaps
have a meta-bug for ubsan failures too, if we don't already.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-23 Thread marxin at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #13 from Martin Liška  ---
Can you please use:
$ export UBSAN_OPTIONS="print_stacktrace=1"

so that we see the complete back-trace? Thanks.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-19 Thread zeccav at gmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #12 from Vittorio Zecca  ---
Here are two more test cases with undefined behaviour in poly-int.h

Must be compiled with nonzero optimization

cat gccerr73.c
// must be compiled with nonzero optimization
// ../../gcc/gcc/poly-int.h:753:21: runtime error: signed integer
overflow: -5621332293356458048 * 8 cannot be represented in type 'long
int'
int a[4];
void f()
{
  long int b = 7818038963515661296;
  a[0xA699ECD2C348A3A0] = a[b];
}


[vitti cc]$cat gccerr74.c
// Must be compiled with nonzero optimization
// ../../gcc/gcc/poly-int.h:944:5: runtime error: signed integer
overflow: 162675373468811328 - -9060696663385964544 cannot be
represented in type 'long int'
long b[1][9];
typedef long V __attribute__((vector_size (16), may_alias));

void
foo ()
{
  V *c = (V *) ((char *) b + -9060696663385964544);
  *c = (V) { 1, 1 };
  long __attribute__((may_alias)) *d = (long *) ((char *) b +
162675373468811328);
  *d = 1;
}

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-19 Thread zeccav at gmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #11 from Vittorio Zecca  ---
After applying your fixes I still have overflow compiling the following

// Must be compiled with nonzero optimization
//../../gcc/gcc/poly-int.h:1095:5: runtime error: signed integer
overflow: 9223372036854775807 * 8 cannot be represented in type 'long
int'
// 87042
const char a[] = {};
int b() { '\0' == a[9223372036854775807]; }

../../gcc/gcc/poly-int.h:1095:5: runtime error: signed integer
overflow: 9223372036854775807 * 8 cannot be represented in type 'long
int'

Remember must be compiled with nonzero optimization

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-18 Thread rsandifo at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #10 from rsandifo at gcc dot gnu.org  
---
Author: rsandifo
Date: Thu Apr 18 12:30:36 2019
New Revision: 270443

URL: https://gcc.gnu.org/viewcvs?rev=270443&root=gcc&view=rev
Log:
Fix UB in int_const_binop

When testing PR 85164, the baseline bootstrap-ubsan results had
a lot of failures from int_const_binop.  This is because with the
new overflow handling we can sometimes do:

  poly_res = res;

on an uninitialised res.

2019-04-18  Richard Sandiford  

gcc/
* fold-const.c (int_const_binop): Return early on failure.

Modified:
trunk/gcc/ChangeLog
trunk/gcc/fold-const.c

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-18 Thread rsandifo at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #9 from rsandifo at gcc dot gnu.org  
---
Author: rsandifo
Date: Thu Apr 18 12:29:56 2019
New Revision: 270442

URL: https://gcc.gnu.org/viewcvs?rev=270442&root=gcc&view=rev
Log:
Fix two ubsan failures (PR85164)

Two fixes for UB when handling very large offsets.  The calculation in
force_int_to_mode would have been correct if signed integers used modulo
arithmetic, so just switch to unsigned types.  The calculation in
rtx_addr_can_trap_p_1 didn't handle overflow properly, so switch to
known_subrange_p instead (which is supposed to handle all cases).

2019-04-18  Richard Sandiford  

gcc/
PR middle-end/85164
* combine.c (force_int_to_mode): Cast the argument rather than
the result of known_alignment.
* rtlanal.c (rtx_addr_can_trap_p_1): Use known_subrange_p.

gcc/testsuite/
PR middle-end/85164
* gcc.dg/pr85164-1.c, gcc.dg/pr85164-2.c: New tests.

Added:
trunk/gcc/testsuite/gcc.dg/pr85164-1.c
trunk/gcc/testsuite/gcc.dg/pr85164-2.c
Modified:
trunk/gcc/ChangeLog
trunk/gcc/combine.c
trunk/gcc/rtlanal.c
trunk/gcc/testsuite/ChangeLog

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-17 Thread rsandifo at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #8 from rsandifo at gcc dot gnu.org  
---
(In reply to Jakub Jelinek from comment #7)
> (In reply to rsand...@gcc.gnu.org from comment #6)
> 
> Thanks for handling this.
> 
> > > template
> > > inline POLY_BINARY_COEFF (Ca, Ca)
> > > known_alignment (const poly_int_pod &a)
> > > {
> > >   typedef POLY_BINARY_COEFF (Ca, Ca) C;
> > >   C r = a.coeffs[0];
> > >   for (unsigned int i = 1; i < N; ++i)
> > > r |= a.coeffs[i];
> > >   return r & -r;
> > > }
> > > 
> > > The poly_int* stuff makes this much harder to fix, it is unclear if there 
> > > is
> > > some way to get the unsigned type for the C type and use that as r & 
> > > -(Cuns)
> > > r;
> > > to avoid the UB, and there is no poly_uint_rtx_p or something to request
> > > poly_uint64 from the rtx.  Richard?
> > 
> > Changing:
> > 
> > (unsigned HOST_WIDE_INT) known_alignment (const_op0)
> > 
> > to:
> > 
> > known_alignment (poly_uint64 (const_op0))
> > 
> > should work.
> 
> That will handle this specific case, I was just hoping that for
> known_alignment we could fix all the cases that could be called on
> poly_int64.  For HOST_WIDE_INT_MIN, do we want known_alignment to return
> HOST_WIDE_INT_MIN or something different?  It is maximum alignment
> admittedly only if we are treating the result as unsigned.  Or shall we in
> known_alignment assert or compile time assert that it is unsigned and fix
> all the users?

A compile-time assert sounds good.  Will try that on top to see how
invasive it ends up being.  (Shouldn't be too bad, since there aren't
many callers.)

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-17 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #7 from Jakub Jelinek  ---
(In reply to rsand...@gcc.gnu.org from comment #6)

Thanks for handling this.

> > template
> > inline POLY_BINARY_COEFF (Ca, Ca)
> > known_alignment (const poly_int_pod &a)
> > {
> >   typedef POLY_BINARY_COEFF (Ca, Ca) C;
> >   C r = a.coeffs[0];
> >   for (unsigned int i = 1; i < N; ++i)
> > r |= a.coeffs[i];
> >   return r & -r;
> > }
> > 
> > The poly_int* stuff makes this much harder to fix, it is unclear if there is
> > some way to get the unsigned type for the C type and use that as r & -(Cuns)
> > r;
> > to avoid the UB, and there is no poly_uint_rtx_p or something to request
> > poly_uint64 from the rtx.  Richard?
> 
> Changing:
> 
> (unsigned HOST_WIDE_INT) known_alignment (const_op0)
> 
> to:
> 
> known_alignment (poly_uint64 (const_op0))
> 
> should work.

That will handle this specific case, I was just hoping that for known_alignment
we could fix all the cases that could be called on poly_int64.  For
HOST_WIDE_INT_MIN, do we want known_alignment to return HOST_WIDE_INT_MIN or
something different?  It is maximum alignment admittedly only if we are
treating the result as unsigned.  Or shall we in known_alignment assert or
compile time assert that it is unsigned and fix all the users?

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-17 Thread rsandifo at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

rsandifo at gcc dot gnu.org  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
   Assignee|unassigned at gcc dot gnu.org  |rsandifo at gcc dot 
gnu.org

--- Comment #6 from rsandifo at gcc dot gnu.org  
---
(In reply to Jakub Jelinek from comment #5)
> The first above is on:
> case MINUS:
>   /* If X is (minus C Y) where C's least set bit is larger than any bit
>  in the mask, then we may replace with (neg Y).  */
>   if (poly_int_rtx_p (XEXP (x, 0), &const_op0)
>   && (unsigned HOST_WIDE_INT) known_alignment (const_op0) > mask)
> and
> template
> inline POLY_BINARY_COEFF (Ca, Ca)
> known_alignment (const poly_int_pod &a)
> {
>   typedef POLY_BINARY_COEFF (Ca, Ca) C;
>   C r = a.coeffs[0];
>   for (unsigned int i = 1; i < N; ++i)
> r |= a.coeffs[i];
>   return r & -r;
> }
> 
> The poly_int* stuff makes this much harder to fix, it is unclear if there is
> some way to get the unsigned type for the C type and use that as r & -(Cuns)
> r;
> to avoid the UB, and there is no poly_uint_rtx_p or something to request
> poly_uint64 from the rtx.  Richard?

Changing:

(unsigned HOST_WIDE_INT) known_alignment (const_op0)

to:

known_alignment (poly_uint64 (const_op0))

should work.

> 
> The second one is
>   return (!known_size_p (decl_size) || known_eq (decl_size, 0)
>   ? maybe_ne (offset, 0)
>   : maybe_gt (offset + size, decl_size));
> and again, both offset and size are poly_int64, not sure how can one
> reinterpret cast that to poly_uint64 for the operation and then cast back to
> poly_int64.

Normal casts between poly_X and poly_Y work if casts between X and Y work.

> But in that case also if we shouldn't punt on the overflow somehow.

I guess using known_subrange_p would do that.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-17 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

Jakub Jelinek  changed:

   What|Removed |Added

 CC||jakub at gcc dot gnu.org

--- Comment #5 from Jakub Jelinek  ---
The first above is on:
case MINUS:
  /* If X is (minus C Y) where C's least set bit is larger than any bit
 in the mask, then we may replace with (neg Y).  */
  if (poly_int_rtx_p (XEXP (x, 0), &const_op0)
  && (unsigned HOST_WIDE_INT) known_alignment (const_op0) > mask)
and
template
inline POLY_BINARY_COEFF (Ca, Ca)
known_alignment (const poly_int_pod &a)
{
  typedef POLY_BINARY_COEFF (Ca, Ca) C;
  C r = a.coeffs[0];
  for (unsigned int i = 1; i < N; ++i)
r |= a.coeffs[i];
  return r & -r;
}

The poly_int* stuff makes this much harder to fix, it is unclear if there is
some way to get the unsigned type for the C type and use that as r & -(Cuns) r;
to avoid the UB, and there is no poly_uint_rtx_p or something to request
poly_uint64 from the rtx.  Richard?

The second one is
  return (!known_size_p (decl_size) || known_eq (decl_size, 0)
  ? maybe_ne (offset, 0)
  : maybe_gt (offset + size, decl_size));
and again, both offset and size are poly_int64, not sure how can one
reinterpret cast that to poly_uint64 for the operation and then cast back to
poly_int64.
But in that case also if we shouldn't punt on the overflow somehow.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-17 Thread marxin at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #4 from Martin Liška  ---
For the 2 test-cases we reach these backtraces:

$ ./xgcc -B. test.c -O1
../../gcc/poly-int.h:1941:12: runtime error: negation of -9223372036854775808
cannot be represented in type 'long int'; cast to an unsigned type to negate
this value to itself
#0 0xc8bbdc in poly_result::coeff_type,
poly_int_traits::coeff_type,
poly_coeff_pair_traits::coeff_type,
poly_int_traits::coeff_type>::result_kind>::type known_alignment<1u,
long>(poly_int_pod<1u, long> const&) ../../gcc/poly-int.h:1941
#1 0x3db9fdd in force_int_to_mode ../../gcc/combine.c:8949
#2 0x3db8c5b in force_to_mode ../../gcc/combine.c:8802
#3 0x3da45a8 in simplify_set ../../gcc/combine.c:6876
#4 0x3d9f16d in combine_simplify_rtx ../../gcc/combine.c:6456
#5 0x3d96712 in subst ../../gcc/combine.c:5727
#6 0x3d950fa in subst ../../gcc/combine.c:5590
#7 0x3d7ead4 in try_combine ../../gcc/combine.c:3420
#8 0x3d6e699 in combine_instructions ../../gcc/combine.c:1306
#9 0x3df4563 in rest_of_handle_combine ../../gcc/combine.c:15076
#10 0x3df4702 in execute ../../gcc/combine.c:15121
#11 0x1baf287 in execute_one_pass(opt_pass*) ../../gcc/passes.c:2487
#12 0x1bafb1d in execute_pass_list_1 ../../gcc/passes.c:2573
#13 0x1bafbd2 in execute_pass_list_1 ../../gcc/passes.c:2574
#14 0x1bafc71 in execute_pass_list(function*, opt_pass*)
../../gcc/passes.c:2584
#15 0xe52f0c in cgraph_node::expand() ../../gcc/cgraphunit.c:2198
#16 0xe544d3 in expand_all_functions ../../gcc/cgraphunit.c:2336
#17 0xe56b42 in symbol_table::compile() ../../gcc/cgraphunit.c:2687
#18 0xe575a8 in symbol_table::finalize_compilation_unit()
../../gcc/cgraphunit.c:2865
#19 0x2006fad in compile_file ../../gcc/toplev.c:481
#20 0x200ea9b in do_compile ../../gcc/toplev.c:2205
#21 0x200f0c9 in toplev::main(int, char**) ../../gcc/toplev.c:2340
#22 0x438f452 in main ../../gcc/main.c:39
#23 0x76e80b7a in __libc_start_main ../csu/libc-start.c:308
#24 0x85f579 in _start
(/home/marxin/Programming/gcc2/objdir/gcc/cc1+0x85f579)

and

../../gcc/poly-int.h:845:5: runtime error: signed integer overflow:
9223372036854775804 + 4 cannot be represented in type 'long int'
#0 0xc088f7 in poly_int<1u, poly_result::result_kind>::type> operator+<1u, long,
long>(poly_int_pod<1u, long> const&, poly_int_pod<1u, long> const&)
../../gcc/poly-int.h:845
#1 0x1e2e0f2 in rtx_addr_can_trap_p_1 ../../gcc/rtlanal.c:524
#2 0x1e2ef7d in rtx_addr_can_trap_p_1 ../../gcc/rtlanal.c:659
#3 0x1e2ec71 in rtx_addr_can_trap_p_1 ../../gcc/rtlanal.c:645
#4 0x1e3e6fc in may_trap_p_1(rtx_def const*, unsigned int)
../../gcc/rtlanal.c:2836
#5 0x1e3fc4c in may_trap_p_1(rtx_def const*, unsigned int)
../../gcc/rtlanal.c:2937
#6 0x1e3fedf in may_trap_p(rtx_def const*) ../../gcc/rtlanal.c:2956
#7 0x1cefd4b in copyprop_hardreg_forward_1 ../../gcc/regcprop.c:804
#8 0x1cf6191 in cprop_hardreg_bb ../../gcc/regcprop.c:1320
#9 0x1cf6da4 in execute ../../gcc/regcprop.c:1385
#10 0x1baf287 in execute_one_pass(opt_pass*) ../../gcc/passes.c:2487
#11 0x1bafb1d in execute_pass_list_1 ../../gcc/passes.c:2573
#12 0x1bafbd2 in execute_pass_list_1 ../../gcc/passes.c:2574
#13 0x1bafbd2 in execute_pass_list_1 ../../gcc/passes.c:2574
#14 0x1bafc71 in execute_pass_list(function*, opt_pass*)
../../gcc/passes.c:2584
#15 0xe52f0c in cgraph_node::expand() ../../gcc/cgraphunit.c:2198
#16 0xe544d3 in expand_all_functions ../../gcc/cgraphunit.c:2336
#17 0xe56b42 in symbol_table::compile() ../../gcc/cgraphunit.c:2687
#18 0xe575a8 in symbol_table::finalize_compilation_unit()
../../gcc/cgraphunit.c:2865
#19 0x2006fad in compile_file ../../gcc/toplev.c:481
#20 0x200ea9b in do_compile ../../gcc/toplev.c:2205
#21 0x200f0c9 in toplev::main(int, char**) ../../gcc/toplev.c:2340
#22 0x438f452 in main ../../gcc/main.c:39
#23 0x76e80b7a in __libc_start_main ../csu/libc-start.c:308
#24 0x85f579 in _start
(/home/marxin/Programming/gcc2/objdir/gcc/cc1+0x85f579)

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-16 Thread dcb314 at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

--- Comment #3 from David Binderman  ---
I'd be happy to help out with any testing of any speculative patch
for this bug.

I am surprised that more than 64 bits of precision are required.

Would a data type like float or double do the job ? Less precision,
more range.

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2019-04-16 Thread zeccav at gmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

Vittorio Zecca  changed:

   What|Removed |Added

 CC||zeccav at gmail dot com

--- Comment #2 from Vittorio Zecca  ---
Still in trunk 270309.

Optimization at least -O1 needed to reproduce the bug.

/home/vitti/local/gcc-270309-undefined/bin/gcc -S gccerr70.c -O1
../../gcc/gcc/poly-int.h:845:5: runtime error: signed integer overflow:
9223372036854775804 + 4 cannot be represented in type 'long int'

[Bug middle-end/85164] poly-int.h:845:5: runtime error: signed integer overflow

2018-08-13 Thread dcb314 at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85164

David Binderman  changed:

   What|Removed |Added

 CC||rsandifo at gcc dot gnu.org

--- Comment #1 from David Binderman  ---
Still going wrong. Here is another test case:

$ ~/gcc/results.263471.ubsan/bin/gcc -c -O2 bug456.c
../../trunk/gcc/poly-int.h:1941:12: runtime error: negation of
-9223372036854775808 cannot be represented in type 'long int'; cast to an
unsigned type to negate this value to itself
$ more bug456.c
int a;
long b;
void c() { b = -9223372036854775807L - 1 - a; }
$