LLVM/project 4d1b6df — llvm/lib/CodeGen TargetInstrInfo.cpp, llvm/test/CodeGen/AArch64 machine-combiner-eor.mir machine-combiner-reassociate-accumulators.mir

CodeGen: Stop adding kill flags in MachineCombiner reassociation (#234677)

Work towards removing pre-RA kill flag management from all passes.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+24-24llvm/test/CodeGen/AArch64/machine-combiner-reassociate-accumulators.mir
+11-21llvm/lib/CodeGen/TargetInstrInfo.cpp
+6-6llvm/test/CodeGen/RISCV/machine-combiner-mir.ll
+4-4llvm/test/CodeGen/Hexagon/machine-combiner-reassoc.mir
+2-2llvm/test/CodeGen/RISCV/rvv/machine-combiner-subreg-verifier-error.mir
+2-2llvm/test/CodeGen/AArch64/machine-combiner-eor.mir
+49-594 files not shown
+53-6310 files

LLVM/project a5e0876 — llvm/lib/Transforms/Vectorize VPlanConstruction.cpp LoopVectorize.cpp, llvm/test/Transforms/LoopVectorize select-min-max-last-index-epilogue.ll epilog-vectorization-reductions.ll

[VPlan] Model the connected main-loop CFG and epilogue resume values. (#229921)

Update modelGeneratedMainLoopBlocks to also connect the main loop
minimum iteration check to the epilgoue vector preheader in VPlan
directly.

This allows creating the resume values for the epilogue vector loop
directly in VPlan (in preparePlanForEpilogueVectorLoop). This replaces a
bunch of IR-based fixup logic (fixScalarResumeValuesFromBypass,
connectEpilogueVectorLoop).

It also removes the need to create resume phis in the main plan, which
were only used to patch up the resume phis created in the epilogue plan;
now they are created in a single place.

This also means we no longer need various IR based DT & CFG updates, as
everything is now handled naturally during VPlan execution.

PR: https://github.com/llvm/llvm-project/pull/229921
DeltaFile
+81-237llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+70-84llvm/test/Transforms/LoopVectorize/VPlan/epilogue-vectorization-printing.ll
+33-15llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+6-6llvm/test/Transforms/LoopVectorize/select-min-max-last-index-epilogue.ll
+6-6llvm/test/Transforms/LoopVectorize/epilog-vectorization-reductions.ll
+6-6llvm/test/Transforms/LoopVectorize/epilog-iv-select-cmp.ll
+202-3547 files not shown
+230-37813 files

LLVM/project d225dc9 — clang/test/CIR/Lowering ternary.cir strictfp.cir, clang/test/CIR/Tools warn-default-triple.cir

[NFC][CIR] Fix x86_64 Linux REQUIRES in CIR tests (#234244)

target={{x86_64-linux}} must match the whole triple, so these tests
never ran on x86_64-unknown-linux-gnu
DeltaFile
+1-1clang/test/CIR/Tools/warn-default-triple.cir
+1-1clang/test/CIR/Lowering/ternary.cir
+1-1clang/test/CIR/Lowering/strictfp.cir
+1-1clang/test/CIR/Lowering/select.cir
+1-1clang/test/CIR/Lowering/ptr-stride-index-width.cir
+1-1clang/test/CIR/Lowering/poison.cir
+6-62 files not shown
+8-88 files

LLVM/project 100fc69 — llvm/utils/TableGen/Common CodeGenRegisters.cpp

Remove the now redundant empty intersection check

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+0-4llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+0-41 files

LLVM/project 48f56e8 — libc/src/__support/math CMakeLists.txt tanpif16.h, libc/test/src/math tanpif_test.cpp tanpif16_test.cpp

[libc][math][c23] Fix signed zeros in `tanpif` and `tanpif16` (#230371)

Fixes
https://github.com/llvm/llvm-project/pull/147192#issuecomment-5727303853.

- Use shared integer and parity checks to return the correct zero sign
for integer inputs.
- Add regression tests and update CMake and Bazel dependencies.

ref: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1946.pdf
DeltaFile
+31-26libc/src/__support/math/tanpif.h
+29-24libc/src/__support/math/tanpif16.h
+16-0libc/test/src/math/tanpif_test.cpp
+16-0libc/test/src/math/tanpif16_test.cpp
+5-3libc/src/__support/math/CMakeLists.txt
+2-0utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+99-536 files

LLVM/project e125fd1 — llvm/lib/Analysis InstructionSimplify.cpp

[InstSimplify] Match the GEP index before stripping the base. (NFC) (#234880)

Avoid a large number of unnecessary
stripAndAccumulateInBoundsConstantOffsets calls by first checking if the
last index is Not/Neg(PtrToInt).

stage1-O3: +0.16%
stage1-ReleaseThinLTO: +0.20%
stage1-ReleaseLTO-g: +0.15%
stage1-aarch64-O3: +0.14%
stage2-O3: +0.18%
stage2-clang: -0.14%


https://llvm-compile-time-tracker.com/compare.php?from=b0826948e9be08adfefde603e42815a06a9f8b33&to=27bf8f08981ee5be61362fa1f03766e43e7a2d49&stat=instructions:u

Aided by Opus 5.5

PR: https://github.com/llvm/llvm-project/pull/234880
DeltaFile
+8-11llvm/lib/Analysis/InstructionSimplify.cpp
+8-111 files

LLVM/project e065eff — clang/lib/CIR/CodeGen CIRGenExprCXX.cpp, clang/test/CIR/CodeGen new-delete.cpp new-delete-deactivation.cpp

[CIR] Match OGCG noalias and memory effects on operator new (#221818)

Co-authored-by: Cursor <cursoragent at cursor.com>
DeltaFile
+46-46clang/test/CIR/CodeGen/new.cpp
+19-19clang/test/CIR/CodeGenCXX/new-array-init.cpp
+24-0clang/test/CIR/CodeGen/operator-new-noalias.cpp
+11-11clang/test/CIR/CodeGen/new-delete-deactivation.cpp
+15-4clang/lib/CIR/CodeGen/CIRGenExprCXX.cpp
+8-8clang/test/CIR/CodeGen/new-delete.cpp
+123-886 files not shown
+143-10212 files

LLVM/project bd4046e — .github/workflows libc-shared-tests.yml libc-fullbuild-tests.yml

Update Docker image digest values to the latest
DeltaFile
+3-3.github/workflows/libc-overlay-tests.yml
+2-2.github/workflows/libc-shared-tests.yml
+2-2.github/workflows/libc-fullbuild-tests.yml
+2-2.github/workflows/compiler-rt-libc-builtins-tests.yml
+9-94 files

LLVM/project e8b9d2a — llvm/include/llvm/TargetParser CMakeLists.txt, llvm/lib/Target/PowerPC PPCTargetParserDef.td

PowerPC: Use minimal tablegen inputs for TargetParser (#233061)

Generate PPCGenTargetFeatures.inc from a file that only includes the
feature and processor definitions, instead of the full PPC.td. Add
stub SchedMachineModel, as was recently done for AArch64 in #231954,
since the TargetParser usage does not need them.

llvm-min-tblgen -gen-target-features

                         Gigainstructions  Peak RSS  .td deps
  PPC.td                 1.72              85 MB     81
  PPCTargetParserDef.td  0.01               6 MB      7

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+33-0llvm/lib/Target/PowerPC/PPCTargetParserDef.td
+1-1utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
+1-1llvm/utils/gn/secondary/llvm/include/llvm/TargetParser/BUILD.gn
+1-1llvm/include/llvm/TargetParser/CMakeLists.txt
+36-34 files

LLVM/project 948a5b4 — llvm/lib/Target/PowerPC PPC.td PPCProcessors.td

PowerPC: Move processor definitions to PPCProcessors.td (#233060)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+148-0llvm/lib/Target/PowerPC/PPCProcessors.td
+1-140llvm/lib/Target/PowerPC/PPC.td
+149-1402 files

LLVM/project 35383f8 — llvm/lib/Target/PowerPC PPC.td PPCFeatures.td

PowerPC: Move subtarget features to PPCFeatures.td (#233059)

Move the subtarget features, predicates and processor feature lists out
of PPC.td, so they can be used without parsing the instruction and
register definitions.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+574-0llvm/lib/Target/PowerPC/PPCFeatures.td
+1-566llvm/lib/Target/PowerPC/PPC.td
+575-5662 files

LLVM/project f9edbc7 — llvm/lib/Target/PowerPC PPC.td PPCRegisterInfo.td

PowerPC: Move the PPC32 and PPC64 hardware modes to PPCRegisterInfo.td (#233058)

They are only used by the register, instruction and calling convention
definitions. This allows the feature definitions to be used without
HwMode.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+0-7llvm/lib/Target/PowerPC/PPC.td
+7-0llvm/lib/Target/PowerPC/PPCRegisterInfo.td
+7-72 files

LLVM/project 5232f99 — libc/src/__support/CPP bitset.h, libc/src/__support/regex regex_parser.cpp

[libc][regex] Add bracket expressions and character ranges (#234895)

Implement POSIX bracket expressions in parse_ere, compiling character
lists, character ranges, and negated sets into canonical ByteSet nodes.
In POSIX regular expressions, bracket expressions support literal right
brackets when placed first, literal hyphens when placed at the start or
end of a list, and character range endpoints. Negated bracket
expressions must exclude the NUL byte and exclude newlines when
REG_NEWLINE is specified.

Add parse_bracket_expr and parse_coll_elem to parse single bytes,
ranges, and collating elements into a 256-bit bitset. This
implementation intentionally covers 8-bit byte values and US-ASCII
ranges, with multi-byte UTF-8 range compilation scheduled for a
subsequent patch. Enforce POSIX error reporting for unclosed brackets
(REG_EBRACK), reversed or chained ranges (REG_ERANGE), and unknown
multi-character collating symbols outside the POSIX locale
(REG_ECOLLATE). Guard POSIX character class prefixes with REG_BADPAT
until subsequent class support lands.

    [6 lines not shown]
DeltaFile
+115-1libc/test/src/regex/regex_basic_test.cpp
+106-4libc/test/src/__support/regex/matcher_test.cpp
+85-1libc/src/__support/regex/regex_parser.cpp
+4-0libc/src/__support/CPP/bitset.h
+310-64 files

LLVM/project caf5d00 — libc/docs/dev code_style.md, libc/src/__support/CPP CMakeLists.txt optional.h

[libc] Trap on invalid expected and optional value() (#232812)

Standard std::expected::value and std::optional::value throw an
exception when no value is present, distinguishing them from unchecked
operator* access. Because LLVM-libc compiles with -fno-exceptions,
cpp::expected::value and cpp::optional::value previously behaved
identically to operator* and silently read the inactive union member on
error or empty states.

Guard value() in both cpp::expected and cpp::optional with a !NDEBUG
check that calls __builtin_trap() when a value is not present. Using
__builtin_trap() directly avoids a circular header dependency between
expected.h, libc_assert.h, and the Linux syscall ErrorOr wrappers while
preserving constexpr evaluation.

Assisted-by: Automated tooling, human reviewed.
DeltaFile
+90-0libc/test/src/__support/CPP/expected_test.cpp
+69-12libc/src/__support/CPP/expected.h
+52-0libc/test/src/__support/CPP/optional_test.cpp
+51-0libc/docs/dev/code_style.md
+39-4libc/src/__support/CPP/optional.h
+7-0libc/src/__support/CPP/CMakeLists.txt
+308-166 files

LLVM/project 55bc2b6 — mlir/include/mlir/Dialect/GPU/Transforms Passes.td, mlir/lib/Dialect/GPU/Transforms ROCDLAttachTarget.cpp SubgroupReduceLowering.cpp

[mlir][gpu] Split target-specific passes out of MLIRGPUTransforms (#234903)

MLIRGPUTransforms linked every GPU target: the AMDGPU, LLVM, ROCDL and
XeVM dialects, plus MLIRNVVMTarget, MLIRROCDLTarget, MLIRSPIRVTarget and
MLIRExecutionEngineUtils. So any user of any target-specific or
target-independent GPU pass also pulled in every target's dialect and
serialization library.

Move the target-specific passes and patterns into one library per
target. Each has its own Passes.td and Passes.h and links only its own
target dialect.
MLIRGPUTransforms no longer has any target dependencies at all.

---------

Co-authored-by: Claude <noreply at anthropic.com>
DeltaFile
+3-245mlir/lib/Dialect/GPU/Transforms/SubgroupReduceLowering.cpp
+238-0mlir/lib/Dialect/GPU/Transforms/ROCDL/SubgroupReduceToDPP.cpp
+0-201mlir/include/mlir/Dialect/GPU/Transforms/Passes.td
+0-176mlir/lib/Dialect/GPU/Transforms/ROCDLAttachTarget.cpp
+175-0mlir/lib/Dialect/GPU/Transforms/ROCDL/ROCDLAttachTarget.cpp
+105-0mlir/lib/Dialect/GPU/Transforms/ROCDL/PromoteShuffleToAMDGPU.cpp
+521-62245 files not shown
+1,433-1,05351 files

LLVM/project 8770f6a — llvm/utils/TableGen/Common CodeGenRegisters.cpp

TableGen: Skip disjoint register classes before intersecting them

inferCommonSubClass intersects the member lists of a register class
with every other class, and most pairs are disjoint. Check that with
the member bit vectors first, which avoids loading the members and
allocating the intersection.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    576               346            111
  After     573 (-0.6%)       343 (-0.7%)    110 (-0.6%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+4-0llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+4-01 files

LLVM/project 43acccc — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Compute register sizes once for the sub-register size check

checkSubRegIndexSizes found the size of each register by scanning every
register class for one containing it, about 18 million class membership
tests for AMDGPU. Compute the size of all registers in one pass over
the members of each register class instead, and pass it in.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    578               355            113
  After     576 (-0.2%)       345 (-2.8%)    110 (-2.4%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+26-24llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+3-2llvm/utils/TableGen/Common/CodeGenRegisters.h
+29-262 files

LLVM/project 752c363 — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Test register sub-classes with the member bit vectors

computeSubClasses checks whether one register class contains another
for most pairs of classes, by walking both sorted member lists. That
reads every member register, which is slow for AMDGPU's 913 classes.
Each class already has a bit vector of its members, so compare those
instead.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    596               365            117
  After     577 (-3.1%)       353 (-3.4%)    112 (-3.7%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+4-1llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+3-0llvm/utils/TableGen/Common/CodeGenRegisters.h
+7-12 files

LLVM/project db76895 — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Skip redundant addComposite calls for secondary sub-registers

computeSecondarySubRegs calls addComposite for every index of every new
sub-register, and almost all of these calls repeat a composition that
is already known. For AMDGPU, only about 15000 of 29.8 million calls add
anything. Skip the call if the composition is known and its result has
an offset in every mode, since it would do nothing.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    603               367            116
  After     595 (-1.3%)       362 (-1.2%)    115 (-1.0%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+6-0llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+1-1llvm/utils/TableGen/Common/CodeGenRegisters.h
+7-12 files

LLVM/project 6f8b5f8 — llvm/utils/TableGen/Common CodeGenRegisters.cpp

TableGen: Index registers by sub-register index enum value when inferring sub-classes

inferSubClassWithSubReg groups the members of a register class by each
of their sub-register indices, and looked up every index of every member
in a std::map. Sub-register indices are numbered densely, so use a
vector indexed by enum value instead. Also count the members once
instead of once per index.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    622               380            120
  After     604 (-3.0%)       367 (-3.4%)    115 (-3.7%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+12-16llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+12-161 files

LLVM/project 0f6a13b — llvm/utils/TableGen RegisterInfoEmitter.cpp, llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Store super-register class sets as bit vectors

extendSuperRegClasses adds the super-register classes of each register
class's super-classes to its own, by merging their sets. The sets were
DenseSets, so most of the time went to hashing classes that were already
present.

Store the sets as bit vectors instead, so merging is a bitwise or. They
are indexed by a new CreationIndex, since EnumValue isn't assigned until
all classes have been inferred.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    700               435            135
  After     622 (-11.1%)      381 (-12.5%)   120 (-11.2%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+20-12llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+24-5llvm/utils/TableGen/Common/CodeGenRegisters.h
+1-1llvm/utils/TableGen/RegisterInfoEmitter.cpp
+45-183 files

LLVM/project 276b76a — llvm/utils/TableGen/Common CodeGenRegisters.h

Assert that the CreationIndex is set in addSuperRegClass

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+1-0llvm/utils/TableGen/Common/CodeGenRegisters.h
+1-01 files

LLVM/project 22dabdd — llvm/lib/Transforms/Scalar JumpTableToSwitch.cpp, llvm/test/Transforms/JumpTableToSwitch ub-calls.ll

[JumpTableToSwitch] Transform when the table has values that are UB when called (#234540)

Fixes #40197
DeltaFile
+102-0llvm/test/Transforms/JumpTableToSwitch/ub-calls.ll
+16-6llvm/lib/Transforms/Scalar/JumpTableToSwitch.cpp
+118-62 files

LLVM/project fd6f178 — llvm/utils/TableGen/Common CodeGenRegisters.cpp

TableGen: Skip disjoint register classes before intersecting them

inferCommonSubClass intersects the member lists of a register class
with every other class, and most pairs are disjoint. Check that with
the member bit vectors first, which avoids loading the members and
allocating the intersection.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    576               346            111
  After     573 (-0.6%)       343 (-0.7%)    110 (-0.6%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+4-0llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+4-01 files

LLVM/project 0d94668 — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Compute register sizes once for the sub-register size check

checkSubRegIndexSizes found the size of each register by scanning every
register class for one containing it, about 18 million class membership
tests for AMDGPU. Compute the size of all registers in one pass over
the members of each register class instead, and pass it in.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    578               355            113
  After     576 (-0.2%)       345 (-2.8%)    110 (-2.4%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+26-24llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+3-2llvm/utils/TableGen/Common/CodeGenRegisters.h
+29-262 files

LLVM/project 520baa0 — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Test register sub-classes with the member bit vectors

computeSubClasses checks whether one register class contains another
for most pairs of classes, by walking both sorted member lists. That
reads every member register, which is slow for AMDGPU's 913 classes.
Each class already has a bit vector of its members, so compare those
instead.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    596               365            117
  After     577 (-3.1%)       353 (-3.4%)    112 (-3.7%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+4-1llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+3-0llvm/utils/TableGen/Common/CodeGenRegisters.h
+7-12 files

LLVM/project 42a7e6a — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Skip redundant addComposite calls for secondary sub-registers

computeSecondarySubRegs calls addComposite for every index of every new
sub-register, and almost all of these calls repeat a composition that
is already known. For AMDGPU, only about 15000 of 29.8 million calls add
anything. Skip the call if the composition is known and its result has
an offset in every mode, since it would do nothing.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    603               367            116
  After     595 (-1.3%)       362 (-1.2%)    115 (-1.0%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+6-0llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+1-1llvm/utils/TableGen/Common/CodeGenRegisters.h
+7-12 files

LLVM/project 027bd68 — llvm/utils/TableGen/Common CodeGenRegisters.cpp

TableGen: Index registers by sub-register index enum value when inferring sub-classes

inferSubClassWithSubReg groups the members of a register class by each
of their sub-register indices, and looked up every index of every member
in a std::map. Sub-register indices are numbered densely, so use a
vector indexed by enum value instead. Also count the members once
instead of once per index.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    622               380            120
  After     604 (-3.0%)       367 (-3.4%)    115 (-3.7%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+12-16llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+12-161 files

LLVM/project 510cc94 — llvm/utils/TableGen RegisterInfoEmitter.cpp, llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Store super-register class sets as bit vectors

extendSuperRegClasses adds the super-register classes of each register
class's super-classes to its own, by merging their sets. The sets were
DenseSets, so most of the time went to hashing classes that were already
present.

Store the sets as bit vectors instead, so merging is a bitwise or. They
are indexed by a new CreationIndex, since EnumValue isn't assigned until
all classes have been inferred.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    700               435            135
  After     622 (-11.1%)      381 (-12.5%)   120 (-11.2%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+20-12llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+24-5llvm/utils/TableGen/Common/CodeGenRegisters.h
+1-1llvm/utils/TableGen/RegisterInfoEmitter.cpp
+45-183 files

LLVM/project 7313d6e — llvm/utils/TableGen/Common CodeGenRegisters.h CodeGenRegisters.cpp

TableGen: Avoid binary searches for sub-registers of similar registers (#234791)

inferMatchingSuperRegClass looks up the sub-register at one index for
every member of a register class. Members of a class almost always have
the same sub-register indices, so the index is usually at the same
position in each member's sorted array. Pass the position found in the
previous member as a hint, and only binary search if it doesn't match.

AMDGPU tablegen runs that build the register bank:

            Gigainstructions  Gigacycles     CPU seconds
  Before    720               442            138
  After     701 (-2.7%)       437 (-1.2%)    137 (-1.2%)

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+8-3llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+6-2llvm/utils/TableGen/Common/CodeGenRegisters.h
+14-52 files