Richard,

Here is more on the actual failure.

>From the pre pass dump:

:
Inserted _975 = (struct node.reorg.reorder *) dedangled_865;
Replaced bea_43->tail with _975 in dedangled_864 = bea_43->tail;



EMERGENCY DUMP:

void master.constprop ()
{
  :
  unsigned long _974;
  struct node.reorg.reorder * _975;

  :
  <bb 36> [local count: 4422246]:
  _58 = MEM[(int64_t *)&net + 608B];
  _59 = _58 + 1;
  MEM[(int64_t *)&net + 608B] = _59;
  dedangled_865 = bea_43->tail;
  dedangled_863 = bea_43->head;
  _975 = (struct node.reorg.reorder *) dedangled_865;
  dedangled_864 = bea_43->tail;
  dedangled_866 = bea_43->head;
  if (red_cost_of_bea_42 > 0)
    goto <bb 166>; [59.00%]
  else
    goto <bb 37>; [41.00%]
  :
----------
In tree-ssa-sccvn.c at about line 6000 or so there is
this sequence:

  if (!useless_type_conversion_p (TREE_TYPE (lhs),
                                  TREE_TYPE (sprime)))
    {
      /* We preserve conversions to but not from function or method
         types.  This asymmetry makes it necessary to re-instantiate
         conversions here.  */
      if (POINTER_TYPE_P (TREE_TYPE (lhs))
           && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (lhs))))
        sprime = fold_convert (TREE_TYPE (lhs), sprime);
      else
        gcc_unreachable ();
    }

We reach the gcc_unreachable because:

lhs = dedangled_864, TREE_TYPE(lhs) = unsigned long
sprime = _975, TREE_TYPE(sprime) = struct node.reorg.reorder *

I've got to ask why does the _975 have that type?
The ssa var dedangled_865 is an unsigned long.
If I knew why this happens then, hopefully, I can adjust
the GIMPLE I create to avoid this situation...

Question, would have including all references to denangled_865
in the pre pass dump helped you answer this? By the way, I couldn't
find a spot where dedangled_865 or any of its phi related uses
(a use of x where x <- phi<... denanged_865..> and so on recursively)
was converted to struct node.reorg.reorder *.

Gary


________________________________
From: Richard Biener <richard.guent...@gmail.com>
Sent: Wednesday, July 28, 2021 3:40 AM
To: Gary Oblock <g...@amperecomputing.com>
Cc: gcc@gcc.gnu.org <gcc@gcc.gnu.org>
Subject: Re: A value number issue

[EXTERNAL EMAIL NOTICE: This email originated from an external sender. Please 
be mindful of safe email handling and proprietary information protection 
practices.]


On Fri, Jul 23, 2021 at 3:40 AM Gary Oblock <g...@amperecomputing.com> wrote:
>
> Richard,
>
> OK, all that I've gotten so far out of the dump file is
> that the name of "_920" is just something sccvn concocted
> and wasn't something I accidentally caused.
>
> That still leaves me with the question of what is going on.
>
> Here's all the interesting bits of the dumpfile concerning
> dedangled_864:
>
> :
> dedangled_865 = *bea_43 + 64
> dedangled_863 = *bea_43 + 128
> dedangled_864 = *bea_43 + 64
> dedangled_866 = *bea_43 + 128
> dedangled_867 = dedangled_863
> dedangled_867 = dedangled_865
> dedangled_868 = dedangled_864
> dedangled_868 = dedangled_866
> :
> Equivalence classes for indirect node id 160 "dedangled_865": pointer 84, 
> location 0
> Equivalence classes for indirect node id 161 "dedangled_863": pointer 85, 
> location 0
> Equivalence classes for indirect node id 162 "dedangled_864": pointer 86, 
> location 0
> :
> dedangled_865 = { ESCAPED NONLOCAL }
> dedangled_863 = { ESCAPED NONLOCAL }
> dedangled_864 = { ESCAPED NONLOCAL }
> dedangled_866 = { ESCAPED NONLOCAL }
> dedangled_867 = { ESCAPED NONLOCAL }
> dedangled_868 = { ESCAPED NONLOCAL }
> :
> Value numbering store MEM[(int64_t *)&net + 608B] to _59
> Setting value number of .MEM_123 to .MEM_123 (changed)
> Value numbering stmt = dedangled_865 = bea_43->tail;
> Setting value number of dedangled_865 to dedangled_865 (changed)
> Making available beyond BB36 dedangled_865 for value dedangled_865
> Value numbering stmt = dedangled_863 = bea_43->head;
> Setting value number of dedangled_863 to dedangled_863 (changed)
> Making available beyond BB36 dedangled_863 for value dedangled_863
> Value numbering stmt = dedangled_864 = bea_43->tail;
> Inserting name _920 for expression (struct node.reorg.reorder *) dedangled_865

