Re: recomputation and PR 109154

2023-03-31 Thread Andrew Pinski via Gcc-patches
On Thu, Mar 30, 2023 at 1:40 PM Andrew MacLeod via Gcc-patches
 wrote:
>
> I committed it.   ran it again for fun.  sigh.  Looks like its also
> triggering another issue now in g++.dg/warn/Wstringop-overflow-4.C
> where its issuing:

libstdc++v3's 23_containers/vector/bool/allocator/copy.cc fails most
likely in a similar way.
In file included from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/algorithm:60,^M
 from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/stdc++.h:51,^M
 from :^M
In static member function 'static _Up* std::__copy_move<_IsMove, true,
std::random_access_iterator_tag>::__copy_m(_Tp*, _Tp*, _Up*) [with _Tp
= long unsigned int; _Up = long unsigned int; bool _IsMove =
false]',^M
inlined from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool
_IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]'
at 
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:506,^M
inlined from '_OI std::__copy_move_a1(_II, _II, _OI) [with bool
_IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]'
at 
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:533,^M
inlined from '_OI std::__copy_move_a(_II, _II, _OI) [with bool
_IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]'
at 
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:540,^M
inlined from '_OI std::copy(_II, _II, _OI) [with _II = long
unsigned int*; _OI = long unsigned int*]' at
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:633,^M
inlined from 'std::vector::iterator
std::vector::_M_copy_aligned(const_iterator,
const_iterator, iterator) [with _Alloc =
__gnu_test::propagating_allocator]' at
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_bvector.h:1303,^M
inlined from 'void std::vector::_M_insert_aux(iterator, bool) [with _Alloc =
__gnu_test::propagating_allocator]' at
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/vector.tcc:945,^M
inlined from 'void std::vector::push_back(bool)
[with _Alloc = __gnu_test::propagating_allocator]' at
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_bvector.h:1121,^M
inlined from 'void test01()' at
/home/apinski/src/upstream-gcc/gcc/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/copy.cc:33:^M
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:437:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned
int)' writing between 9 and 9223372036854775807 bytes into a region of
size 8 overflows the destination [-Wstringop-overflow=]^M
In file included from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++allocator.h:33,^M
 from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/allocator.h:46,^M
 from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/string:43,^M
 from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bitset:52,^M
 from
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/stdc++.h:52:^M
In member function '_Tp*
std::__new_allocator<_Tp>::allocate(size_type, const void*) [with _Tp
= long unsigned int]',^M
inlined from 'static _Tp*
std::allocator_traits
>::allocate(allocator_type&, size_type) [with _Tp = long unsigned
int]' at 
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/alloc_traits.h:482,^M
inlined from '__gnu_test::uneq_allocator::pointer
__gnu_test::uneq_allocator::allocate(size_type, const
void*) [with Tp = long unsigned int; Alloc = std::allocator]' at
/home/apinski/src/upstream-gcc/gcc/libstdc++-v3/testsuite/util/testsuite_allocator.h:360,^M
inlined from 'static std::allocator_traits<
 >::pointer std::allocator_traits<
 >::allocate(_Alloc&, size_type) [with _Alloc
= __gnu_test::propagating_allocator >]' at
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/alloc_traits.h:333,^M
inlined from 'std::_Bvector_base<_Alloc>::_Bit_pointer
std::_Bvector_base<_Alloc>::_M_allocate(std::size_t) [with _Alloc =
__gnu_test::propagating_allocator]' at
/home/apinski/src/upstream-gcc/gcc/objdir/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_bvector.h:643,^M
inlined from 'void std::vector::_M_insert_aux(iterator, bool) [with _Alloc =
__gnu_test::propagating_allocator]' at

Re: recomputation and PR 109154

2023-03-30 Thread Andrew MacLeod via Gcc-patches
I committed it.   ran it again for fun.  sigh.  Looks like its also 
triggering another issue now in g++.dg/warn/Wstringop-overflow-4.C

where its issuing:

b.C: In function ‘void test_strcpy_new_int16_t(size_t, const size_t*)’:
b.C:76:12: warning: ‘void* __builtin_memcpy(void*, const void*, long 
unsigned int)’ writing 3 bytes into a region of size 0 
[-Wstringop-overflow=]

   76 | strcpy (d, s);  \
  | ~~~^~
