I'm working on an updated version of my translation validator [*], and I have some problems with CLOBBER(eol).

I currently treat CLOBBER(eol) as making the memory invalid (i.e. all subsequent accesses is undefined behavior), but the tool reports miscompilation for a few cases where the tree-nrv pass makes the IR clobber <retval> by changing code such as [**]

  union bu o;
  ...
  o = i;
  MEM[(union  *)&o].b18 = _11;
  MEM[(union  *)&o].b20 = _11;
  <retval> = o;
  o ={v} {CLOBBER(eol)};
  return <retval>;

to use <retval> instead of o

  union bu o [value-expr: <retval>];
  ...
  <retval> = i;
  MEM[(union  *)&<retval>].b18 = _11;
  MEM[(union  *)&<retval>].b20 = _11;
  <retval> ={v} {CLOBBER(eol)};
  return <retval>;

As a result, the tool therefore thinks the returned value is unavailable.

Is my understanding of CLOBBER(eol) correct? (I.e., is this a bug in tree-nrv?) Or is <retval> special so that I should just ignore CLOBBER(eol) for this case?

   /Krister


[*] I'm planning to release the updated version in a few weeks. Meanwhile, you can find the old version at https://github.com/kristerw/pysmtgcc

[**] This example originates from gcc.c-torture/execute/921204-1.c compiled for x86 using the flags "-O -m32".

Reply via email to