adams381 wrote:

The current change mirrors classic CodeGen rather than diverging from it.  
`CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr` takes the same trivial 
copy/move-assignment path: it evaluates the RHS lvalue and calls 
`EmitAggregateAssign` at the call site, and never emits a call to the trivial 
`operator=`.  This PR does exactly that.

The empty body isn't something this PR introduces — classic emits the same 
thing.  Forcing classic to emit the union's `operator=` body (e.g. by taking 
`&U::operator=`) gives, at `-O0 -emit-llvm`:

```llvm
define linkonce_odr ptr @_ZN1UaSERKS_(ptr %this, ptr %0) {
entry:
  %this.addr = alloca ptr
  %.addr = alloca ptr
  store ptr %this, ptr %this.addr
  store ptr %0, ptr %.addr
  %this1 = load ptr, ptr %this.addr
  ret ptr %this1
}
```

No memcpy — classic's trivial union `operator=` body never performs the copy.  
That's harmless precisely because the call-site shortcut means the body is 
never what does the assignment.  So making the body copy would be a departure 
from classic, not a correction toward it, and the `-O3` store-deletion this PR 
fixes comes from the call-site path, not the body.

If we instead want CIR to keep the `operator=` call so the CIR optimizer can 
reason about it, backed by a body that actually copies, that's a deliberate 
improvement over classic and I'm happy to take that direction.  It's a separate 
goal from matching classic and fixing the regression, which is what this PR 
currently does.


https://github.com/llvm/llvm-project/pull/198918
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to