A value number issue

Gary Oblock gary@amperecomputing.com
Thu Jul 29 07:29:55 GMT 2021


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.


More information about the Gcc mailing list