workflows/release-task: Stop uploading lit to test.pypi.org (#214979)
The gh-action-pypi-publish action only supports being run once per job.
Running it twice results in the second upload always failing. Rather
than trying to create a complicated job structure to support uploading
to test.pypi.org and pypi.org, we just remove the test.pypi.org upload
for now.
release-tasks: Disable lit publishing for release candidates (#214972)
There is no rc in the lit version string, so release candidates get
published using the non-rc version number.
[mlir][acc] Fold present() clauses on device values (#212815)
The compiler must emit acc.device_ptr mapping for device values,
however, an existing present clause prevents that. A present on a device
value always holds, so fold it away to allow implicit data handling to
generate device_ptr mapping.
[Hexagon] Fix unusable SCS reg, make it selectable (#213820)
SCS hardcoded r19 as the shadow call stack pointer and required
-ffixed-r19. That was the wrong register to pick: r19 is precisely the
one the intended consumers cannot give up, so the feature was unusable
in practice.
* The Hexagon Linux kernel already reserves r19 for its thread-info
pointer (arch/hexagon/Makefile: "TIR_NAME := r19", documented there as
not configurable because it is hard-coded in several files).
* hexagon-hypervisor reserves r20-r28 (kernel/CMakeLists.txt), with r28
bound to a register global (H2K_gp).
That leaves h2 only r16-r19, so no single hardcoded choice can serve
both consumers.
Intersecting that with the callee-saved regs leaves r1{6,7,8}. So the
new default is r18.
[5 lines not shown]
AMDGPU/GlobalISel: RegBankLegalize rules for uniform i16 extending loads
Extending loads, i8 to i16, are legal on targets with true16.
Note: there is potentially a missing rule for uniform P4 when target
usesTrue16 and hasSMRDSmall but MMO does not satisfy isUL. Wasn't able
to construct an LLVM-IR test for this case, leaving it unsupported.
[libc++] Add tools for gathering historical benchmark data (#212775)
Benchmarking every commit of libc++ is prohibitively expensive: a single
run of the benchmark suite takes hours, and the data has to be
regenerated from scratch whenever the compiler, the OS or the benchmark
machines change. These tools instead sample the history at a coarse
granularity and drive libcxx-benchmark-commit.yml to fill in what is
missing.
Three tools cooperate, meant to be run periodically:
select-anchor-commits picks one commit per calendar bucket from Git
plan-benchmarks diffs that against what LNT already holds
dispatch-benchmarks requests the corresponding workflow runs
They keep no state of their own. They recompute the current and target
states from LNT and the GitHub Actions API, which allows running them in
a CRON. The dispatching of workflows is done using a budget, to avoid
launching tens of jobs and competing with other uses of the CI
[3 lines not shown]
[analyzer] Fix -analyzer-output=html assert on reversed and macro ranges
HTMLDiagnostics::HighlightRange guarded against a reversed range by
comparing line numbers, so a same-line reversal - which is what the piece for
an implicit copy constructor carries - reached html::HighlightRange.
Its scan walks from begin to end, ran off the end of the buffer, and asserted:
https://godbolt.org/z/sTb5qfjjd
Invalid position to insert! (RewriteRope.h)
It also added the end token's length itself and then passed a token range to
html::HighlightRange, which measured the token again, this time from the
interior. For most tokens the two cancel, but where the tail re-lexes longer
the highlight reached past the end of the range, e.g. over a trailing ';'.
Use getExpansionRangeInFile(), which rejects reversed and cross-file ranges,
then convert once and tell html::HighlightRange the range is already
char-granular.
[4 lines not shown]
[analyzer] Fix -analyzer-output=sarif crash on macro-expanded ranges
A path piece whose range ends inside a macro expansion aborted the whole
document: https://godbolt.org/z/61vWYcsWj
Cannot create a physicalLocation from invalid SourceRange!
convertTokenRangeToCharRange() built the end with
Lexer::getLocForEndOfToken(), which returns an invalid location for a macro
ID that is not at the end of its expansion, and used it unchecked. The
analyzer's own test corpus hits this in nine files; text and plist output
were unaffected because both already map such ranges to the expansion.
- Use getExpansionRangeInFile(), so the region covers the macro use like the
other two outputs.
- Fall back to a caret when the range is unusable. A thread flow needs a
location per piece, so dropping one would truncate the reported path. This
also stops reversed ranges producing regions with endColumn < startColumn.
[4 lines not shown]
[clang] Reject ranges getExpansionRangeInFile cannot represent
getExpansionRangeInFile was extracted verbatim and inherited two shortcomings
of the original loop, fixed here before the analyzer's SARIF and HTML consumers
depend on it:
- It mapped the end with getExpansionRange(SourceLocation), which always
reports a token range, so a char-range input was widened by a whole token.
Now using the getExpansionRange(CharSourceRange) overload, which keeps the flag.
- It passed reversed ranges through. Consumers walk begin->end; now returning
nullopt for those, as Lexer::makeFileCharRange already does.
Separate from the extraction so that stays NFC, and out of the consumer fixes
because it changes the shared helper's contract rather than one output.
Both contract changes, plus the invalid- and cross-file-range guards, are
covered by a GetExpansionRangeInFile unit test in
clang/unittests/Frontend/TextDiagnosticTest.cpp.
Assisted-By: claude
[clang][NFC] Extract getExpansionRangeInFile out of the diagnostic renderers (#214460)
Prep for the following commits, which fix crashes in the analyzer's
SARIF and HTML output on ranges that end inside a macro expansion.
Fixing them means mapping such a range into the reported file - the
normalization the frontend text and SARIF renderers already do, and that
the two analyzer consumers each do differently and incorrectly.
Hoist that logic into getExpansionRangeInFile, beside the DiagnosticRenderer
base both frontend renderers derive from, so the fixes reuse one
implementation instead of adding two more copies. TextDiagnostic and
SARIFDiagnostic move onto it here with no behavior change; the analyzer
consumers follow in later commits.
getFileID() replaces SARIFDiagnostic's getDecomposedLoc(...).first - equivalent
here, and what TextDiagnostic has used since c113cbb51005.
Assisted-By: claude
[InstCombine] Fold uadd.sat(X, C) - C to umin(X, ~C) (#215130)
`uadd.sat(X, C) - C --> umin(X, ~C)` for nonzero `C`.
The saturating add gives `X + C` or `UMAX`, so subtracting `C` leaves
`X` or
`UMAX - C`, which is the unsigned minimum. `UMAX - C == ~C`, so the
constant
is just the inverted `C`.
There was already a test documenting this miss in saturating-add-sub.ll
(`test_scalar_uadd_sub_const`) - it folds now.
https://alive2.llvm.org/ce/z/kLFWy7
Fixes #215103
[libc++] Simplify detection of win32-broken-utf8-wchar-ctype (#214797)
Instead of querying `_LIBCPP_HAS_LOCALIZATION` from Python, do it from
the source program. This fixes a bug where if `_LIBCPP_HAS_LOCALIZATION`
was not defined at all (which is the case for older versions of libc++),
the feature would then be defined immediately, regardless of the
platform we're on. That's because `and` has higher precedence than `or`
in Python, so we'd end up skipping the `_WIN32` check entirely.
[lldb][test] Remove Python <= 3.6 workaround (#215262)
re.Pattern was added in 3.7 and our minimum
is now 3.8.
Python 3.6.15:
>>> import re
>>> re.Pattern
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 're' has no attribute 'Pattern'
Python 3.7.17:
>>> import re
>>> re.Pattern
<class 're.Pattern'>
Python 3.8.20:
>>> import re
[3 lines not shown]
Fix AArch64 ISel for unpacked types
Using DUP instructions only really works for packed types, as it will
not introduce the spacing between elements that is required for unpacked
types like nxv2f16.
For those, we'll first broadcast to their corresponding packed type, and
then extract the lo lanes into an unpacked type, effectively introducing
the required spacing.
DAG: Use poison instead of undef in SimplifyDemandedVectorElts
I left getKnownUndefForVectorBinop since I'm not sure
if it's correct to just replace with poison.
DAG: Skip poison elements in BUILD_VECTOR computeKnownBits (#213326)
This defends against regressions in future patches. Copies the logic
from the IR version of computeKnownBits's handling of ConstantVector.
I'm not sure why the IR version doesn't directly return a value for
poison, but this follows suit.
Co-authored-by: Claude (Claude-Opus-4.8)
[clang][bytecode] Remove the !Caller case in Ret opcodes (#215226)
The bottom frame is always created via an `EvalEmitter`, which has its
own implementation of the `Ret` opcode. The exception is
`Context::Run`/`isPotentialConstantExpr`.
[GlobalISel] Fix vector.deinterleave2 with <1 x float> results (#214718)
`translateVectorDeinterleave2Intrinsic` used to try to build
`G_SHUFFLE_VECTOR`
with a scalar result type, which is not valid.
This was the case because the LLT that corresponds to the `<1 x float>`
IR type is a scalar type, not a vector type.
Add a special case for scalar result types to build
`G_EXTRACT_VECTOR_ELT` instead.
Fixes: #214713
[AArch64][GlobalISel] Avoid cross bank copies for NEON vcvtfp2fx results (#213277)
Currently, patterns to avoid cross bank copies for the intrinsic
vcvtfp2fx only work with SelectionDAG. This patch allows the DAG
patterns to work with GlobalISel.
SelectionDAG PR: #210275
[analyzer] Fix -analyzer-output=html assert on reversed and macro ranges
HTMLDiagnostics::HighlightRange guarded against a reversed range by
comparing line numbers, so a same-line reversal - which is what the piece for
an implicit copy constructor carries - reached html::HighlightRange.
Its scan walks from begin to end, ran off the end of the buffer, and asserted:
https://godbolt.org/z/sTb5qfjjd
Invalid position to insert! (RewriteRope.h)
It also added the end token's length itself and then passed a token range to
html::HighlightRange, which measured the token again, this time from the
interior. For most tokens the two cancel, but where the tail re-lexes longer
the highlight reached past the end of the range, e.g. over a trailing ';'.
Use getExpansionRangeInFile(), which rejects reversed and cross-file ranges,
then convert once and tell html::HighlightRange the range is already
char-granular.
[4 lines not shown]
[analyzer] Fix -analyzer-output=sarif crash on macro-expanded ranges
A path piece whose range ends inside a macro expansion aborted the whole
document: https://godbolt.org/z/61vWYcsWj
Cannot create a physicalLocation from invalid SourceRange!
convertTokenRangeToCharRange() built the end with
Lexer::getLocForEndOfToken(), which returns an invalid location for a macro
ID that is not at the end of its expansion, and used it unchecked. The
analyzer's own test corpus hits this in nine files; text and plist output
were unaffected because both already map such ranges to the expansion.
- Use getExpansionRangeInFile(), so the region covers the macro use like the
other two outputs.
- Fall back to a caret when the range is unusable. A thread flow needs a
location per piece, so dropping one would truncate the reported path. This
also stops reversed ranges producing regions with endColumn < startColumn.
[4 lines not shown]