Bug 103093 - [12 Regression] ICE in get_imports, at gimple-range-gori.cc:221 since r12-4788-gcb596fd43667f92c
Summary: [12 Regression] ICE in get_imports, at gimple-range-gori.cc:221 since r12-478...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 12.0
: P1 normal
Target Milestone: 12.0
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-valid-code
: 103119 (view as bug list)
Depends on:
Blocks:
 
Reported: 2021-11-05 09:12 UTC by David Binderman
Modified: 2021-11-08 08:21 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-11-05 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description David Binderman 2021-11-05 09:12:34 UTC
For this C source code:

int i_0, c_4, uc_7, func_2_c_11;

short *func_2_ptr_10;

void func_2() {
  uc_7 = 7;
  for (; uc_7 <= 60; uc_7 += 1) {
    c_4 = 5;
    for (; c_4 <= 76; c_4 += 1) {
      func_2_ptr_10 = &i_0;
      if ((i_0 |= 5) > 0 ?: (60 && uc_7) | *func_2_ptr_10)
        if (func_2_c_11)
          for (;;)
            ;
    }
  }
}

compiled with recent trunk gcc and compiler flag -O2, does this:

$ /home/dcb/gcc/results/bin/gcc -c -w -O2 bug769.c
during GIMPLE pass: vrp
bug769.c: In function ‘func_2’:
bug769.c:5:6: internal compiler error: in get_imports, at gimple-range-gori.cc:221
    5 | void func_2() {
      |      ^~~~~~
0x1ae51cf range_def_chain::get_imports(tree_node*)
	../../trunk.git/gcc/gimple-range-gori.cc:220

The bug first seems to occur sometime between git hash a11c53985a7080f9
and c79399c7e128a3ea, range of 44 commits.
Comment 1 Richard Biener 2021-11-05 11:14:18 UTC
Confirmed.
Comment 2 Martin Liška 2021-11-05 11:30:55 UTC
With --param=vrp2-mode=ranger, it started with r12-4788-gcb596fd43667f92c.
Comment 3 Andrew Macleod 2021-11-05 15:14:06 UTC
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.
Comment 4 GCC Commits 2021-11-05 17:16:43 UTC
The master branch has been updated by Andrew Macleod <amacleod@gcc.gnu.org>:

https://gcc.gnu.org/g:1f6dd5de33912c261a5003150212c290165ac1b6

commit r12-4948-g1f6dd5de33912c261a5003150212c290165ac1b6
Author: Andrew MacLeod <amacleod@redhat.com>
Date:   Fri Nov 5 11:25:09 2021 -0400

    Remove def chain import assert from GORI.
    
    When the IL has changed, any new ssa-names import calculations may not jive
    with existing ssa-names, so just remove the assert.
    
            gcc/
            PR tree-optimization/103093
            * gimple-range-gori.cc (range_def_chain::get_imports): Remove assert.
    
            gcc/testsuite/
            * gcc.dg/pr103093.c: New.
Comment 5 Andrew Macleod 2021-11-05 17:18:13 UTC
Fixed.
Comment 6 Martin Liška 2021-11-08 08:21:48 UTC
*** Bug 103119 has been marked as a duplicate of this bug. ***