Hi,

I have a problem with a transformation pass I wrote.
The pass is meant to pipeline and unroll lookups in linked lists.

After my pass is run, gcc renames a variable, which leads to wrong results.

Part of my pass's dump, which is as I want it.
...
  <bb 19>:
  list_38 = list_10->next;
  _22 = list_10->info;
  _36 = _22->idx;
  if (_5 != _36)
    goto <bb 16>;
  else
    goto <bb 14>;

  <bb 16>:
  goto <bb 12>;

  <bb 14>:
  # list_13 = PHI <list_6(D)(6), list_34(13), 0B(12), 0B(5), 0B(18), 
list_10(19)>
...


Corresponding part of the following pass. (list_join.c.148t.fab1)
..
SSA replacement table
N_i -> { O_1 ... O_j } means that N_i replaces O_1, ..., O_j

_1 -> { _17 }
_12 -> { _16 }
_14 -> { _18 }
_22 -> { _7 }
_25 -> { _19 }
_36 -> { _8 }
list_38 -> { list_10 }
list_41 -> { list_15 }
_42 -> { _20 }
...
  <bb 19>:
  list_38 = list_10->next;
  _22 = list_38->info;
  _36 = _22->idx;
  if (_5 != _36)
    goto <bb 16>;
  else
    goto <bb 14>;

  <bb 16>:
  goto <bb 12>;

  <bb 14>:
  # list_13 = PHI <list_6(D)(6), list_34(13), 0B(12), 0B(5), 0B(18), 
list_38(19)>
...

As you can see, gcc renames list_10 to list_38 in two places, which is not what 
I want.
Why does gcc think this is possible. It seems to me that I need to update some 
data structure
which I don't know of. What am I missing?
I already did an updated_stmt in the places where I edit gimple statements.

If I specify TODO_update_ssa, the same renaming already takes place in my pass.
bb 19 is a copy of another basic block, maybe this is of relevance.

Thank you and best regards,
Benedikt

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to