b.C:90:3: note: in expansion of macro ‘T’
   90 |   T (S (2), new int16_t[r_imin_imax + 1]); // { dg-bogus "into 
a region of size" "pr106120" { xfail { ilp32 && c++98_only } } }



previously, by VRP2 time we hadn't figured out the edge case, couldn't 
recalculate _29 and iftmp.1_38 was unknown.


   iftmp.1_38 = _29 * 2;
  _40 = operator new [] (iftmp.1_38);
  __builtin_memcpy (_40,   [(void 
*)"0123456789abcdefghijklmnopqrstuvwxyz" + 34B], 3);


Now, by VRP2 we have figured it out...

    _40 = operator new [] (0);
    __builtin_memcpy (_40,   [(void 
*)"0123456789abcdefghijklmnopqrstuvwxyz" + 34B], 3);


And that info is available earlier for the warnings,  just hasn't  been 
explcitly exposed:


Do we want to change the cfail to always? something like:

diff --git a/gcc/testsuite/g++.dg/warn/Wstringop-overflow-4.C 
b/gcc/testsuite/g++.dg/warn/Wstringop-overflow-4.C

index 35fb59e0232..faad5bed074 100644
--- a/gcc/testsuite/g++.dg/warn/Wstringop-overflow-4.C
+++ b/gcc/testsuite/g++.dg/warn/Wstringop-overflow-4.C
@@ -141,7 +141,7 @@ void test_strcpy_new_int16_t (size_t n, const size_t 
vals[])


   int r_imin_imax = SR (INT_MIN, INT_MAX);
   T (S (1), new int16_t[r_imin_imax]);
-  T (S (2), new int16_t[r_imin_imax + 1]); // { dg-bogus "into a region 
of size" "pr106120" { xfail { ilp32 && c++98_only } } }
+  T (S (2), new int16_t[r_imin_imax + 1]); // { dg-bogus "into a region 
of size" "pr106120" { xfail { c++98_only } } }

   T (S (9), new int16_t[r_imin_imax * 2 + 1]);

   int r_0_imax = SR (0, INT_MAX);


Of course, I dont know what this is doing on other arches... perhaps 
wait for the fallout to be complete?


Andrew

On 3/30/23 12:05, Jakub Jelinek wrote:

On Thu, Mar 30, 2023 at 11:58:19AM -0400, Andrew MacLeod wrote:

On 3/30/23 09:41, Jakub Jelinek wrote:

On Wed, Mar 29, 2023 at 01:22:27PM -0400, Andrew MacLeod wrote:

however, as seems to be the case often, better ranges result in, I now get:

FAIL: 23_containers/vector/bool/allocator/copy.cc (test for excess errors)

Our middle-end warnings are just badly designed :(, the better value ranges
are, the more false positives they have.


commit 358d0ca44faf2e20fbacd0f74386308b5ca52cd4
Author: Andrew MacLeod 
Date:   Tue Mar 28 12:16:34 2023 -0400

  Add recursive GORI recompuations with a depth limit.

LGTM for trunk, let's do with the regression incrementally.
Or as Richard mentioned on IRC, one possibility would be to force this
param temporarily to 1 (or whatever matches previous behavior) for the
diagnostic range queries).

You need a ChangeLog entry though...


Attached. I also removed the bogus warning in Walloc-13.c that no longer
happens

So incrementally deal with it.. what? just let it fail?

For today?  Yes.

Ok for trunk.


commit debb8ce1f9b9d5a72d88d0ae90a6b4da5130ff59
Author: Andrew MacLeod 
Date:   Tue Mar 28 12:16:34 2023 -0400

 Add recursive GORI recompuations with a depth limit.
 
 PR tree-optimization/109154

 gcc/
 * gimple-range-gori.cc (gori_compute::may_recompute_p): Add depth 
limit.
 * gimple-range-gori.h (may_recompute_p): Add depth param.
 * params.opt (ranger-recompute-depth): New param.
 
 gcc/testsuite/

 * gcc.dg/Walloca-13.c: Remove bogus warning that is now fixed.

Jakub





Re: recomputation and PR 109154

