erichkeane wrote:

> Benchmarked split vs full-materialization on `const int s[N] = {1,2,3};`, 
> `clang -cc1 -fclangir`, peak RSS:
> N     full array      split
> 1M    107 MB  89 MB
> 10M   313 MB  89 MB
> 100M  2.37 GB         89 MB
> 
> Split is flat ~89 MB (O(1)); materialization is O(N). At `-O2` N=10M it's 
> 0.58 s vs 0.02 s — the optimizer walks the inert 10M-element 
> `ConstantDataArray`. The tail is unbounded but N=1M is modest (~17%), and 
> nothing real reaches 10M+ (not Eigen, not the dense `insn-automata` tables), 
> so this is a synthetic worst case rather than something we've actually hit.
> 

That is absurdly unfortunate, I was hoping we'd get away without doing this :)  
Rust for example doesn't do this, and just leaves all the 0s in place.  Oh well 
looks like we probably should.

> Only one access is actually GEP-relative (the `cir.global_view` redirect); 
> the rest of the 264 lines is bookkeeping to let the lowered type differ from 
> the declared one. FAMs never reach this path — FAM-init is NYI in CIRGen 
> (`errorNYI` + a pre-existing assert) before lowering.
> 
> Your zero-init + global-ctor avoids the type rewrite entirely and gets the 
> same flat RSS, but it drops a `const` global from `.rodata` to `.bss` + ctor 
> at `-O0`, where the split matches classic and stays in `.rodata`. A CIR→CIR 
> canonicalization keeps `.rodata` without the LowerToLLVM machinery. Keep the 
> split, take the ctor path, or canonicalize?

My idea of the zero-init+global-ctor was to do this during LowerToLLVM.  And 
yes, it gets another (private) entry into the rodata, but I'd hope that is 
reasonably sized/acceptable.  Does THAT implementation look particularly ugly?  



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

Reply via email to