LLVM/project cddbd1f — libc/src/__support/printf_core core_structs.h parser.h

[libc] Delete CharConstant utility from printf_core/core_structs.h. (#229193)

This helper was added in #222988, but this was a silly
over-complication. ASCII *strings* are not valid UTF-16 or UTF-32, but
the integral values for individual characters map directly to all Unicode encodings.
DeltaFile
+80-81libc/src/__support/printf_core/parser.h
+3-20libc/src/__support/printf_core/core_structs.h
+83-1012 files

LLVM/project 476943f — llvm/lib/Transforms/Vectorize LoopVectorize.cpp

[LV] Remove EpilogueLoopVectorizationInfo (NFC). (#229411)

EpilogueLoopVectorizationInfo only holds the main loop VF and UF and the
epilogue VF, which are already available in processLoop. Use them
directly and pass them to preparePlanForEpilogueVectorLoop instead.
DeltaFile
+22-40llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+22-401 files

LLVM/project acdb545 — clang/lib/Driver/ToolChains Darwin.cpp, clang/test/Driver darwin-static-lib-universal.c sysroot.c

clang: Do not pass an empty -syslibroot for --sysroot= on Darwin

-isysroot and DEFAULT_SYSROOT, but it checked only for the presence
of the option. An empty --sysroot= then produced -syslibroot "",
where previously it fell through to -isysroot. An empty --sysroot= is
the usual way to defeat DEFAULT_SYSROOT, so treat it as absent.

Use this to fix the darwin-static-lib tests when clang is built with
DEFAULT_SYSROOT or CLANG_USE_XCSELECT.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+11-11clang/test/Driver/darwin-static-lib.c
+12-0clang/test/Driver/sysroot.c
+2-1clang/lib/Driver/ToolChains/Darwin.cpp
+1-1clang/test/Driver/darwin-static-lib-universal.c
+26-134 files

LLVM/project e760812 — clang/test/Driver nostdlib.c

clang: Fix nostdlib.c test with CLANG_USE_XCSELECT

With CLANG_USE_XCSELECT, the driver injects the host macOS SDK as the sysroot
for the i386-apple-darwin run line. The SDK does not support i386, so
-Wincompatible-sysroot fires. Pass --no-xcselect, as other darwin driver tests
do.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+1-1clang/test/Driver/nostdlib.c
+1-11 files

LLVM/project a0afcc1 — llvm/include/llvm/CodeGen SlotIndexes.h, llvm/lib/CodeGen SlotIndexes.cpp

[SlotIndexes] Add queries for stale indexes

An erased instruction leaves its index list entry in place, making the
index indistinguishable from a block boundary entry. Add
isBlockBoundaryIndex() and isStaleIndex() to tell the two apart, and
canonicalizeIndex() to resolve a stale index to the closest preceding
instruction's register slot, or the block start if none survives.

NFC. No caller yet. LiveDebugVariables is next.
DeltaFile
+207-0llvm/unittests/CodeGen/SlotIndexesTest.cpp
+29-0llvm/lib/CodeGen/SlotIndexes.cpp
+14-0llvm/include/llvm/CodeGen/SlotIndexes.h
+1-0llvm/unittests/CodeGen/CMakeLists.txt
+251-04 files

LLVM/project 3f41463 — llvm/include/llvm/CodeGen LiveDebugVariables.h, llvm/lib/CodeGen LiveDebugVariables.cpp

[LiveDebugVariables] Repair stale SlotIndexes

The analysis keeps its indexes from before the first register allocator
until DBG_VALUEs are emitted, by which point passes in between have
erased some of the instructions they point at. Resolve them at the
start of each allocator run and before emitting.

SlotIndexes can then reclaim the entries of erased instructions without
sparing the ones held here, which would have made generated code depend
on -g. Emitted locations are unchanged, except that intervals resolving
to one position now emit a single DBG_VALUE rather than identical
consecutive ones.
DeltaFile
+140-0llvm/lib/CodeGen/LiveDebugVariables.cpp
+63-0llvm/test/DebugInfo/AMDGPU/live-debug-vars-stale-slot-indexes.ll
+8-4llvm/test/DebugInfo/MIR/X86/live-debug-vars-unused-arg-debugonly.mir
+8-0llvm/include/llvm/CodeGen/LiveDebugVariables.h
+5-2llvm/test/CodeGen/X86/debug-spilled-snippet.mir
+5-2llvm/test/CodeGen/X86/debug-spilled-snippet.ll
+229-81 files not shown
+236-87 files

LLVM/project a9f0bd2 — clang/test/Driver mips-img-v2.cpp baremetal.cpp

clang: Fix tests when built with DEFAULT_SYSROOT

Configuring with DEFAULT_SYSROOT applies the default sysroot to every target,
not just the host/default. This broke cross-target driver tests that expect the
sysroot to be derived from the GCC installation or the driver's install
directory. Pass an empty --sysroot= to defeat the configured default, following
the precedent of 4bc05627199

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+104-104clang/test/Driver/mips-fsf.cpp
+85-85clang/test/Driver/hexagon-toolchain-elf.c
+33-33clang/test/Driver/hexagon-toolchain-picolibc.c
+24-24clang/test/Driver/mips-cs.cpp
+23-23clang/test/Driver/baremetal.cpp
+12-12clang/test/Driver/mips-img-v2.cpp
+281-28110 files not shown
+310-31016 files

LLVM/project 9ff1903 — flang/test/Semantics modfile88.f90

Add testcase
DeltaFile
+73-0flang/test/Semantics/modfile88.f90
+73-01 files

LLVM/project 82bfa97 — flang/include/flang/Parser char-block.h

Add comment
DeltaFile
+2-0flang/include/flang/Parser/char-block.h
+2-01 files

LLVM/project bda64a3 — llvm/lib/Transforms/Vectorize SLPVectorizer.cpp, llvm/lib/Transforms/Vectorize/SLPVectorizer SLPUtils.cpp

Revert "[SLP]Support copyable GEP/zext main ops and relax gather pointer compatibility" (#229397)

It caused "isa<> used on a null pointer" assertion failures. See comment
on the PR for a reproducer.

Reverts llvm/llvm-project#221599
DeltaFile
+75-201llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+0-90llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
+41-35llvm/test/Transforms/SLPVectorizer/AArch64/long-non-power-of-2.ll
+43-13llvm/test/Transforms/SLPVectorizer/RISCV/gep-mixed-index-types.ll
+22-17llvm/test/Transforms/SLPVectorizer/X86/copyable-operands-reordering.ll
+25-8llvm/test/Transforms/SLPVectorizer/RISCV/gather-runtime-stride-with-base-lane.ll
+206-3649 files not shown
+260-45415 files

LLVM/project c9f2a1f — llvm/lib/CodeGen/SelectionDAG TargetLowering.cpp, llvm/test/CodeGen/X86 asm-constraints-rm-callbr-fold.ll asm-constraints-rm-isel.ll

[TargetLowering][X86] Prefer 'r' over 'm' for foldable "rm" inline asm operands

An "rm" (register-or-memory) inline asm operand has always resolved to
'm', because getConstraintPreferences() picks the most general
constraint present, and 'm' is more general than 'r'. That's safe, since
memory can't run out, but it forces a value that could stay in a
register through a stack slot even when there's no register pressure
(https://github.com/llvm/llvm-project/issues/20571).

Prefer 'r' instead where the register allocator can fold the register
back to a stack slot when it runs out of registers, and mark the
register operand foldable (InlineAsm::Flag::setRegMayBeFolded()) so it
does. Both allocators can: the greedy allocator folds an operand when it
spills its value, and the fast allocator folds operands up front when
the asm's register operands wouldn't fit.

ParseConstraints() sets AsmOperandInfo::MayFoldRegister for an operand
whose constraint codes are exactly {r, m}, above -O0, on a target that
opts in through the new supportsRegMemInlineAsmFolding() hook, which

    [20 lines not shown]
DeltaFile
+767-0llvm/test/CodeGen/X86/asm-constraints-torture.ll
+689-0llvm/test/CodeGen/X86/asm-constraints-rm-pressure.ll
+227-0llvm/test/CodeGen/X86/inline-asm-callbase.ll
+97-0llvm/test/CodeGen/X86/asm-constraints-rm-isel.ll
+74-0llvm/test/CodeGen/X86/asm-constraints-rm-callbr-fold.ll
+51-2llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+1,905-29 files not shown
+1,988-1615 files

LLVM/project cbdacb1 — libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single new.size_nothrow.replace.pass.cpp

[libcxx] Add 'DoNotOptimize' to a test that is missing it. (#228253)

While developing ClangIR, we realized that we emitted slightly better
code here that InstCombine figured out how to omit new/delete in this
test. As a result, this fails with -fclangir.

This usage of DoNotOptimize seems to be the blessed version (according
to the comment on it which perfectly captures this issue?).
DeltaFile
+1-1libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/new.size_nothrow.replace.pass.cpp
+1-11 files

LLVM/project 6c1ee20 — mlir/lib/Target/LLVMIR ModuleImport.cpp, mlir/unittests/Target/LLVM CMakeLists.txt ImportGEPInRange.cpp

[MLIR][LLVM] Import GEP inrange at the index width of its base pointer (#229253)
DeltaFile
+83-0mlir/unittests/Target/LLVM/ImportGEPInRange.cpp
+10-2mlir/lib/Target/LLVMIR/ModuleImport.cpp
+4-1mlir/unittests/Target/LLVM/CMakeLists.txt
+97-33 files

LLVM/project f4fbeed — llvm/lib/CodeGen RegAllocFast.cpp, llvm/test/CodeGen/X86 regallocfast-inline-asm-fold.mir regallocfast-inline-asm-fold-pressure.mir

[RegAllocFast] Fold foldable inline asm operands under register pressure

An inline asm register operand marked foldable (from an "rm" constraint)
may be replaced with a stack slot when the register allocator runs out
of registers. The greedy allocator does that when it spills the value.
The fast allocator can't: it assigns the operands of an instruction one
at a time, and folding replaces the instruction. So it reported
"inline assembly requires more registers than available" instead.

Before allocating a block, estimate from each inline asm's own operands
whether they fit in registers, and fold as many foldable registers as
needed to make them fit, so the common case without pressure still gets
a register. Values that only live across the asm don't count, since the
allocator spills them when it needs their registers. The estimate
follows allocateInstruction():

- First all defs get distinct registers, avoiding physreg defs; then all
  uses, along with the defs still occupied while the uses are read
  (early-clobber and tied defs, see isLiveThroughDef()), get distinct

    [25 lines not shown]
DeltaFile
+479-0llvm/test/CodeGen/X86/regallocfast-inline-asm-fold-pressure.mir
+280-0llvm/lib/CodeGen/RegAllocFast.cpp
+58-0llvm/test/CodeGen/X86/regallocfast-inline-asm-fold.mir
+817-03 files

LLVM/project e6e6daa — llvm/lib/CodeGen/GlobalISel InlineAsmLowering.cpp, llvm/lib/CodeGen/SelectionDAG SelectionDAGBuilder.cpp

[CodeGen] Report an error for a direct inline asm output in memory

An inline asm output returned by value has no memory to write to, yet a
constraint such as "=rm" picks memory, the most general constraint, as
does "=m". SelectionDAG asserted on that ("Can only indirectify direct
input operands!"), and GlobalISel dereferenced a null pointer. Clang
never emits such an output, since it passes the address of a memory
output, but other IR can. Report "cannot handle direct memory outputs
yet for constraint 'm'" instead, like the other inline asm errors there.

Assisted-by: Claude Opus 5.5
DeltaFile
+31-0llvm/test/CodeGen/X86/inline-asm-direct-mem-output-error.ll
+16-6llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+13-0llvm/test/CodeGen/AArch64/inline-asm-direct-mem-output-error.ll
+10-0llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+70-64 files

LLVM/project 4049d4a — llvm/lib/CodeGen TargetInstrInfo.cpp, llvm/test/CodeGen/X86 greedy-inline-asm-fold.mir

[TargetInstrInfo] Fix folding inline asm operands next to tied operands

foldInlineAsmMemOperand() swapped a register operand for the target's
memory operands with MachineInstr::removeOperand(), which asserts when a
later operand is tied, because moving it would break the tie. Inline asm
lists every input after every output, so folding any operand that comes
before another tied pair asserted, e.g. an "rm" input followed by the
input of a "+r" operand, or one of two "+rm" operands. Without
assertions, the moved operands kept stale tie indices. Untie the
operands, rebuild the operand list, and re-tie the remaining pairs at
their new positions.

It also gave up when the register appears in more than one operand, e.g.
one value passed to two "rm" operands, which left the greedy allocator
unable to spill that value at all. Fold every such operand into the
stack slot.

Finally, take MayLoad from the folded operands rather than from every
read of the register: a folded def whose tied use is another virtual

    [8 lines not shown]
DeltaFile
+86-33llvm/lib/CodeGen/TargetInstrInfo.cpp
+80-0llvm/test/CodeGen/X86/greedy-inline-asm-fold.mir
+166-332 files

LLVM/project 8b2ccf5 — llvm/lib/CodeGen MIRPrinter.cpp, llvm/lib/CodeGen/MIRParser MIParser.cpp

[MIR] Serialize the "foldable" inline asm register operand flag

The symbolic MIR syntax for inline asm operand flags dropped
InlineAsm::Flag's RegMayBeFolded bit, which marks a register operand
(from an "rm" constraint) that the register allocator may fold to a
stack slot. Printing MIR and parsing it back therefore silently changed
what the allocator was allowed to do, e.g. with -stop-before and
-run-pass, and a test could only set the bit through a raw numeric flag.

Print the bit as a trailing "foldable", as MachineInstr::print() already
does, and parse it back. A tied use stores its matched operand number in
the same bits, so it never prints the marker.

Assisted-by: Claude Opus 5.5
DeltaFile
+20-6llvm/lib/CodeGen/MIRParser/MIParser.cpp
+25-0llvm/test/CodeGen/MIR/X86/inline-asm-foldable.mir
+9-3llvm/lib/CodeGen/MIRPrinter.cpp
+11-0llvm/test/CodeGen/MIR/Generic/inline-asm-foldable-not-reg.mir
+65-94 files

LLVM/project 6828df8 — llvm/lib/CodeGen EarlyIfConversion.cpp, llvm/test/CodeGen/AArch64 early-ifcvt-load-to-cond-br-limit.mir

[CodeGen] Ignore debug instructions in EarlyIfConversion scan budget (#224495)

`EarlyIfConverter::hasCallOrLoopInRange()` counted raw debug
instructions
against `MaxRegionInstrs`. Enough `DBG_VALUE` instructions could
therefore
stop the data-dependent load-to-condition search and change ordinary
AArch64
code generation.

Use `instructionsWithoutDebug(..., /*SkipPseudoOp=*/false)` for all
ranges
examined by the search and cache the non-debug instruction count for
complete
blocks. The explicit `false` preserves the existing treatment of pseudo
probes. Add a MIR regression test at the scan-budget boundary.

Fixes #224482

AI disclosure: This patch was developed with OpenAI Codex 5.6 Sol and
co-reviewed by Claude and Yongqiang Tian.
DeltaFile
+226-1llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir
+15-7llvm/lib/CodeGen/EarlyIfConversion.cpp
+241-82 files

LLVM/project 525c8a3 — llvm/lib/Bitcode/Reader BitcodeReader.cpp

[BitcodeReader] Avoid integer overflow in strtab bounds check (#228786)

`Record[0] + Record[1]` can wrap, since both are read from the file, so
an out-of-bounds offset passes the check; compare without adding
instead.

Prepared with AI assistance (Claude); I reviewed the change myself.
DeltaFile
+5-1llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+5-11 files

LLVM/project b6be969 — llvm/lib/Transforms/Vectorize VPlanPatternMatch.h VPlanTransforms.cpp, llvm/test/Transforms/LoopVectorize/AArch64 multi-vector-mem-ops-non-power-of-two-unroll.ll multi-vector-mem-ops.ll

[LV] Add support for widening loads/stores to a UF x VF (#217670)

This patch adds support for widening loads and stores to UF x VF. It is
currently limited to unmasked operations, but we plan to extend it to
masked loops via the wide active lane mask.

For now, this is driven by a new TTI hook,
`hasMultiVectorLoadStore`. A small VPlan transform uses that hook to
replace `VPWidenMemoryRecipe` with `WideVectorLoad` or `WideVectorStore`
(and any required extracts/concats).

On AArch64 this is used to target multi-vector load/store instructions.
DeltaFile
+671-0llvm/test/Transforms/LoopVectorize/AArch64/multi-vector-mem-ops.ll
+146-0llvm/test/Transforms/LoopVectorize/VPlan/AArch64/vplan-printing-multi-vector-mem-ops.ll
+74-0llvm/test/Transforms/LoopVectorize/AArch64/multi-vector-mem-ops-non-power-of-two-unroll.ll
+64-4llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+64-0llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+36-1llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+1,055-59 files not shown
+1,158-515 files

LLVM/project aaa29e1 — clang/include/clang/CodeGenUtils FunctionUtils.h CodeGenUtils.h, clang/lib/CodeGenUtils ModuleUtils.cpp ClassUtils.cpp

[CIR][CodeGen][NFC] Retire the CodeGenUtils.h catch-all header

Moves the last helpers out of `CodeGenUtils.h` into `ClassUtils.h`,
`ModuleUtils.h`, `TargetUtils.h` and `FunctionUtils.h` (`checkTargetFeatures`,
since it came from CodeGenFunction.cpp) and deletes the header. Only moves code
already on main, so it can be dropped on its own.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+0-254clang/lib/CodeGenUtils/CodeGenUtils.cpp
+120-0clang/lib/CodeGenUtils/FunctionUtils.cpp
+78-0clang/lib/CodeGenUtils/ClassUtils.cpp
+0-73clang/include/clang/CodeGenUtils/CodeGenUtils.h
+37-0clang/lib/CodeGenUtils/ModuleUtils.cpp
+24-2clang/include/clang/CodeGenUtils/FunctionUtils.h
+259-32916 files not shown
+307-34122 files

LLVM/project 744f543 — clang/include/clang/CodeGenUtils RecordLayoutUtils.h, clang/lib/CIR/CodeGen CIRGenRecordLayoutBuilder.cpp

[CIR][CodeGen][NFC] Share hasOwnStorage

Deduplicates `hasOwnStorage` between CIR and classic CodeGen into
`RecordLayoutUtils.h`.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+4-17clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+1-16clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
+12-0clang/lib/CodeGenUtils/RecordLayoutUtils.cpp
+5-0clang/include/clang/CodeGenUtils/RecordLayoutUtils.h
+22-334 files

LLVM/project 39043ec — clang/include/clang/CodeGenUtils RecordLayoutUtils.h, clang/lib/CIR/CodeGen TargetInfo.cpp

[CIR][CodeGen][NFC] Share isEmptyFieldForLayout and isEmptyRecordForLayout

Deduplicates `isEmptyFieldForLayout` and `isEmptyRecordForLayout` between CIR
and classic CodeGen into a new `RecordLayoutUtils.h`. The 25 callers now name
them as `CodeGenUtils::isEmptyFieldForLayout` and
`CodeGenUtils::isEmptyRecordForLayout`, like the other shared helpers.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+45-0clang/lib/CodeGenUtils/RecordLayoutUtils.cpp
+0-34clang/lib/CIR/CodeGen/TargetInfo.cpp
+34-0clang/include/clang/CodeGenUtils/RecordLayoutUtils.h
+0-33clang/lib/CodeGen/ABIInfoImpl.cpp
+7-6clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+6-5clang/lib/CodeGen/CGExprConstant.cpp
+92-7811 files not shown
+116-11217 files

LLVM/project 99a1fed — clang/include/clang/CodeGenUtils RecordLayoutUtils.h, clang/lib/CIR/CodeGen CIRGenRecordLayoutBuilder.cpp

[CIR][CodeGen][NFC] Share the bit-field and vbase layout ABI predicates

Deduplicates `isDiscreteBitFieldABI` and `isOverlappingVBaseABI` between CIR and
classic CodeGen into `RecordLayoutUtils.h`, as free functions taking the
`ASTContext`.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+6-24clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+3-19clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
+12-0clang/include/clang/CodeGenUtils/RecordLayoutUtils.h
+9-0clang/lib/CodeGenUtils/RecordLayoutUtils.cpp
+30-434 files

LLVM/project 11e9ade — clang/include/clang/CodeGenUtils RecordLayoutUtils.h, clang/lib/CIR/CodeGen CIRGenRecordLayoutBuilder.cpp

[CIR][CodeGen][NFC] Share hasOwnStorage

Deduplicates `hasOwnStorage` between CIR and classic CodeGen into
`RecordLayoutUtils.h`.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+4-17clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+1-16clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
+12-0clang/lib/CodeGenUtils/RecordLayoutUtils.cpp
+5-0clang/include/clang/CodeGenUtils/RecordLayoutUtils.h
+22-334 files

LLVM/project dd200bd — clang/include/clang/CodeGenUtils RecordLayoutUtils.h, clang/lib/CIR/CodeGen CIRGenRecordLayoutBuilder.cpp

[CIR][CodeGen][NFC] Share the bit-field and vbase layout ABI predicates

Deduplicates `isDiscreteBitFieldABI` and `isOverlappingVBaseABI` between CIR and
classic CodeGen into `RecordLayoutUtils.h`, as free functions taking the
`ASTContext`.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+6-24clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+3-19clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
+12-0clang/include/clang/CodeGenUtils/RecordLayoutUtils.h
+9-0clang/lib/CodeGenUtils/RecordLayoutUtils.cpp
+30-434 files

LLVM/project 81f63b9 — clang/include/clang/CodeGenUtils RecordLayoutUtils.h, clang/lib/CIR/CodeGen TargetInfo.cpp

[CIR][CodeGen][NFC] Share isEmptyFieldForLayout and isEmptyRecordForLayout

Deduplicates `isEmptyFieldForLayout` and `isEmptyRecordForLayout` between CIR
and classic CodeGen into a new `RecordLayoutUtils.h`. The 25 callers now name
them as `CodeGenUtils::isEmptyFieldForLayout` and
`CodeGenUtils::isEmptyRecordForLayout`, like the other shared helpers.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+45-0clang/lib/CodeGenUtils/RecordLayoutUtils.cpp
+0-34clang/lib/CIR/CodeGen/TargetInfo.cpp
+34-0clang/include/clang/CodeGenUtils/RecordLayoutUtils.h
+0-33clang/lib/CodeGen/ABIInfoImpl.cpp
+7-6clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+6-5clang/lib/CodeGen/CGExprConstant.cpp
+92-7811 files not shown
+116-11217 files

LLVM/project 7708e93 — clang/include/clang/AST StmtOpenMP.h, clang/lib/CodeGen CGOpenMPRuntime.h CGOpenMPRuntimeGPU.h

[clang][OpenMP] Extend no-loop promotion to the split teams loop

Widen the no-loop promotion to apply not only to the fused target teams
distribute parallel for but include the same region written as separate
directives, other directives promotable to parallel for, and regions
carrying a schedule clause that asks for a mapping a no-loop kernel
already provides.

Use the SPMD_NO_LOOP kernel tag to carry the promotion decision, based
on whether the kernel can get fully promoted to a no-loop kernel. This
eliminates the previous discrepancy where a clause got the tag but not
the promotion.
DeltaFile
+129-1clang/test/OpenMP/target_no_loop.c
+77-17clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+41-39clang/lib/CodeGen/CGStmtOpenMP.cpp
+11-3clang/lib/CodeGen/CGOpenMPRuntimeGPU.h
+10-1clang/include/clang/AST/StmtOpenMP.h
+4-5clang/lib/CodeGen/CGOpenMPRuntime.h
+272-664 files not shown
+278-6810 files

LLVM/project 456cf12 — clang/lib/CodeGen CGOpenMPRuntimeGPU.cpp CGStmtOpenMP.cpp, clang/test/OpenMP target_no_loop.c

[clang][OpenMP] Emit lastprivate final copies in no-loop kernels

Promotion rejected lastprivate because the no-loop branch leaves the
worksharing path before it privatizes or copies out, so the clause would
have been silently dropped.

Privatize the non-counter variables in the parallel region and copy them
out under the last iteration that applyWorkshareLoop publishes, forcing
the exit barrier the copy reads through. Loop counters stay at the
distribute level and reach EmitOMPSimdFinal.
DeltaFile
+53-4clang/lib/CodeGen/CGStmtOpenMP.cpp
+54-1clang/test/OpenMP/target_no_loop.c
+48-0offload/test/offloading/target-no-loop.c
+1-3clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+156-84 files

LLVM/project 650834e — clang/include/clang/CodeGenUtils FunctionUtils.h CodeGenUtils.h, clang/lib/CodeGenUtils ModuleUtils.cpp ClassUtils.cpp

[CIR][CodeGen][NFC] Retire the CodeGenUtils.h catch-all header

Moves the last helpers out of `CodeGenUtils.h` into `ClassUtils.h`,
`ModuleUtils.h`, `TargetUtils.h` and `FunctionUtils.h` (`checkTargetFeatures`,
since it came from CodeGenFunction.cpp) and deletes the header. Only moves code
already on main, so it can be dropped on its own.

Assisted-by: Claude Code (Claude Fable 5.1).
DeltaFile
+0-254clang/lib/CodeGenUtils/CodeGenUtils.cpp
+120-0clang/lib/CodeGenUtils/FunctionUtils.cpp
+78-0clang/lib/CodeGenUtils/ClassUtils.cpp
+0-73clang/include/clang/CodeGenUtils/CodeGenUtils.h
+37-0clang/lib/CodeGenUtils/ModuleUtils.cpp
+24-2clang/include/clang/CodeGenUtils/FunctionUtils.h
+259-32916 files not shown
+307-34122 files