public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* A value number issue
@ 2021-07-22  6:05 Gary Oblock
  2021-07-22 12:18 ` Richard Biener
  0 siblings, 1 reply; 8+ messages in thread
From: Gary Oblock @ 2021-07-22  6:05 UTC (permalink / raw)
  To: gcc

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.)

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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-22  6:05 A value number issue Gary Oblock
@ 2021-07-22 12:18 ` Richard Biener
  2021-07-23  1:40   ` Gary Oblock
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Biener @ 2021-07-22 12:18 UTC (permalink / raw)
  To: Gary Oblock; +Cc: gcc

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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-22 12:18 ` Richard Biener
@ 2021-07-23  1:40   ` Gary Oblock
  2021-07-28 10:40     ` Richard Biener
  0 siblings, 1 reply; 8+ messages in thread
From: Gary Oblock @ 2021-07-23  1:40 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc

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
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.guenther@gmail.com>
Sent: Thursday, July 22, 2021 5:18 AM
To: Gary Oblock <gary@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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-23  1:40   ` Gary Oblock
@ 2021-07-28 10:40     ` Richard Biener
  2021-07-28 21:03       ` Gary Oblock
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Biener @ 2021-07-28 10:40 UTC (permalink / raw)
  To: Gary Oblock; +Cc: gcc

On Fri, Jul 23, 2021 at 3:40 AM Gary Oblock <gary@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.guenther@gmail.com>
> Sent: Thursday, July 22, 2021 5:18 AM
> To: Gary Oblock <gary@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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-28 10:40     ` Richard Biener
@ 2021-07-28 21:03       ` Gary Oblock
  2021-07-29  7:12         ` Richard Biener
  0 siblings, 1 reply; 8+ messages in thread
From: Gary Oblock @ 2021-07-28 21:03 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc

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.guenther@gmail.com>
Sent: Wednesday, July 28, 2021 3:40 AM
To: Gary Oblock <gary@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 <gary@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.guenther@gmail.com>
> Sent: Thursday, July 22, 2021 5:18 AM
> To: Gary Oblock <gary@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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-28 21:03       ` Gary Oblock
@ 2021-07-29  7:12         ` Richard Biener
  2021-07-29  7:29           ` Gary Oblock
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Biener @ 2021-07-29  7:12 UTC (permalink / raw)
  To: Gary Oblock; +Cc: gcc

On Wed, Jul 28, 2021 at 11:03 PM Gary Oblock <gary@amperecomputing.com> wrote:
>
> 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?

Because the value was used with 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 *.

So what did you change in GCC?  If you did not change value-numbering
then you can reduce the testcase down and extract a GIMPLE frontend
testcase for VN (use -fdump-tree-all-gimple and massage the GIMPLE
dumped before the FRE/PRE pass that causes the issue)

> Gary
>
>
> ________________________________
> From: Richard Biener <richard.guenther@gmail.com>
> Sent: Wednesday, July 28, 2021 3:40 AM
> To: Gary Oblock <gary@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 <gary@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.guenther@gmail.com>
> > Sent: Thursday, July 22, 2021 5:18 AM
> > To: Gary Oblock <gary@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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-29  7:12         ` Richard Biener
@ 2021-07-29  7:29           ` Gary Oblock
  2021-07-29  7:39             ` Richard Biener
  0 siblings, 1 reply; 8+ messages in thread
From: Gary Oblock @ 2021-07-29  7:29 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc

Richard,

I didn't find a use of _975 with that type...

