https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103093

Andrew Macleod <amacleod at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED

--- Comment #3 from Andrew Macleod <amacleod at redhat dot com> ---
This is a case of a series of statements being simplified, and the IL rewritten
to be quite different:
it starts with

  _3 = uc_7.9_28 != 0;
  _4 = (int) _3;
  _25 = BIT_FIELD_REF <_2, 16, 0>;
  _6 = (int) _25;
  _7 = _4 | _6;

Since range-ops doesn't understand the BIT_FIELD_REF operator, _25 is
considered an import to the defchain for _7.

Folding statement: _7 = _4 | _6;
and ends up changing this to:
  _3 = uc_7.9_28 != 0;
  _4 = (int) _3;
  _25 = (short int) _2;
  _6 = (int) _25;
  _22 = _25 | 1;
  _7 = (int) _22


and then later we are looking to calculate a range from an outgoing edge in
this block, and when GORI steps back to this statement, it steps back from _7
into _22, sees it does not have a dependency chain, so calculates one for it.
It finds that _2 is the import, which means the imports no longer match up for
_7, so it triggers an assert that something is amok with the dependency chain
imports.

Internally ranger doesn't use these imports for anything significant, so the
fact that they are out of date is not particularly important in the presence of
IL that is being updating.  

GORI will also continue to calculate based on what is in the stmt, all that may
change is if the dependencies are different enough, it will be unable to
calculate thru the chain properly since it wont be able to find a name in the
def chain that it is expecting, and will simply return false.  It won't affect
any already computed values, and will never result in a  wrong-code situation.

Updating existing def chains would be problematic as uses further down the def
chain would not be updated, so any of them could later trigger an inconsistency
assert. 

As such, I will simply remove the assert. It was primarily of use when we were
first introducing the import concept to make sure that there was consistency
when they were being built. In the presence of changing IL, the assert no
longer has much meaning.

Reply via email to