This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FRE - SCCVN problem with initialized global variables


Hi,

GCC currently doesn't bootstrap on s390x.  The problem is that
gengtype is miscompiled and I suspect the fre - sccvn changes to be
the culprit.

When sccvn performs the depth-first search for uses it might reach
global variable definitions. If the global variable is initialized
with a value that value is taken as constant and used to replace uses
of that variable.

e.g.:

int global = 1;

int
foo (int a)
{
  return a != global;
}

int
main ()
{
  global = 3;
  if (foo (3))
    abort ();
}

becomes (compiled with -O1):

foo (a)
{
  int global.0;
  int D.1626;

<bb 2>:
  global.0_1 = 1;
  D.1626_3 = a_2(D) != global.0_1;
  return D.1626_3;

}
...

The example works fine when removing the initialization of global.

Bye,

-Andreas-



Here is the complete fre output:

;; Function foo (foo)

SCC consists of: global_5(D) 
Value numbering global_5(D) stmt = (void) 0;
Setting value number of global_5(D) to global_5(D)
SCC consists of: a_2(D) 
Value numbering a_2(D) stmt = (void) 0;
Setting value number of a_2(D) to a_2(D)
SCC consists of: global.0_1 
Value numbering global.0_1 stmt = global.0_1 = global;
RHS global simplified to 1 has constants 0
Setting value number of global.0_1 to 1
SCC consists of: D.1626_3 
Value numbering D.1626_3 stmt = D.1626_3 = a_2(D) != global.0_1;
Setting value number of D.1626_3 to D.1626_3
Value numbers:
global.0_1 = 1
Created value VH.0 for a_2(D)
SCCVN says global.0_1 value numbers to 1
Created value VH.1 for D.1626_3
Created value VH.2 for <retval>_4
exp_gen[0] := {  }
tmp_gen[0] := {  }
avail_out[0] := { a_2(D) (VH.0)  }
exp_gen[2] := {  }
tmp_gen[2] := { <retval>_4 (VH.2)  }
avail_out[2] := { a_2(D) (VH.0) , D.1626_3 (VH.1) , <retval>_4 (VH.2)  }
exp_gen[1] := {  }
tmp_gen[1] := {  }
avail_out[1] := {  }
Replaced global with 1 in global.0_1 = global;
foo (a)
{
  int global.0;
  int D.1626;

<bb 2>:
  global.0_1 = 1;
  D.1626_3 = a_2(D) != global.0_1;
  return D.1626_3;

}



;; Function main (main)

SCC consists of: global_2(D) 
Value numbering global_2(D) stmt = (void) 0;
Setting value number of global_2(D) to global_2(D)
SCC consists of: global_3 
Value numbering global_3 stmt = global = 3;
No store match
Value numbering store global to 3
Setting value number of global_3 to global_3
SCC consists of: D.1630_1 
Value numbering D.1630_1 stmt = D.1630_1 = foo (3);
Setting value number of D.1630_1 to D.1630_1
Value numbers:
Created value VH.3 for D.1630_1
exp_gen[0] := {  }
tmp_gen[0] := {  }
avail_out[0] := {  }
exp_gen[2] := {  }
tmp_gen[2] := {  }
avail_out[2] := { D.1630_1 (VH.3)  }
exp_gen[3] := {  }
tmp_gen[3] := {  }
avail_out[3] := { D.1630_1 (VH.3)  }
exp_gen[4] := {  }
tmp_gen[4] := {  }
avail_out[4] := { D.1630_1 (VH.3)  }
exp_gen[1] := {  }
tmp_gen[1] := {  }
avail_out[1] := {  }
main ()
{
  int D.1630;

<bb 2>:
  global = 3;
  D.1630_1 = foo (3);
  if (D.1630_1 != 0)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 3>:
  abort ();

<bb 4>:
  return;

}



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]