[X86][APX] Test the relocation of an NF add
test_regclass_not_updated_by_regalloc_2 only produced an NDD/NF add
with a GOT operand because the allocator happened to give the add a
destination different from its source. With SlotIndexes compaction it
picks the same register, so the add is compressed to the legacy form
and the CODE_6 TODO lost its test.
Add a function whose add keeps its source live, so it stays NDD and
becomes NF under any allocation.
[X86] Enable SlotIndexes compaction by default
Compacting SlotIndexes before greedy allocation drops the entries of
erased instructions, so live range sizes and instruction distances
reflect the code being allocated rather than how much was erased
before it. AMDGPU has done this since #235806; do the same for X86.
Codegen changes only through allocation: no new crashes, verifier
errors or allocation failures in the lit suites, including
EXPENSIVE_CHECKS, and a stage-2 build of LLVM, clang and lld with
-verify-machineinstrs passes its own tests. On llvm-test-suite at -O3,
spills drop 0.3% and .text 0.06%, with compile time unchanged.
Most test updates are regenerated checks. misched-matmul now inserts
20 spills instead of 24. live-debug-vars-stale-slotindexes.mir gets
one more use of %27 so that accumulate_fit still reaches the stale
index path it was written for.
freebsd/kstat: clean up properly when kstat_create fails
On error, kstat_create() would free the sysctl context and the kstat
itself, but missed the lock and most importantly, any memory allocated
for ks_data. Sending those error cases through to kstat_delete() handles
all the cleanup necessary.
Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Matthew Ahrens <matt at mahrens.org>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19789
kstat: don't set ks_data for KSTAT_TYPE RAW
It's used for internal kstat stuff, nothing to do with us.
Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Matthew Ahrens <matt at mahrens.org>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19789
kstat: fix use of ks_data and KSTAT_FLAG_VIRTUAL
We've been holding this wrong in a few places. KSTAT_FLAG_VIRTUAL is for
when ks_data will outlive the kstat (ie continue to exist after
kstat_delete() returns). In a few places, we allocated and set up
ks_data before the kstat is published (allowed!), but free it before it
is unpublished in kstat_delete(), so if the kstat is read then, it would
access already-freed memory.
The kstat API already allows for this case. If we don't set
KSTAT_FLAG_VIRTUAL, kstat_create() will allocate ks_data for us, and
then free it at a safe time in kstat_delete() after the kstat has been
unpublished.
Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Matthew Ahrens <matt at mahrens.org>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19789
kstat: always NULL the kstat_t* after freeing it
Doing it in some places but not others is confusing.
Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Matthew Ahrens <matt at mahrens.org>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19789
L2ARC: Do not stop writing when l2arc_headroom is 0
zfs.4 documents l2arc_headroom=0 as removing the per-cycle headroom
limit, and l2arc_write_sublist() still treats it so. Since 3523b5f3f,
however, l2arc_write_buffers() also stops a pass once its consumed
headroom reaches the headroom, which with l2arc_headroom=0 is 0 from
the start: no sublist is scanned, and nothing is written to any cache
device. Skip that check when l2arc_headroom is 0, as the check it
replaced did.
Add l2arc_headroom_zero_pos, which reads data with l2arc_headroom=0
and checks that the cache device received buffers.
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Tigerblue77 <37409593+tigerblue77 at users.noreply.github.com>
Closes #19628
[CIR][SYCL] Emit sycl_in_device field to the for cir.lowering_options (#238117)
Add sycl_is_device field to the `cir.lowering_options`. This is
populated during CIRGen time from `langOpts.SYCLIsDevice`.
[lld] Add a fast path to lld::utils::getRootSymbol() (#240407)
StringRef::rsplit() calls StringRef::rfind(), which calls
string_view::rfind(), which is a naive reverse loop at least in libc++.
Most symbols don't contain `.` characters, so quickly check for that
(which uses an optimzied string search, which is much faster).
(We could instead revert 2f851f26ead0ea and move StringRef::rfind() back
to its own impl and then do something like 4d681d7dc49 / 233edd20a774bbc
to make it faster, but it seems there's a desire to make StringRef
*more* like string_view over time. And also, using that all args we pass
to it here contain a `.` is a real higher-level optimization.)
This code is hot in ld64.lld when using -order_file.
Reduces link time of a release static symbol_level=1 aarch64 Chromium
Framework link from 4.533 s ± 0.017 s to 4.252 s ± 0.045 s, a ~6%
reduction.
[3 lines not shown]
[SLP][AMDGPU][NFC] Add a test of FP chains in short blocks (#241014)
Chained complex multiplies in a short block, in a loop, after a loop and
across a branch, on gfx942. SLP keeps all of them scalar today.
[libc][test] Guard custom matchers with LIBC_TEST_HAS_MATCHERS() (#241062)
Commit 528affb94ef8 (#240616) updated ErrnoSetterMatcher and FPMatcher
to
inherit from Matcher<T> and accept MatchResultListener * without
guarding
the matcher definitions on LIBC_TEST_HAS_MATCHERS(). Downstream test
frameworks that do not support matchers (such as Fuchsia's zxtest and
Pigweed's light pw_unit_test) fail to compile headers that transitively
include FPMatcher.h for FPTest or DECLARE_SPECIAL_CONSTANTS (e.g.
stdfix/ExpTest.h) or include ErrnoSetterMatcher.h.
Guard the matcher classes, factory helpers, and EXPECT_THAT/ASSERT_THAT
macros in ErrnoSetterMatcher.h and FPMatcher.h with
LIBC_TEST_HAS_MATCHERS(), keeping FPTest, DECLARE_SPECIAL_CONSTANTS, and
non-matcher rounding helpers unconditionally available, and replace the
unused ErrnoSetterMatcher.h include in snprintf_test.cpp with direct
CPP/limits.h.
[2 lines not shown]
[ConstraintElim] Split signed min/max across their operands when checking a compare
The existing constraint systems only record the bounds that hold for both
operands of a min/max (smax(a, b) >= a and >= b, smin(a, b) <= a and <= b). The
other direction is a disjunction, which cannot be recorded as a fact. When a
compare of signed decompositions involves a min/max result, split it into its
operands: the decomposition is monotonic in that result, so it is the max or min
of its values on each side, and the relation holds for all or for either side
respectively.
https://alive2.llvm.org/ce/z/zsGkJ-
[ConstraintElim] Prove sadd/ssub.with.overflow cannot overflow from the exact sum
Decompose the operands and show that the sum lies in the range of the type. This
handles patterns like A + (B - A), as well as sums involving signed min/max
results, which are split across their respective operands using monotonicity
(for example start + smax(end - start - 1, 0) <= end).
https://alive2.llvm.org/ce/z/ze8LCk
[ConstraintElim] A signed sum of operands with opposite signs cannot wrap
If one operand is known non-negative and the other non-positive, the signed
sum is between them, so it cannot overflow.
https://alive2.llvm.org/ce/z/ZF5Yqr
ZTS: fix device_access tests on whole disks
The device_access tests fail when $DISKS are disks that ZFS uses as
whole disks, such as NVMe or SCSI disks, rather than loop devices.
ZFS partitions such a disk and opens partition 1 (nvme1n1p1, sdb1),
not the disk node whose mode the tests change.
- Compare the disk that holds each vdev in check_vdevs().
- Set the mode of a disk's partitions along with the disk, so that
an import without CAP_DAC_OVERRIDE cannot open them.
- Wait for udev before setting the mode, and set it again after a
command that relabels the disk, since udev then resets the mode.
- Import and destroy the pool in device_access_import cleanup, since
labelclear on a whole disk misses the labels in its partition.
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Tony Hutter <hutter2 at llnl.gov>
Signed-off-by: Matthew Ahrens <matt at mahrens.org>
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
Closes #19791
monetary.h: Adjust exposure for strfmon_l() and locale_t
In Posix Issue 7 (2008), strfmon_l() was added to the standard,
and is intended to be declared in <monetary.h>, as is locale_t
required to be defined by it (as strfmon_l() uses it).
As usual, we're running just a little late... but we're up to date now!
ZTS: remove scsi_debug, not NVMe, disks in reopen tests
zpool_reopen_001_pos through _005_pos and auto_online_001_pos fail
when $DISKS are NVMe disks. on_off_disk() can only remove and
reinsert SCSI disks, but these tests remove $DISK1 whenever lsblk
reports it as a disk, which NVMe disks are too. Writing "offline"
to the NVMe controller's read-only state attribute fails.
- Remove $DISK1 only when it is a SCSI or multipath disk. Otherwise
remove the scsi_debug device, as the tests already do for loop
devices.
- Clear zpool_reopen labels by short name, so that zpool finds the
partition on a whole NVMe disk (nvme1n1p1, not nvme1n11).
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Tony Hutter <hutter2 at llnl.gov>
Signed-off-by: Matthew Ahrens <matt at mahrens.org>
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
Closes #19790
[RuntimeLibcalls] Extend i32 libcall arguments and returns on VE (#240638)
clang adds `sign-/zeroext` attributes to `int`/`unsigned` for VE.
Libcalls synthesized by the compiler lacked the those attributes.
Assisted-by: Claude
ZTS: removal_with_add fails on disks with 4K sectors
During a device removal, a new top-level vdev must have the pool's
ashift. The test adds a file vdev, which gets ashift 9, so on 4K-sector
disks (ashift 12) the add fails with EINVAL. libzfs reports that EINVAL
as "a pool with removing/removed vdevs does not support adding raidz or
dRAID vdevs", which hides the cause.
Add the file vdev with the largest ashift of the pool's vdevs, from the
ashift vdev property.
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Tony Hutter <hutter2 at llnl.gov>
Reviewed-by: Rob Norris <rob.norris at truenas.com>
Reviewed by: George Wilson <gwilson at zfsmail.com>
Signed-off-by: Matthew Ahrens <matt at mahrens.org>
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
Closes #19787
[Hexagon] Add assembly mapping for LX_mux_h_alt (#241036)
Map the alternate conditional syntax to LX_mux_h while preserving the
operand order.
Co-authored-by: Alexey Karyakin <akaryaki at quicinc.com>
[MSP430] Fix the underlying type of wint_t (#240972)
This is a minor ABI change since the behavior can only be observed when
extending `wint_t` to a wider type.
[Xtensa][NFC] Fix immediate operand predicates (#235122)
Correct operator precedence in alignment checks and add the missing
four-byte alignment constraint to imm64n_4n.
These don't seem to be currently used by any selection pattern, so there
is no functional change.