24464 Commits

Author SHA1 Message Date
Jacob Young
a3b3ac0ea4 llvm: fix lowering of lazy values
These really should not be making it to the backend, but that's a
problem for another time.
2023-06-10 20:47:58 -07:00
Jacob Young
123cfab984 codegen: fix doubled global sentinels 2023-06-10 20:47:58 -07:00
Jacob Young
828756ceeb InternPool: fix element pointer type computations 2023-06-10 20:47:58 -07:00
Jacob Young
08ae212772 InternPool: fix key for empty array with sentinel 2023-06-10 20:47:58 -07:00
Andrew Kelley
c82a04d35f InternPool: debug dump all the data 2023-06-10 20:47:58 -07:00
Andrew Kelley
bb526426e7 InternPool: remove memoized_decl
This is neither a type nor a value. Simplifies `addStrLit` as well as
the many places that switch on `InternPool.Key`.

This is a partial revert of bec29b9e498e08202679aa29a45dab2a06a69a1e.
2023-06-10 20:47:58 -07:00
Andrew Kelley
870e3843c5 Sema: elide comptime-checked slice safety
Before, Zig would emit a start<=end safety check for `foo[1..2]` even
though it was already checked at compile-time.
2023-06-10 20:47:58 -07:00
Jacob Young
b2391a7d44 Sema: remove opv status from arrays with sentinels
Being able to create a pointer to the non-opv sentinel means that these
types have to actually be stored.
2023-06-10 20:47:58 -07:00
Jacob Young
71c4077c35 Value: fix null test for c pointers 2023-06-10 20:47:57 -07:00
Jacob Young
26fac15f48 math.big.int: fix ctz of zero 2023-06-10 20:47:57 -07:00
Jacob Young
d019229c2c Sema: avoid invalided key access 2023-06-10 20:47:57 -07:00
Andrew Kelley
aed142ebaa InternPool: further optimize Key hashing
This is a continuation of 2f24228c758bc8a35d13379703bc1695008212b0.

This commit comes with smaller gains, but gains nonetheless. memcpy is
showing up as much less interesting in callgrind output for behavior
tests.

Current status: this branch is 1.15 ± 0.02 times slower than merge-base.
2023-06-10 20:47:57 -07:00
mlugg
a0d4ef0acf InternPool: add representation for value of empty enums and unions
This is a bit odd, because this value doesn't actually exist:
see #15909. This gets all the empty enum/union behavior tests passing.

Also adds an assertion to `Sema.analyzeBodyInner` which would have
helped figure out the issue here much more quickly.
2023-06-10 20:47:57 -07:00
Jacob Young
99531b0d52 Sema: make sentinel load through array pointer comptime known 2023-06-10 20:47:57 -07:00
Jacob Young
1430ac2fbb Type: fix @sizeOf(?anyerror) 2023-06-10 20:47:57 -07:00
Jacob Young
91fb45a51b Sema: fix comptime error set comparisons 2023-06-10 20:47:57 -07:00
Andrew Kelley
82f6f164a1 InternPool: improve hashing performance
Key.PtrType is now an extern struct so that hashing it can be done by
reinterpreting bytes directly. It also uses the same representation for
type_pointer Tag encoding and the Key. Accessing pointer attributes now
requires packed struct access, however, many operations are now a copy
of a u32 rather than several independent fields.

This function moves the top two most used Key variants - pointer types
and pointer values - to use a single-shot hash function that branches
for small keys instead of calling memcpy.

As a result, perf against merge-base went from 1.17x ± 0.04 slower to
1.12x ± 0.04 slower. After the pointer value hashing was changed, total
CPU instructions spent in memcpy went from 4.40% to 4.08%, and after
additionally improving pointer type hashing, it further decreased to
3.72%.
2023-06-10 20:47:57 -07:00
Andrew Kelley
c7d65fa368 std.hash: add xxhash to benchmark and fix its API 2023-06-10 20:47:57 -07:00
Andrew Kelley
90a877f462 InternPool: pass by const pointer
The Zig language allows the compiler to make this optimization
automatically. We should definitely make the compiler do that, and
revert this commit. However, that will not happen in this branch, and I
want to continue to explore achieving performance parity with
merge-base. So, this commit changes all InternPool parameters to be
passed by const pointer rather than by value.