this means that the earlier dedangled_865 = bea_43->tail; somehow did not
produce a value that was considered OK but it was close enough so VN
remembers the expression (struct node.reorg.reorder *) dedangled_865
as known result, using _920 as value.  _920 should be then inserted during
elimination.

I'm not sure what your actual problem is - you can see in eliminate_stmt
how we deal with such values:

          /* If there is no existing usable leader but SCCVN thinks
             it has an expression it wants to use as replacement,
             insert that.  */
          tree val = VN_INFO (lhs)->valnum;
          vn_ssa_aux_t vn_info;
          if (val != VN_TOP
              && TREE_CODE (val) == SSA_NAME
              && (vn_info = VN_INFO (val), true)
              && vn_info->needs_insertion
              && vn_info->expr != NULL
              && (sprime = eliminate_insert (b, gsi, val)) != NULL_TREE)
            eliminate_push_avail (b, sprime);


> Setting value number of dedangled_864 to _920 (changed)
> Making available beyond BB36 dedangled_864 for value _920
> Value numbering stmt = dedangled_866 = bea_43->head;
> :
> Value numbering stmt = dedangled_868 = PHI <dedangled_864(166), 
> dedangled_866(37)>
> Setting value number of dedangled_868 to dedangled_868 (changed)
> :
> Setting value number of dedangled_363 to _920 (changed)
> dedangled_864 is available for _920
> Value numbering stmt = _896 = dedangled_363 == dedangled_873;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _881 = dedangled_363 == dedangled_875;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _880 = _881 & _891;
> dedangled_864 is available for _920
> dedangled_864 is available for _920
> dedangled_864 is available for _920
> dedangled_864 is available for _920
> :
> Setting value number of dedangled_313 to _920 (changed)
> dedangled_864 is available for _920
> Value numbering stmt = _904 = dedangled_313 == dedangled_873;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _442 = _11 & _904;
> dedangled_864 is available for _920
> Match-and-simplified _11 & _904 to _904
> :
> Value numbering stmt = if (_442 != 0)
> dedangled_864 is available for _920
> :
> Making available beyond BB36 dedangled_863 for value dedangled_863
> Value numbering stmt = dedangled_864 = bea_43->tail;
> Setting value number of dedangled_864 to _920
> Making available beyond BB36 dedangled_864 for value _920
> Value numbering stmt = dedangled_866 = bea_43->head;
> :
> Making available beyond BB38 dedangled_867 for value dedangled_867
> Value numbering stmt = dedangled_868 = PHI <dedangled_864(166), 
> dedangled_866(37)>
> Setting value number of dedangled_868 to dedangled_868
> :
> Setting value number of dedangled_363 to _920
> dedangled_864 is available for _920
> Value numbering stmt = _896 = dedangled_363 == dedangled_873;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _881 = dedangled_363 == dedangled_875;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> (a bunch more of the "dedangled_864 is available for _920")
> :
> exp_gen[36] := { red_cost_of_bea_42 (0019), bea_43 (0020), 
> {mem_ref<608B>,addr_expr<&net>}@.MEM_99 (0027), {plus_expr,_58,1} (0028), 
> {component_ref<tail>,mem_ref<0B>,bea_43}@.MEM_387 (0408), 
> {component_ref<head>,mem_ref<0B>,bea_43}@.MEM_387 (0407) }
> phi_gen[36] := {  }
> tmp_gen[36] := { _58 (0027), _59 (0028), dedangled_865 (0408), dedangled_863 
> (0407), dedangled_864 (0448), dedangled_866 (0229) }
> avail_out[36] := { xchange_449(D) (0232), arcs_1 (0003), stop_arcs_2 (0004), 
> _4 (0006), _5 (0007), i_646 (0340), _7 (0008), _8 (0009), _9 (0010), i_10 
> (0011), _212 (0112), xchange_900 (0431), end_arc_385 (0180), _14 (0013), _19 
> (0015), field_arry_addr_112 (0045), i_665 (0352), next_666 (0353), _163 
> (0081), next_218 (0113), _173 (0083), _178 (0086), _179 (0087), _176 (0084), 
> end_arc_443 (0226), end_arc_444 (0227), end_arc_445 (0228), _222 (0238), _223 
> (0115), _224 (0116), _225 (0117), _226 (0118), _227 (0119), _228 (0120), _229 
> (0121), _231 (0123), _21 (0016), red_cost_of_bea_42 (0019), bea_43 (0020), 
> i_649 (0343), _45 (0021), _46 (0022), _47 (0023), _58 (0027), _59 (0028), 
> dedangled_865 (0408), dedangled_863 (0407), dedangled_864 (0448), 
> dedangled_866 (0229) }
> exp_gen[37] := {  }
> phi_gen[37] := {  }
> tmp_gen[37] := {  }
> avail_out[37] := { xchange_449(D) (0232), arcs_1 (0003), stop_arcs_2 (0004), 
> _4 (0006), _5 (0007), i_646 (0340), _7 (0008), _8 (0009), _9 (0010), i_10 
> (0011), _212 (0112), xchange_900 (0431), end_arc_385 (0180), _14 (0013), _19 
> (0015), field_arry_addr_112 (0045), i_665 (0352), next_666 (0353), _163 
> (0081), next_218 (0113), _173 (0083), _178 (0086), _179 (0087), _176 (0084), 
> end_arc_443 (0226), end_arc_444 (0227), end_arc_445 (0228), _222 (0238), _223 
> (0115), _224 (0116), _225 (0117), _226 (0118), _227 (0119), _228 (0120), _229 
> (0121), _231 (0123), _21 (0016), red_cost_of_bea_42 (0019), bea_43 (0020), 
> i_649 (0343), _45 (0021), _46 (0022), _47 (0023), _58 (0027), _59 (0028), 
> dedangled_865 (0408), dedangled_863 (0407), dedangled_864 (0448), 
> dedangled_866 (0229) }
> exp_gen[38] := { dedangled_867 (0409), dedangled_868 (0410) }
> phi_gen[38] := { dedangled_867 (0409), dedangled_868 (0410) }
> tmp_gen[38] := {  }
> avail_out[38] := { xchange_449(D) (0232), arcs_1 (0003), stop_arcs_2 (0004), 
> _4 (0006), _5 (0007), i_646 (0340), _7 (0008), _8 (0009), _9 (0010), i_10 
> (0011), _212 (0112), xchange_900 (0431), end_arc_385 (0180), _14 (0013), _19 
> (0015), field_arry_addr_112 (0045), i_665 (0352), next_666 (0353), _163 
> (0081), next_218 (0113), _173 (0083), _178 (0086), _179 (0087), _176 (0084), 
> end_arc_443 (0226), end_arc_444 (0227), end_arc_445 (0228), _222 (0238), _223 
> (0115), _224 (0116), _225 (0117), _226 (0118), _227 (0119), _228 (0120), _229 
> (0121), _231 (0123), _21 (0016), red_cost_of_bea_42 (0019), bea_43 (0020), 
> i_649 (0343), _45 (0021), _46 (0022), _47 (0023), _58 (0027), _59 (0028), 
> dedangled_865 (0408), dedangled_863 (0407), dedangled_864 (0448), 
> dedangled_866 (0229), dedangled_867 (0409), dedangled_868 (0410) }
> (a presence in the avail_out for rest until it reaches a point where is in 
> none of them)
> :
> ANTIC_OUT[166] := { {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) (0112), bea_43 
> (0020), dedangled_863 (0407), dedangled_864 (0448) }
> [changed] ANTIC_IN[166] := { {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) 
> (0112), bea_43 (0020), dedangled_863 (0407), dedangled_864 (0448) }
> S[166] := { {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) (0112), bea_43 (0020), 
> dedangled_863 (0407), dedangled_864 (0448) }
> :
> PA_OUT[36] := { stop_arcs_2 (0004), _4 (0006), 
> {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) (0112), xchange_900 (0431), 
> {mem_ref<0B>,addr_expr<&opt_basket>}@.MEM_104(D) (0015), 
> {mem_ref<0B>,addr_expr<&full_group_end_arc>}@.MEM_104(D) (0083), end_arc_445 
> (0228), {mem_ref<0B>,addr_expr<&perm_p>}@.MEM_104(D) (0016), 
> red_cost_of_bea_42 (0019), bea_43 (0020), dedangled_865 (0408), dedangled_863 
> (0407), dedangled_864 (0448), dedangled_866 (0229), 
> {mem_ref<616B>,addr_expr<&net>}@.MEM_99 (0442), {plus_expr,_913,1} (0438), 
> {component_ref<orientation>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0258), 
> {component_ref<flow>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0274), 
> {component_ref<pred>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0265), 
> {component_ref<depth>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0049), 
> {component_ref<basic_arc>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0299), {component_ref<feas_tol>,mem_ref<0B>,addr_expr<&net>}@.MEM_387 
> (0222), {abs_expr,red_cost_of_bea_42} (0134), 
> {component_ref<potential>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0306), 
> {component_ref<child>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0312), 
> {component_ref<sibling>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0327), 
> {component_ref<sibling_prev>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0339), {pointer_plus_expr,field_arry_addr_581,-8} (0921), 
> {bit_xor_expr,xchange_900,1} (0923), 
> {pointer_plus_expr,field_arry_addr_591,-8} (0924), 
> {pointer_plus_expr,field_arry_addr_601,-8} (0926) }
> :
> Replaced bea_43->tail with _975 in dedangled_864 = bea_43->tail;
> :
>   long int pretmp_859;
>   struct node * * field_addr_860;
>   struct node * field_val_temp_861;
>   unsigned long dedangled_863;
>   unsigned long dedangled_864;
>   unsigned long dedangled_865;
>   unsigned long dedangled_866;
>   :
>     <bb 36> [local count: 4422246]:
>   _58 = MEM[(int64_t *)&net + 608B];
>   _59 = _58 + 1;
>   MEM[(int64_t *)&net + 608B] = _59;
>   dedangled_865 = bea_43->tail;
>   dedangled_863 = bea_43->head;
>   _975 = (struct node.reorg.reorder *) dedangled_865;
>   dedangled_864 = bea_43->tail;
>   dedangled_866 = bea_43->head;
>   if (red_cost_of_bea_42 > 0)
>     goto <bb 166>; [59.00%]
>   else
>     goto <bb 37>; [41.00%]
>
>   <bb 166> [local count: 2609125]:
>   goto <bb 38>; [100.00%]
>
>   <bb 37> [local count: 1813121]:
>
>   <bb 38> [local count: 4422246]:
>   # dedangled_867 = PHI <dedangled_863(166), dedangled_865(37)>
>   # dedangled_868 = PHI <dedangled_864(166), dedangled_866(37)>
>   if (dedangled_867 != dedangled_868)
>     goto <bb 126>; [89.00%]
>   else
>     goto <bb 55>; [11.00%]
> =================================================
> I was pretty arbitrary here about what I extracted from the
> dump file but it's 33MB in size.
>
> I'm still thinking it's something dumb that I did
> when I created "dedangled_864" but I can't spot it from
> the dump. Does anyone have any ideas? Note, before I
> looked at the dump I at least had a half-baked idea
> of what to try but now this leaves me without a clue
> as to what to do (I'm going to read up on the original
> algorithm.)
>
> Thanks,
>
> GaryRichard,
>
> OK, all that I've gotten so far out of the dump file is
> that the name of "_920" is just something sccvn concocted
> and wasn't something I accidentaly caused.
>
> That still leaves me with the question of what is going on.
>
> Here's all the interesting bits of the dumpfile concerning
> dedangled_864:
>
> :
> dedangled_865 = *bea_43 + 64
> dedangled_863 = *bea_43 + 128
> dedangled_864 = *bea_43 + 64
> dedangled_866 = *bea_43 + 128
> dedangled_867 = dedangled_863
> dedangled_867 = dedangled_865
> dedangled_868 = dedangled_864
> dedangled_868 = dedangled_866
> :
> Equivalence classes for indirect node id 160 "dedangled_865": pointer 84, 
> location 0
> Equivalence classes for indirect node id 161 "dedangled_863": pointer 85, 
> location 0
> Equivalence classes for indirect node id 162 "dedangled_864": pointer 86, 
> location 0
> :
> dedangled_865 = { ESCAPED NONLOCAL }
> dedangled_863 = { ESCAPED NONLOCAL }
> dedangled_864 = { ESCAPED NONLOCAL }
> dedangled_866 = { ESCAPED NONLOCAL }
> dedangled_867 = { ESCAPED NONLOCAL }
> dedangled_868 = { ESCAPED NONLOCAL }
> :
> Value numbering store MEM[(int64_t *)&net + 608B] to _59
> Setting value number of .MEM_123 to .MEM_123 (changed)
> Value numbering stmt = dedangled_865 = bea_43->tail;
> Setting value number of dedangled_865 to dedangled_865 (changed)
> Making available beyond BB36 dedangled_865 for value dedangled_865
> Value numbering stmt = dedangled_863 = bea_43->head;
> Setting value number of dedangled_863 to dedangled_863 (changed)
> Making available beyond BB36 dedangled_863 for value dedangled_863
> Value numbering stmt = dedangled_864 = bea_43->tail;
> Inserting name _920 for expression (struct node.reorg.reorder *) dedangled_865
> Setting value number of dedangled_864 to _920 (changed)
> Making available beyond BB36 dedangled_864 for value _920
> Value numbering stmt = dedangled_866 = bea_43->head;
> :
> Value numbering stmt = dedangled_868 = PHI <dedangled_864(166), 
> dedangled_866(37)>
> Setting value number of dedangled_868 to dedangled_868 (changed)
> :
> Setting value number of dedangled_363 to _920 (changed)
> dedangled_864 is available for _920
> Value numbering stmt = _896 = dedangled_363 == dedangled_873;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _881 = dedangled_363 == dedangled_875;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _880 = _881 & _891;
> dedangled_864 is available for _920
> dedangled_864 is available for _920
> dedangled_864 is available for _920
> dedangled_864 is available for _920
> :
> Setting value number of dedangled_313 to _920 (changed)
> dedangled_864 is available for _920
> Value numbering stmt = _904 = dedangled_313 == dedangled_873;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _442 = _11 & _904;
> dedangled_864 is available for _920
> Match-and-simplified _11 & _904 to _904
> :
> Value numbering stmt = if (_442 != 0)
> dedangled_864 is available for _920
> :
> Making available beyond BB36 dedangled_863 for value dedangled_863
> Value numbering stmt = dedangled_864 = bea_43->tail;
> Setting value number of dedangled_864 to _920
> Making available beyond BB36 dedangled_864 for value _920
> Value numbering stmt = dedangled_866 = bea_43->head;
> :
> Making available beyond BB38 dedangled_867 for value dedangled_867
> Value numbering stmt = dedangled_868 = PHI <dedangled_864(166), 
> dedangled_866(37)>
> Setting value number of dedangled_868 to dedangled_868
> :
> Setting value number of dedangled_363 to _920
> dedangled_864 is available for _920
> Value numbering stmt = _896 = dedangled_363 == dedangled_873;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> Value numbering stmt = _881 = dedangled_363 == dedangled_875;
> dedangled_864 is available for _920
> (the last line repeats many times)
> :
> (a bunch more of the "dedangled_864 is available for _920")
> :
> exp_gen[36] := { red_cost_of_bea_42 (0019), bea_43 (0020), 
> {mem_ref<608B>,addr_expr<&net>}@.MEM_99 (0027), {plus_expr,_58,1} (0028), 
> {component_ref<tail>,mem_ref<0B>,bea_43}@.MEM_387 (0408), 
> {component_ref<head>,mem_ref<0B>,bea_43}@.MEM_387 (0407) }
> phi_gen[36] := {  }
> tmp_gen[36] := { _58 (0027), _59 (0028), dedangled_865 (0408), dedangled_863 
> (0407), dedangled_864 (0448), dedangled_866 (0229) }
> avail_out[36] := { xchange_449(D) (0232), arcs_1 (0003), stop_arcs_2 (0004), 
> _4 (0006), _5 (0007), i_646 (0340), _7 (0008), _8 (0009), _9 (0010), i_10 
> (0011), _212 (0112), xchange_900 (0431), end_arc_385 (0180), _14 (0013), _19 
> (0015), field_arry_addr_112 (0045), i_665 (0352), next_666 (0353), _163 
> (0081), next_218 (0113), _173 (0083), _178 (0086), _179 (0087), _176 (0084), 
> end_arc_443 (0226), end_arc_444 (0227), end_arc_445 (0228), _222 (0238), _223 
> (0115), _224 (0116), _225 (0117), _226 (0118), _227 (0119), _228 (0120), _229 
> (0121), _231 (0123), _21 (0016), red_cost_of_bea_42 (0019), bea_43 (0020), 
> i_649 (0343), _45 (0021), _46 (0022), _47 (0023), _58 (0027), _59 (0028), 
> dedangled_865 (0408), dedangled_863 (0407), dedangled_864 (0448), 
> dedangled_866 (0229) }
> exp_gen[37] := {  }
> phi_gen[37] := {  }
> tmp_gen[37] := {  }
> avail_out[37] := { xchange_449(D) (0232), arcs_1 (0003), stop_arcs_2 (0004), 
> _4 (0006), _5 (0007), i_646 (0340), _7 (0008), _8 (0009), _9 (0010), i_10 
> (0011), _212 (0112), xchange_900 (0431), end_arc_385 (0180), _14 (0013), _19 
> (0015), field_arry_addr_112 (0045), i_665 (0352), next_666 (0353), _163 
> (0081), next_218 (0113), _173 (0083), _178 (0086), _179 (0087), _176 (0084), 
> end_arc_443 (0226), end_arc_444 (0227), end_arc_445 (0228), _222 (0238), _223 
> (0115), _224 (0116), _225 (0117), _226 (0118), _227 (0119), _228 (0120), _229 
> (0121), _231 (0123), _21 (0016), red_cost_of_bea_42 (0019), bea_43 (0020), 
> i_649 (0343), _45 (0021), _46 (0022), _47 (0023), _58 (0027), _59 (0028), 
> dedangled_865 (0408), dedangled_863 (0407), dedangled_864 (0448), 
> dedangled_866 (0229) }
> exp_gen[38] := { dedangled_867 (0409), dedangled_868 (0410) }
> phi_gen[38] := { dedangled_867 (0409), dedangled_868 (0410) }
> tmp_gen[38] := {  }
> avail_out[38] := { xchange_449(D) (0232), arcs_1 (0003), stop_arcs_2 (0004), 
> _4 (0006), _5 (0007), i_646 (0340), _7 (0008), _8 (0009), _9 (0010), i_10 
> (0011), _212 (0112), xchange_900 (0431), end_arc_385 (0180), _14 (0013), _19 
> (0015), field_arry_addr_112 (0045), i_665 (0352), next_666 (0353), _163 
> (0081), next_218 (0113), _173 (0083), _178 (0086), _179 (0087), _176 (0084), 
> end_arc_443 (0226), end_arc_444 (0227), end_arc_445 (0228), _222 (0238), _223 
> (0115), _224 (0116), _225 (0117), _226 (0118), _227 (0119), _228 (0120), _229 
> (0121), _231 (0123), _21 (0016), red_cost_of_bea_42 (0019), bea_43 (0020), 
> i_649 (0343), _45 (0021), _46 (0022), _47 (0023), _58 (0027), _59 (0028), 
> dedangled_865 (0408), dedangled_863 (0407), dedangled_864 (0448), 
> dedangled_866 (0229), dedangled_867 (0409), dedangled_868 (0410) }
> (a presence in the avail_out for rest until it reaches a point where is in 
> none of them)
> :
> ANTIC_OUT[166] := { {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) (0112), bea_43 
> (0020), dedangled_863 (0407), dedangled_864 (0448) }
> [changed] ANTIC_IN[166] := { {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) 
> (0112), bea_43 (0020), dedangled_863 (0407), dedangled_864 (0448) }
> S[166] := { {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) (0112), bea_43 (0020), 
> dedangled_863 (0407), dedangled_864 (0448) }
> :
> PA_OUT[36] := { stop_arcs_2 (0004), _4 (0006), 
> {mem_ref<0B>,addr_expr<&opt>}@.MEM_104(D) (0112), xchange_900 (0431), 
> {mem_ref<0B>,addr_expr<&opt_basket>}@.MEM_104(D) (0015), 
> {mem_ref<0B>,addr_expr<&full_group_end_arc>}@.MEM_104(D) (0083), end_arc_445 
> (0228), {mem_ref<0B>,addr_expr<&perm_p>}@.MEM_104(D) (0016), 
> red_cost_of_bea_42 (0019), bea_43 (0020), dedangled_865 (0408), dedangled_863 
> (0407), dedangled_864 (0448), dedangled_866 (0229), 
> {mem_ref<616B>,addr_expr<&net>}@.MEM_99 (0442), {plus_expr,_913,1} (0438), 
> {component_ref<orientation>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0258), 
> {component_ref<flow>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0274), 
> {component_ref<pred>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0265), 
> {component_ref<depth>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0049), 
> {component_ref<basic_arc>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0299), {component_ref<feas_tol>,mem_ref<0B>,addr_expr<&net>}@.MEM_387 
> (0222), {abs_expr,red_cost_of_bea_42} (0134), 
> {component_ref<potential>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0306), 
> {component_ref<child>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0312), 
> {component_ref<sibling>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0327), 
> {component_ref<sibling_prev>,mem_ref<0B>,addr_expr<&_reorg_base_var_node.reorg.reorder>}@.MEM_387
>  (0339), {pointer_plus_expr,field_arry_addr_581,-8} (0921), 
> {bit_xor_expr,xchange_900,1} (0923), 
> {pointer_plus_expr,field_arry_addr_591,-8} (0924), 
> {pointer_plus_expr,field_arry_addr_601,-8} (0926) }
> :
> Replaced bea_43->tail with _975 in dedangled_864 = bea_43->tail;
> :
>   long int pretmp_859;
>   struct node * * field_addr_860;
>   struct node * field_val_temp_861;
>   unsigned long dedangled_863;
>   unsigned long dedangled_864;
>   unsigned long dedangled_865;
>   unsigned long dedangled_866;
>   :
>     <bb 36> [local count: 4422246]:
>   _58 = MEM[(int64_t *)&net + 608B];
>   _59 = _58 + 1;
>   MEM[(int64_t *)&net + 608B] = _59;
>   dedangled_865 = bea_43->tail;
>   dedangled_863 = bea_43->head;
>   _975 = (struct node.reorg.reorder *) dedangled_865;
>   dedangled_864 = bea_43->tail;
>   dedangled_866 = bea_43->head;
>   if (red_cost_of_bea_42 > 0)
>     goto <bb 166>; [59.00%]
>   else
>     goto <bb 37>; [41.00%]
>
>   <bb 166> [local count: 2609125]:
>   goto <bb 38>; [100.00%]
>
>   <bb 37> [local count: 1813121]:
>
>   <bb 38> [local count: 4422246]:
>   # dedangled_867 = PHI <dedangled_863(166), dedangled_865(37)>
>   # dedangled_868 = PHI <dedangled_864(166), dedangled_866(37)>
>   if (dedangled_867 != dedangled_868)
>     goto <bb 126>; [89.00%]
>   else
>     goto <bb 55>; [11.00%]
> =================================================
> I was pretty arbitrary here about what I extracted from the
> dump file but it's 33MB in size.
>
> I'm still thinking it's something dumb that I did
> when I created "dedangled_864" but I can't spot it from
> the dump. Does anyone have any ideas? Note, before I
> looked at the dump I at least had a half-baked idea
> of what to try but now this leaves me without a clue
> as to what to do (I'm going to read up on the original
> algorithm.)
>
> Thanks,
>
> Gary
>
> ________________________________
> From: Richard Biener <richard.guent...@gmail.com>
> Sent: Thursday, July 22, 2021 5:18 AM
> To: Gary Oblock <g...@amperecomputing.com>
> Cc: gcc@gcc.gnu.org <gcc@gcc.gnu.org>
> Subject: Re: A value number issue
>
> [EXTERNAL EMAIL NOTICE: This email originated from an external sender. Please 
> be mindful of safe email handling and proprietary information protection 
> practices.]
>
>
> On Thu, Jul 22, 2021 at 8:06 AM Gary Oblock via Gcc <gcc@gcc.gnu.org> wrote:
> >
> > I seem to be having a problem with the pre pass.
> >
> > When eliminate_dom_walker::eliminate_stmt is called with
> > the gsi to "dedangled_864 = bea_43->tail;" which in turn
> > calls eliminate_dom_walker::eliminate_avail op of dedangled_864.
> > This gives VN_INFO (lhs)->valnum of _920. The _920 is not
> > associated with any SSA variable in the function and I don't
> > see how it got associated with dedangled_864. This is not
> > a theoretical issue because it causes an error (the gcc_unreachable
> > in eliminate_stmt is called.)
>
> But you show below the definition of _920 so I don't quite understand
> your question.  You can follow VNs reasoning in the -details dump.
>
> >
> > Here is how _920 (in function main) is used.
> >
> >   _920 = arcnew_916->head;
> >   _921 = MEM[(struct node.reorg.reorder *)_920].firstin;
> >   MEM[(struct node.reorg.reorder *)_920].firstin = arcnew_916;
> >
> > Here is how dedangled_864 is used:
> >
> >   <bb 63> [local count: 2609125]:
> >   dedangled_863 = bea_43->head;
> >   dedangled_864 = bea_43->tail;
> >   goto <bb 65>; [100.00%]
> >
> >   <bb 64> [local count: 1813121]:
> >   dedangled_865 = bea_43->tail;
> >   dedangled_866 = bea_43->head;
> >
> >   <bb 65> [local count: 4422246]:
> >   # dedangled_867 = PHI <dedangled_863(63), dedangled_865(64)>
> >   # dedangled_868 = PHI <dedangled_864(63), dedangled_866(64)>
> >   delta_461 = 1;
> >   goto <bb 82>; [100.00%]
> >
> > Note, dedangled_868 is used in an ever widening net of
> > phis and operations. Also, the other similar statements
> >
> >   dedangled_863 = bea_43->head;
> >   dedangled_865 = bea_43->tail;
> >   dedangled_866 = bea_43->head;
> >
> > don't seem to be malformed.
> >
> > I tried using a watchpoint to see what was happening but that turned
> > out to be not productive in that it was tripping on something
> > unrelated even if I set it at the start of the pre pass.
> >
> > I'm assuming that some of my code is malformed in some
> > subtle way and I was wondering it anybody had any ideas?
> > I say subtle because this was all working on a slightly different
> > version of gcc without the code of some other Ampere optimizations
> > in the mix (I disabled those optimizations and things still failed.)
> >
> > Note, if you guys don't have any ideas the next approach is adding
> > tons of brute force instrumentation and special purpose sanity
> > checking to the value numbering routine... please help me avoid that.
> >
> > Thanks,
> >
> > Gary
> >
> >
> > CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is 
> > for the sole use of the intended recipient(s) and contains information that 
> > is confidential and proprietary to Ampere Computing or its subsidiaries. It 
> > is to be used solely for the purpose of furthering the parties' business 
> > relationship. Any unauthorized review, copying, or distribution of this 
> > email (or any attachments thereto) is strictly prohibited. If you are not 
> > the intended recipient, please contact the sender immediately and 
> > permanently delete the original and any copies of this email and any 
> > attachments thereto.

Reply via email to