2023-03-30 Thread Jakub Jelinek via Gcc-patches
On Thu, Mar 30, 2023 at 11:58:19AM -0400, Andrew MacLeod wrote:
> 
> On 3/30/23 09:41, Jakub Jelinek wrote:
> > On Wed, Mar 29, 2023 at 01:22:27PM -0400, Andrew MacLeod wrote:
> > > however, as seems to be the case often, better ranges result in, I now 
> > > get:
> > > 
> > > FAIL: 23_containers/vector/bool/allocator/copy.cc (test for excess errors)
> > Our middle-end warnings are just badly designed :(, the better value ranges
> > are, the more false positives they have.
> > 
> > > commit 358d0ca44faf2e20fbacd0f74386308b5ca52cd4
> > > Author: Andrew MacLeod 
> > > Date:   Tue Mar 28 12:16:34 2023 -0400
> > > 
> > >  Add recursive GORI recompuations with a depth limit.
> > LGTM for trunk, let's do with the regression incrementally.
> > Or as Richard mentioned on IRC, one possibility would be to force this
> > param temporarily to 1 (or whatever matches previous behavior) for the
> > diagnostic range queries).
> > 
> > You need a ChangeLog entry though...
> > 
> Attached. I also removed the bogus warning in Walloc-13.c that no longer
> happens
> 
> So incrementally deal with it.. what? just let it fail?

For today?  Yes.

Ok for trunk.

> commit debb8ce1f9b9d5a72d88d0ae90a6b4da5130ff59
> Author: Andrew MacLeod 
> Date:   Tue Mar 28 12:16:34 2023 -0400
> 
> Add recursive GORI recompuations with a depth limit.
> 
> PR tree-optimization/109154
> gcc/
> * gimple-range-gori.cc (gori_compute::may_recompute_p): Add depth 
> limit.
> * gimple-range-gori.h (may_recompute_p): Add depth param.
> * params.opt (ranger-recompute-depth): New param.
> 
> gcc/testsuite/
> * gcc.dg/Walloca-13.c: Remove bogus warning that is now fixed.

Jakub



Re: recomputation and PR 109154

2023-03-30 Thread Andrew MacLeod via Gcc-patches


On 3/30/23 09:41, Jakub Jelinek wrote:

On Wed, Mar 29, 2023 at 01:22:27PM -0400, Andrew MacLeod wrote:

however, as seems to be the case often, better ranges result in, I now get:

FAIL: 23_containers/vector/bool/allocator/copy.cc (test for excess errors)

Our middle-end warnings are just badly designed :(, the better value ranges
are, the more false positives they have.


commit 358d0ca44faf2e20fbacd0f74386308b5ca52cd4
Author: Andrew MacLeod 
Date:   Tue Mar 28 12:16:34 2023 -0400

 Add recursive GORI recompuations with a depth limit.

LGTM for trunk, let's do with the regression incrementally.
Or as Richard mentioned on IRC, one possibility would be to force this
param temporarily to 1 (or whatever matches previous behavior) for the
diagnostic range queries).

You need a ChangeLog entry though...

Attached. I also removed the bogus warning in Walloc-13.c that no longer 
happens


So incrementally deal with it.. what? just let it fail?

Andrew
commit debb8ce1f9b9d5a72d88d0ae90a6b4da5130ff59
Author: Andrew MacLeod 
Date:   Tue Mar 28 12:16:34 2023 -0400

Add recursive GORI recompuations with a depth limit.

PR tree-optimization/109154
gcc/
* gimple-range-gori.cc (gori_compute::may_recompute_p): Add depth limit.
* gimple-range-gori.h (may_recompute_p): Add depth param.
* params.opt (ranger-recompute-depth): New param.

gcc/testsuite/
* gcc.dg/Walloca-13.c: Remove bogus warning that is now fixed.

diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index 6e8dfa85ca8..5f4313b27dd 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -1308,7 +1308,7 @@ gori_compute::compute_operand1_and_operand2_range (vrange ,
 // direct dependent is exported, it may also change the computed value of NAME.
 
 bool
-gori_compute::may_recompute_p (tree name, basic_block bb)
+gori_compute::may_recompute_p (tree name, basic_block bb, int depth)
 {
   tree dep1 = depend1 (name);
   tree dep2 = depend2 (name);
@@ -1322,22 +1322,36 @@ gori_compute::may_recompute_p (tree name, basic_block bb)
   if (is_a (s) || gimple_has_side_effects (s))
 return false;
 
-  // If edge is specified, check if NAME can be recalculated on that edge.
-  if (bb)
-return ((is_export_p (dep1, bb))
-	|| (dep2 && is_export_p (dep2, bb)));
+  if (!dep2)
+{
+  // -1 indicates a default param, convert it to the real default.
+  if (depth == -1)
+	{
+	  depth = (int)param_ranger_recompute_depth;
+	  gcc_checking_assert (depth >= 1);
+	}
 
-  return (is_export_p (dep1)) || (dep2 && is_export_p (dep2));
+  bool res = (bb ? is_export_p (dep1, bb) : is_export_p (dep1));
+  if (res || depth <= 1)
+	return res;
+  // Check another level of recomputation.
+  return may_recompute_p (dep1, bb, --depth);
+}
+  // Two dependencies terminate the depth of the search.
+  if (bb)
+return is_export_p (dep1, bb) || is_export_p (dep2, bb);
+  else
+return is_export_p (dep1) || is_export_p (dep2);
 }
 
 // Return TRUE if NAME can be recomputed on edge E.  If any direct dependent
 // is exported on edge E, it may change the computed value of NAME.
 
 bool
-gori_compute::may_recompute_p (tree name, edge e)
+gori_compute::may_recompute_p (tree name, edge e, int depth)
 {
   gcc_checking_assert (e);
-  return may_recompute_p (name, e->src);
+  return may_recompute_p (name, e->src, depth);
 }
 
 
diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h
index 0fc90ec8a18..3ea4b45595b 100644
--- a/gcc/gimple-range-gori.h
+++ b/gcc/gimple-range-gori.h
@@ -172,8 +172,8 @@ private:
   bool refine_using_relation (tree op1, vrange _range,
 			  tree op2, vrange _range,
 			  fur_source , relation_kind k);
-  bool may_recompute_p (tree name, edge e);
-  bool may_recompute_p (tree name, basic_block bb = NULL);
+  bool may_recompute_p (tree name, edge e, int depth = -1);
+  bool may_recompute_p (tree name, basic_block bb = NULL, int depth = -1);
   bool compute_operand_range_switch (vrange , gswitch *s, const vrange ,
  tree name, fur_source );
   bool compute_operand1_range (vrange , gimple_range_op_handler ,
diff --git a/gcc/params.opt b/gcc/params.opt
index 2329d150ef0..b2ec436546c 100644
--- a/gcc/params.opt
+++ b/gcc/params.opt
@@ -900,6 +900,11 @@ Common Joined UInteger Var(param_ranger_logical_depth) Init(6) IntegerRange(1, 9
 Maximum depth of logical expression evaluation ranger will look through when
 evaluating outgoing edge ranges.
 
+-param=ranger-recompute-depth=
+Common Joined UInteger Var(param_ranger_recompute_depth) Init(5) IntegerRange(1, 100) Param Optimization
+Maximum depth of instruction chains to consider for recomputation in the
+outgoing range calculator.
+
 -param=relation-block-limit=
 Common Joined UInteger Var(param_relation_block_limit) Init(200) IntegerRange(0, ) Param Optimization
 Maximum number of relations the oracle will register in a basic block.

Re: recomputation and PR 109154

2023-03-30 Thread Jakub Jelinek via Gcc-patches
On Wed, Mar 29, 2023 at 01:22:27PM -0400, Andrew MacLeod wrote:
> however, as seems to be the case often, better ranges result in, I now get:
> 
> FAIL: 23_containers/vector/bool/allocator/copy.cc (test for excess errors)

Our middle-end warnings are just badly designed :(, the better value ranges
are, the more false positives they have.

> commit 358d0ca44faf2e20fbacd0f74386308b5ca52cd4
> Author: Andrew MacLeod 
> Date:   Tue Mar 28 12:16:34 2023 -0400
> 
> Add recursive GORI recompuations with a depth limit.

LGTM for trunk, let's do with the regression incrementally.
Or as Richard mentioned on IRC, one possibility would be to force this
param temporarily to 1 (or whatever matches previous behavior) for the
diagnostic range queries).

You need a ChangeLog entry though...

> diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
> index 6e8dfa85ca8..5f4313b27dd 100644
> --- a/gcc/gimple-range-gori.cc
> +++ b/gcc/gimple-range-gori.cc
> @@ -1308,7 +1308,7 @@ gori_compute::compute_operand1_and_operand2_range 
> (vrange ,
>  // direct dependent is exported, it may also change the computed value of 
> NAME.
>  
>  bool
> -gori_compute::may_recompute_p (tree name, basic_block bb)
> +gori_compute::may_recompute_p (tree name, basic_block bb, int depth)
>  {
>tree dep1 = depend1 (name);
>tree dep2 = depend2 (name);
> @@ -1322,22 +1322,36 @@ gori_compute::may_recompute_p (tree name, basic_block 
> bb)
>if (is_a (s) || gimple_has_side_effects (s))
>  return false;
>  
> -  // If edge is specified, check if NAME can be recalculated on that edge.
> -  if (bb)
> -return ((is_export_p (dep1, bb))
> - || (dep2 && is_export_p (dep2, bb)));
> +  if (!dep2)
> +{
> +  // -1 indicates a default param, convert it to the real default.
> +  if (depth == -1)
> + {
> +   depth = (int)param_ranger_recompute_depth;
> +   gcc_checking_assert (depth >= 1);
> + }
>  
> -  return (is_export_p (dep1)) || (dep2 && is_export_p (dep2));
> +  bool res = (bb ? is_export_p (dep1, bb) : is_export_p (dep1));
> +  if (res || depth <= 1)
> + return res;
> +  // Check another level of recomputation.
> +  return may_recompute_p (dep1, bb, --depth);
> +}
> +  // Two dependencies terminate the depth of the search.
> +  if (bb)
> +return is_export_p (dep1, bb) || is_export_p (dep2, bb);
> +  else
> +return is_export_p (dep1) || is_export_p (dep2);
>  }
>  
>  // Return TRUE if NAME can be recomputed on edge E.  If any direct dependent
>  // is exported on edge E, it may change the computed value of NAME.
>  
>  bool
> -gori_compute::may_recompute_p (tree name, edge e)
> +gori_compute::may_recompute_p (tree name, edge e, int depth)
>  {
>gcc_checking_assert (e);
> -  return may_recompute_p (name, e->src);
> +  return may_recompute_p (name, e->src, depth);
>  }
>  
>  
> diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h
> index 0fc90ec8a18..3ea4b45595b 100644
> --- a/gcc/gimple-range-gori.h
> +++ b/gcc/gimple-range-gori.h
> @@ -172,8 +172,8 @@ private:
>bool refine_using_relation (tree op1, vrange _range,
> tree op2, vrange _range,
> fur_source , relation_kind k);
> -  bool may_recompute_p (tree name, edge e);
> -  bool may_recompute_p (tree name, basic_block bb = NULL);
> +  bool may_recompute_p (tree name, edge e, int depth = -1);
> +  bool may_recompute_p (tree name, basic_block bb = NULL, int depth = -1);
>bool compute_operand_range_switch (vrange , gswitch *s, const vrange 
> ,
>tree name, fur_source );
>bool compute_operand1_range (vrange , gimple_range_op_handler ,
> diff --git a/gcc/params.opt b/gcc/params.opt
> index 2329d150ef0..b2ec436546c 100644
> --- a/gcc/params.opt
> +++ b/gcc/params.opt
> @@ -900,6 +900,11 @@ Common Joined UInteger Var(param_ranger_logical_depth) 
> Init(6) IntegerRange(1, 9
>  Maximum depth of logical expression evaluation ranger will look through when
>  evaluating outgoing edge ranges.
>  
> +-param=ranger-recompute-depth=
> +Common Joined UInteger Var(param_ranger_recompute_depth) Init(5) 
> IntegerRange(1, 100) Param Optimization
> +Maximum depth of instruction chains to consider for recomputation in the
> +outgoing range calculator.
> +
>  -param=relation-block-limit=
>  Common Joined UInteger Var(param_relation_block_limit) Init(200) 
> IntegerRange(0, ) Param Optimization
>  Maximum number of relations the oracle will register in a basic block.


Jakub



Re: recomputation and PR 109154

2023-03-30 Thread Richard Biener via Gcc-patches
On Wed, Mar 29, 2023 at 7:22 PM Andrew MacLeod  wrote:
>
> The patch, or a slight variation (attached), in the PR allows us to
> generate better ranges be recomputing longer instruction sequences on
> outgoing edges.
>
> This in fact also fixes
> XPASS: gcc.dg/Walloca-13.c  (test for bogus messages, line 11)
>
> [local count: 1073741824]:
>_1 = p_5(D) - q_6(D);
>_2 = _1 /[ex] 4;
>n_7 = (long unsigned int) _2;
>_11 = (long unsigned int) _1;
>if (_11 <= 396)
>  goto ; [33.00%]
>else
>  goto ; [67.00%]
>
> [local count: 354334800]:
>_3 = __builtin_alloca (n_7);
>
> Where _2 was recomputed before, but n_7 was not.  Now it is, and we
> correctly do not issue the warning any more.  awesome.,
>
> however, as seems to be the case often, better ranges result in, I now get:
>
> FAIL: 23_containers/vector/bool/allocator/copy.cc (test for excess errors)
>
> because we now generate:
>
> /opt/notnfs/amacleod/master/build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:437:
> warning: ‘void* __builtin_memmove(void*, const void*, long unsigned
> int)’ writing between 9 and 9223372036854775807 bytes into a region of
> size 8 overflows the destination [-Wstringop-overflow=]
>
>   I see:
> 
>   
>  _216 = operator new (8);
>
> _216 : [irange] long unsigned int * [1, +INF]
>..
>
>   [local count: 86938296]:
>  D.245552 ={v} {CLOBBER(eol)};
>  _74 = v1.D.217578._M_impl.D.217043._M_start.D.58619._M_p;
>  _638 = (long int) _74;
>  _261 = -_638;
>  _383 = (long unsigned int) _261;
>  if (_638 < -8)
>goto ; [90.00%]
>  else
>goto ; [10.00%]
>
> _261 : [irange] long int [-9223372036854775807, +INF]
> _383 : [irange] long unsigned int [0,
> 9223372036854775807][9223372036854775809, +INF]
> 8->12  (T) _74 :[irange] _Bit_type * [1, +INF]
> 8->12  (T) _261 :   [irange] long int [9, +INF] NONZERO
> 0x7fff
> 8->12  (T) _383 :   [irange] long unsigned int [9,
> 9223372036854775807] NONZERO 0x7fff
> 8->12  (T) _638 :   [irange] long int [-INF, -9]
>
> === BB 12 
> _74 [irange] _Bit_type * [9223372036854775808, 18446744073709551607]
> _383[irange] long unsigned int [9, 9223372036854775807] NONZERO
> 0x7fff
>   [local count: 78244465]:
>  __builtin_memmove (_216, _74, _383);
>
>
>
> The change is that we now recompute _383 which we didnt before. so we
> are seeing memmove being called on what is effectively:
> memmove (operator new (8), _74, [9, 9223372036854775807])
> And thus the warning.
>
> IS this one of the warnings that has been causing issues?  and now Im
> triggering it again?

Yeah, we see these kind of diagnostics on code that's supposed to be
not reachable but we don't figure that out (missed-optimization) or the
code is written in a way that doesn't make this obvious.

>
> Back at fixup_cfg3 time, it looks like:
>
>   _261 = __last$D58797$_M_p_245 - _247;
>_262 = _261 > 8;
>_263 = (long int) _262;
>_264 = __builtin_expect (_263, 1);
>if (_264 != 0)
>  goto ; [90.00%]
>else
>  goto ; [10.00%]
> ..
> [local count: 78244465]:
>_265 = (long unsigned int) _261;
>__builtin_memmove (_246, _247, _265);
>
> So the builtin expect certainly implies it is expecting to have a value > 8
>
> Early on the code looks like:
> _1 = __last_10(D) - __first_11(D);
>_Num_12 = _1 /[ex] 8;
>_2 = _Num_12 > 1;
>_3 = (long int) _2;
>_4 = __builtin_expect (_3, 1);
>if (_4 != 0)
>  goto ; [INV]
>else
>  goto ; [INV]
>
> :
>_Num.28_5 = (long unsigned int) _Num_12;
>_6 = _Num.28_5 * 8;
>__builtin_memmove (__result_14(D), __first_11(D), _6);
>
>
> SO it does still do basically the same thing.
>
> Im not sure whether this is pointing out something real or another false
> positive...
>
> Andrew