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

            Bug ID: 121954
           Summary: Missing CLOBBER(eos) for temporary of function
                    return/arg
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Take:
```
struct s1 {
  int i[1024];
};
void f1(struct s1 *);
static inline struct s1 f(struct s1 a)
{
  f1(&a);
  return a;
}

void h();

struct s1 g(int a)
{
  struct s1 b = {a};
  struct s1 c = f(f(f(f(b))));
  h();
  struct s1 s = f(f(f(f(c))));
  h();
  return s;
}
```

The gimplifier produces:
```
      D.4653 = f (b); [return slot optimization]
      D.4654 = f (D.4653); [return slot optimization]
      D.4655 = f (D.4654); [return slot optimization]
      c = f (D.4655); [return slot optimization]
      h ();
      D.4656 = f (c); [return slot optimization]
      D.4657 = f (D.4656); [return slot optimization]
      D.4658 = f (D.4657); [return slot optimization]
      <retval> = f (D.4658); [return slot optimization]
      h ();
```

But there is no clobber generated for the temporaries that was created from the
function return/argument.

Right now this produces:
```
Partition 0: size 4096 align 8
        D.4658
Partition 1: size 4096 align 8
        D.4657
Partition 2: size 4096 align 8
        D.4656
Partition 3: size 4096 align 8
        D.4655
Partition 4: size 4096 align 8
        D.4654
Partition 5: size 4096 align 8
        D.4653
```

But there should be 3 paritions rather than 6.

Reply via email to