Why 16Mib static array size limit?
Johan Engelen via Digitalmars-d
digitalmars-d at puremagic.com
Thu Aug 18 05:20:50 PDT 2016
On Thursday, 18 August 2016 at 01:18:03 UTC, Yuxuan Shui wrote:
> On Thursday, 18 August 2016 at 00:20:32 UTC, Chris Wright wrote:
>>
>> The language can analyze all code that affects a local
>> variable in many cases. You don't always need the language to
>> guarantee it's impossible if the compiler can see that the
>> user isn't doing anything funky.
>
> That's right. But for Ali's code, the compiler is clearly not
> smart enough.
Perhaps not smart enough, but it is very close to being smart
enough. Perhaps we, the LDC devs, weren't smart enough in using
the LLVM backend. ;-)
For Ali's code, `arr` is a global symbol that can be modified by
code not seen by the compiler. So no assumptions can be made
about the contents of arr.ptr and arr.length, and thus `arr[i]`
could index into `arr` itself.
Now, if we tell [*] the compiler that `arr` is not touched by
code outside the module... the resulting machine code is
identical with and without POINTER!
It's an interesting case to look further into. For example with
Link-Time Optimization, delaying codegen until linktime, we can
internalize many symbols (i.e. telling the compiler no other
module is going to do anything with it) allowing the compiler to
reason better about the code and generate faster executables.
Ideally, without much user effort. It's something I am already
looking into.
I don't know if we can mark `private` global variables as
internal. If so, wow :-)
-Johan
[*] Unfortunately `private arr` does not have the desired effect
(it does not make it an `internal` LLVM variable), so you have to
hack into the LLVM IR file to make it happen.
More information about the Digitalmars-d
mailing list