Lancern wrote:

> @Lancern Have you seen any significant benefits from the invariant handling? 
> In general, the LLVM optimizer is very good at detecting when alloca loads 
> are redundant, and it seems to me that this might be introducing more 
> fragility than benefit.

The initial motivation is to optimize for code like this:

```cpp
int g();
void use(int);

void h(const int *);   // <-- The body of h is external.
void f() {
  const int x = g();
  h(&x);
  use(x);
}
```

Since `h` is external, LLVM cannot take the risk to eliminate the reload from 
alloca before calling `use`, despite that the reload is indeed unnecessary 
according to the C++ standard. One hope of CIR was (and I believe it still is) 
to enable language-specific optimizations like this.

To enable such optimizations we had two choices:

1. Implement some kind of const-propagation pass directly in CIR.
2. Teach LLVM to optimize this by emitting better LLVM IR or attaching more 
metadata to the IR.

It was decided that 1 would probably be an overkill. Since LLVM already has 
something like invariant group (although it's experimental and it has caveats 
as @andykaylor pointed out), 2 would seem like a more reasonable approach back 
then.

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

Reply via email to