A small test case is easier said than done. It's mcf
and I pulled a copy out of SPEC for my unit tests (we have
a SPEC license) and that passes. However, when I compile it
in the SPEC framework, it fails. Otherwise, I'd have used
creduce to make a really tiny test case a couple of weeks
ago... ;-(

In RTL a trick I used to use in the bad old days when I did one off VLIW
schedulers, was to instrument the bit that assigns the RTL's id
number and put a trap there to catch the creation of an interesting
bit of RTL. Does that kind of trick work with SSA variable creation?

Thanks, I really appreciate your help even though in this case
I'm still kind of stuck.

Gary

________________________________
From: Richard Biener <richard.guenther@gmail.com>
Sent: Thursday, July 29, 2021 12:12 AM
To: Gary Oblock <gary@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 Wed, Jul 28, 2021 at 11:03 PM Gary Oblock <gary@amperecomputing.com> wrote:
>
> 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?

Because the value was used with 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 *.

So what did you change in GCC?  If you did not change value-numbering
then you can reduce the testcase down and extract a GIMPLE frontend
testcase for VN (use -fdump-tree-all-gimple and massage the GIMPLE
dumped before the FRE/PRE pass that causes the issue)

> Gary
>
>
> ________________________________
> From: Richard Biener <richard.guenther@gmail.com>
> Sent: Wednesday, July 28, 2021 3:40 AM
> To: Gary Oblock <gary@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 <gary@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.guenther@gmail.com>
> > Sent: Thursday, July 22, 2021 5:18 AM
> > To: Gary Oblock <gary@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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: A value number issue
  2021-07-29  7:29           ` Gary Oblock
@ 2021-07-29  7:39             ` Richard Biener
  0 siblings, 0 replies; 8+ messages in thread
From: Richard Biener @ 2021-07-29  7:39 UTC (permalink / raw)
  To: Gary Oblock; +Cc: gcc

On Thu, Jul 29, 2021 at 9:29 AM Gary Oblock <gary@amperecomputing.com> wrote:
>
> Richard,
>
> I didn't find a use of _975 with that type...
>
> A small test case is easier said than done. It's mcf
> and I pulled a copy out of SPEC for my unit tests (we have
> a SPEC license) and that passes. However, when I compile it
> in the SPEC framework, it fails. Otherwise, I'd have used
> creduce to make a really tiny test case a couple of weeks
> ago... ;-(

Does it pass if you cut&paste the exact command SPEC uses
in its build directory?

>
> In RTL a trick I used to use in the bad old days when I did one off VLIW
> schedulers, was to instrument the bit that assigns the RTL's id
> number and put a trap there to catch the creation of an interesting
> bit of RTL. Does that kind of trick work with SSA variable creation?

Well, I'm usually debugging cc1 then and conditionally break on
the return from make_ssa_name_fn if t->base.u.version == the SSA version
or for any GC allocated entity at the return of ggc_internal_alloc and the
corresponding address of the object.

> Thanks, I really appreciate your help even though in this case
> I'm still kind of stuck.
>
> Gary
>
> ________________________________
> From: Richard Biener <richard.guenther@gmail.com>
> Sent: Thursday, July 29, 2021 12:12 AM
> To: Gary Oblock <gary@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 Wed, Jul 28, 2021 at 11:03 PM Gary Oblock <gary@amperecomputing.com> wrote:
> >
> > 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?
>
> Because the value was used with 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 *.
>
> So what did you change in GCC?  If you did not change value-numbering
> then you can reduce the testcase down and extract a GIMPLE frontend
> testcase for VN (use -fdump-tree-all-gimple and massage the GIMPLE
> dumped before the FRE/PRE pass that causes the issue)
>
> > Gary
> >
> >
> > ________________________________
> > From: Richard Biener <richard.guenther@gmail.com>
> > Sent: Wednesday, July 28, 2021 3:40 AM
> > To: Gary Oblock <gary@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 <gary@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.guenther@gmail.com>
> > > Sent: Thursday, July 22, 2021 5:18 AM
> > > To: Gary Oblock <gary@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.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-07-29  7:39 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-22  6:05 A value number issue Gary Oblock
2021-07-22 12:18 ` Richard Biener
2021-07-23  1:40   ` Gary Oblock
2021-07-28 10:40     ` Richard Biener
2021-07-28 21:03       ` Gary Oblock
2021-07-29  7:12         ` Richard Biener
2021-07-29  7:29           ` Gary Oblock
2021-07-29  7:39             ` Richard Biener

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).