I measured a 1.03x ± 0.03 speedup vs the previous commit compiling the
(set of passing) behavior tests. Against merge-base, this commit is
1.17x ± 0.04 slower, which is an improvement from the previous
measurement of 1.22x ± 0.02.

Related issue: #13510
Related issue: #14129
Related issue: #15688
2023-06-10 20:47:57 -07:00
Jacob Young
6b81546454 Type: fix @typeName for undefined 2023-06-10 20:47:57 -07:00
Jacob Young
494d4f9b8e behavior: update for different inferred error set order
Error sets are no longer alphabetically sorted.
2023-06-10 20:47:57 -07:00
Jacob Young
f673c98a7c Sema: fix sus overflow behavior in RangeSetUnhandledIterator
The old code assumed that `intAddScalar` could return a value outside
of the range of `ty`, which is problematic for many reasons.

The new code (ab)uses the InternPool for speed.
2023-06-10 20:47:57 -07:00
Jacob Young
d0cd1c89da Sema: port lazy value usage to be InternPool aware 2023-06-10 20:47:57 -07:00
Andrew Kelley
61978c8c94 InternPool: eliminate indexToKey call graph cycle
Recursion makes this hot function more difficult to profile and
optimize.

I measured a 1.05x speedup vs the previous commit with the (set of
passing) behavior tests.

This commit was the last in a series, and the main thing it needed to do
was make InternPool.typeOf not call indexToKey(). This required adding a
type field to the runtime_value encoding even though it is technically
redundant. This could have been avoided with a loop inside typeOf, but I
wanted to keep the machine code of that hot function as simple as
possible. The variable encoding is still responsible for a relatively
small slice of the InternPool data size.

I added a function that provides the payload type corresponding to the
InternPool.Tag type, which allows for some handy inline switch prongs.

Let's start moving the structs that are specific to InternPool.Tag into
the corresponding namespace. This will provide type safety if the
encoding of InternPool changes for these types later.
2023-06-10 20:47:57 -07:00
Andrew Kelley
66f83f27a2 InternPool: avoid indexToKey recursion for type_enum_auto
Recursion makes this hot function more difficult to profile and
optimize.

This commit adds the integer tag type to the type_enum_auto encoding
even though the integer tag type can be inferred based on the number of
fields of the enum. This avoids a call to getAssumeExists of the integer
tag type inside indexToKey.
2023-06-10 20:47:57 -07:00
Jacob Young
27f1ad8afd Module: add allowzero canonicalization to pointer types 2023-06-10 20:47:57 -07:00
Jacob Young
a803e9cf48 Sema: fix vector comparison and interning of -0 2023-06-10 20:47:57 -07:00
Jacob Young
66ae42bb72 Sema: fix pointer arithmetic on single array pointers 2023-06-10 20:47:56 -07:00
Andrew Kelley
55cda9a592 InternPool: avoid indexToKey recursion for ptr_slice
Recursion makes this hot function more difficult to profile and
optimize.

The ptr_slice encoding now additionally includes the slice type. This
makes typeOf() implementable without indexToKey() as well as no longer
using recursion in the ptr_slice prong of indexToKey itself.

Unfortunately some logic had to be duplicated. However, I think that a
future enhancement could eliminate the duplication as well as remove
some other unwanted code, improving performance, by representing a slice
value in `Key.Ptr` without `addr` populated directly, but with an
`Index` pointing to the underlying manyptr value.
2023-06-10 20:47:56 -07:00
Andrew Kelley
f7177fb821 InternPool: avoid indexToKey recursion for opt_payload
This is a hot function, and recursion makes it more difficult to
profile, as well as likely making it more difficult to optimize.

Previously, indexToKey for opt_payload would call getAssumeExists() on
the optional type. This made it possible to omit the optional type in
the encoding of opt_payload. However, getAssumeExists() *must* call
indexToKey because of hashing/equality.

