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

            Bug ID: 118779
           Summary: [15 Regression] clisp miscompilation since r15-580
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

Created attachment 60409
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60409&action=edit
package.i

clisp package.c seems to be miscompiled since
r15-580-gf3e5f4c58591f5dacdd14a65ec47bbe310df02a0
/opt/notnfs/gcc-bisect/obj/gcc/cc1.r15-579 -quiet -fexceptions -fpie
-fstack-protector-strong -m64 -march=x86-64 -mtune=generic
-fstack-clash-protection -fcf-protection -mtls-dialect=gnu2
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -O -fwrapv
-fno-strict-aliasing package.i -std=gnu2x -fdump-tree-dom3-details-folding
-fdump-tree-slsr
vs.
/opt/notnfs/gcc-bisect/obj/gcc/cc1.r15-580 -quiet -fexceptions -fpie
-fstack-protector-strong -m64 -march=x86-64 -mtune=generic
-fstack-clash-protection -fcf-protection -mtls-dialect=gnu2
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -O -fwrapv
-fno-strict-aliasing package.i -std=gnu2x -fdump-tree-dom3-details-folding
-fdump-tree-slsr
has identical slsr dump but in dom3 I see only in the r15-580 dump in
rehash_symtab function (noinline added by me, but it still reproduces with
that).
Applying pattern match.pd:7200, generic-match-6.cc:1457
  [6] Registering jump thread: (13, 14) incoming edge;  (14, 18) normal; 
where match.pd:7200 at that revision was
98998245d99f (Richard Biener           2016-04-29 08:36:49 +0000  7194) /*
Simplify pointer equality compares using PTA.  */
98998245d99f (Richard Biener           2016-04-29 08:36:49 +0000  7195) (for
neeq (ne eq)
98998245d99f (Richard Biener           2016-04-29 08:36:49 +0000  7196) 
(simplify
98998245d99f (Richard Biener           2016-04-29 08:36:49 +0000  7197)   (neeq
@0 @1)
98998245d99f (Richard Biener           2016-04-29 08:36:49 +0000  7198)   (if
(POINTER_TYPE_P (TREE_TYPE (@0))
98998245d99f (Richard Biener           2016-04-29 08:36:49 +0000  7199)       
&& ptrs_compare_unequal (@0, @1))
f913ff2adc41 (Thomas Koenig            2018-04-07 23:52:03 +0000  7200)    {
constant_boolean_node (neeq != EQ_EXPR, type); })))

  _126 = (unsigned int) _9;
  _127 = _126 + 4294967295;
  _128 = (sizetype) _127;
  _129 = _128 + 1;
  _130 = _129 * 8;
  _131 = (void * *) _130;
...
  <bb 7> [local count: 738197516]:
  # offset_66 = PHI <0B(6), offset_101(9)>
...
  offset_101 = offset_66 + 8;
  if (offset_101 != _131)
...
  _119 = (unsigned int) _9;
  _120 = _119 + 4294967295;
  _121 = (sizetype) _120;
  _122 = _121 + 1;
  _123 = _122 * 8;
  _124 = (void * *) _123;
...
  <bb 11> [local count: 738197528]:
  # offset_69 = PHI <0B(10), offset_108(14)>
...
  offset_108 = offset_69 + 8;
  if (offset_108 != _124)
bb 7 is one loop, bb 11 is another.
Now, _131 and _124 to me look to be the same thing.
In the source, those 2 loops are
  {
    { gcv_object_t* offset = 0;
    { uintWL count = oldsize;
    do {
      { object oldentry =
       
*(gcv_object_t*)(((UBYTE*)(&((Svector)((oint)(((STACK[-1-(sintP)(2)])))-1UL))->data[0])+((aint)offset))
                                                  );
      if ((((oint)(oldentry) & 7) == (3UL +0)))
        do {
          ((STACK[-1-(sintP)(-1)]) = ((((Cons)((oint)(oldentry)-3UL))->cdr)),
STACK -= -1);


          (((Cons)((oint)(oldentry)-3UL))->cdr) = ((STACK[-1-(sintP)(2)]));
((STACK[-1-(sintP)(2)])) = oldentry;


          newinsert((((Cons)((oint)(oldentry)-3UL))->car),newsize);
          oldentry = (STACK -= 1, (STACK[-1-(sintP)(-1)]));
        } while ((((oint)(oldentry) & 7) == (3UL +0)));
      offset++;
    }} while (--count);
  }}}
  {
    { gcv_object_t* offset = 0;
    { uintWL count;
    do { if (!(sizeof(count)==sizeof(uintL))) {
dotimes_called_with_count_of_wrong_size(); }; { count = (oldsize); do {{ {
object oldentry =
*(gcv_object_t*)(((UBYTE*)(&((Svector)((oint)(((STACK[-1-(sintP)(2)])))-1UL))->data[0])+((aint)offset)));
if (!((((oldentry) == (((object)((UBYTE*)(&symbol_tab_data.S_nil)+(1UL)))))) ||
(((oint)(oldentry) & 7) == (3UL +0)))) { ((STACK[-1-(sintP)(-1)]) = (oldentry),
STACK -= -1); newinsert(oldentry,newsize); (STACK -= (sintP)(1)); } offset++;
}}} while (--count != 0); }; } while(0)
# 224 "../src/package.d"
       ;
  }}}
Arguably, maybe the 2 offset vars should have aint type and use offset+=sizeof
(gcv_object_t); instead of offset++.

Reply via email to