So, this commit adds the optional type to the opt_payload encoding,
which increases its "extra" size from 0 to 8 bytes. As a result,
the opt_payload encoding went from not showing up on the top 25 largest
tags to...still not showing up in the top 25 largest tags.

This also helps make InternPool.typeOf() no longer need to call
indexToKey which is another hot function and another source of
recursion.
2023-06-10 20:47:56 -07:00
Andrew Kelley
f2778f7ca0 InternPool: avoid indexToKey recursion for only_possible_value
This is a hot function, and recursion makes it more difficult to
profile, as well as likely making it more difficult to optimize.
2023-06-10 20:47:56 -07:00
Andrew Kelley
b336866fbc InternPool: avoid indexToKey recursion for ptr_elem,ptr_field
This is a hot function, and recursion makes it more difficult to
profile, as well as likely making it more difficult to optimize.
2023-06-10 20:47:56 -07:00
Andrew Kelley
804740af4c InternPool: avoid indexToKey recursion for type_slice
This is a hot function, and recursion makes it more difficult to
profile, as well as likely making it more difficult to optimize.
2023-06-10 20:47:56 -07:00
Jacob Young
5580a69d71 cbe: fix InternPool regressions 2023-06-10 20:47:56 -07:00
Jacob Young
a702af062b x86_64: fix InternPool regressions 2023-06-10 20:47:56 -07:00
Jacob Young
4f70863a55 InternPool: fix various pointer issues 2023-06-10 20:47:56 -07:00
Jacob Young
3269256965 behavior: fix more compiler crashes 2023-06-10 20:47:56 -07:00
Jacob Young
3064d2aa7b behavior: additional llvm fixes 2023-06-10 20:47:56 -07:00
Jacob Young
3b6ca1d35b Module: move memoized data to the intern pool
This avoids memory management bugs with the previous implementation.
2023-06-10 20:47:56 -07:00
Jacob Young
d40b83de45 behavior: pass more tests on llvm again 2023-06-10 20:47:56 -07:00
Jacob Young
2d5bc01469 behavior: get more test cases passing with llvm 2023-06-10 20:47:56 -07:00
Andrew Kelley
c8b0d4d149 InternPool: optimize zigTypeTag()
This is a particularly hot function, so we operate directly on encodings
rather than the more straightforward implementation of calling
`indexToKey`.

I measured this as 1.05 ± 0.04 times faster than the previous commit
with a ReleaseFast build against hello world (which includes std.debug
and formatted printing).

I also profiled the function and found that zigTypeTag() went from being
a major caller of `indexToKey` to being completely insignificant due to
being so fast.
2023-06-10 20:47:56 -07:00
Andrew Kelley
fc358435cb C backend: InternPool fixes 2023-06-10 20:47:56 -07:00
Andrew Kelley
a596ea683c CLI: introduce --verbose-intern-pool
and stop dumping to stderr without the user's consent.
2023-06-10 20:47:56 -07:00
Andrew Kelley
8011faa004 compiler: fix populateTestFunctions InternPool usage 2023-06-10 20:47:56 -07:00
Andrew Kelley
270f9e24dd AstGen: generate tests with anyerror!void
rather than inferred error sets. This avoids extra unnecessary work for
the compiler since inferred error sets are unique types.
2023-06-10 20:47:56 -07:00
Andrew Kelley
e156c1c07e InternPool: correct the logic for struct size dump 2023-06-10 20:47:56 -07:00
Jacob Young
1dc01f1140 InternPool: fix build-exe and compiler-rt crashes 2023-06-10 20:47:55 -07:00
Jacob Young
9cd0ca9f48 Module: rename functions to make ownership checks explicit
This makes the difference between `decl.getOwnedFunction` and
`decl.val.getFunction` more clear when reading the code.
2023-06-10 20:47:55 -07:00
Andrew Kelley
d5f0ee0d62 codegen: fix lowering of constant structs 2023-06-10 20:47:55 -07:00