495344 Commits

Author SHA1 Message Date
Dhruv Chawla
208a9850e6 [AArch64][GlobalISel] Avoid splitting loads of large vector types into individual element loads (#85042)
This patch fixes an issue with the legalization of G_LOAD where the
presence of .lowerIfMemSizeNotByteSizePow2 before .clampMaxNumElements
was causing issues for vectors which matched that condition.

Such vectors would be lowered into per-element loads instead of being
split up into 128-bit chunks.
2024-03-18 08:32:17 +05:30
Dhruv Chawla
843a978b6f
[GlobalISel] Add support to moreElementsVector for G_SEXT, G_ZEXT and G_ANYEXT (#85038) 2024-03-18 07:46:17 +05:30
Louis Dionne
6cc8d54a75
[libc++] Add missing hide-from-ABI annotations on virtual functions (#85439) 2024-03-18 09:46:29 +09:00
LLVM GN Syncbot
c0d03d28c5 [gn build] Port 56d45b09dcd6 2024-03-17 23:52:51 +00:00
Nico Weber
f98b556e0f [gn] port f2794ccede6d 2024-03-17 19:52:43 -04:00
Nico Weber
75473cf07e [gn] port c51095f51b77 (InstallAPI diag tablegen) 2024-03-17 19:51:41 -04:00
Petr Hosek
5a4bbaf8c0 [libc] remove.cpp dependency on libc.include.stdio
This addresses a build error introduced by
5a75242bc898886b9833e328ad5f656246424a81.
2024-03-17 16:16:20 -07:00
Xiang Li
4dc037019f
[DirectX] Add DXIL_MODULE_FLAG for ShaderFlags. (#83217)
Add DXIL module flag bit offset for SHADER_FEATURE_FLAG.

Added DXIL_MODULE_FLAG for DXIL module flag which does not have feature flag.

Use DXILModuleFlags for ComputedShaderFlags instead of
ShaderFeatureFlags.

ComputedShaderFlags::getFeatureFlags() was added to get FeatureFlags.

Rename DXContainerGlobals::getShaderFlags to DXContainerGlobals::getFeatureFlags.

Fixes #57925
2024-03-17 19:13:39 -04:00
Noah Goldstein
01d8e1ca01 [ValueTracking] Handle non-canonical operand order in isImpliedCondICmps
We don't always have canonical order here, so do it manually.

Closes #85575
2024-03-17 17:46:06 -05:00
Noah Goldstein
31775e1894 [ValueTracking] Add tests for implied cond with swapped operands; NFC 2024-03-17 17:46:06 -05:00
scythris
8e5de66af3
[clang-format] Fix clang-format issue with 'new' and 'delete' keywords in C files (#85470)
This resolves an issue in clang-format where `new` and `delete` were
incorrectly formatted as keywords in C files. The fix modifies
`TokenAnnotator::spaceRequiredBetween` to handle `new` and `delete` when
used as identifiers for function pointers in structs in C code.
2024-03-17 21:06:32 +01:00
Nikolas Klauser
07b18c5e1b
[libc++] Optimize ranges::fill{,_n} for vector<bool>::iterator (#84642)
```
------------------------------------------------------
Benchmark                          old             new
------------------------------------------------------
bm_ranges_fill_n/1             1.64 ns         3.06 ns
bm_ranges_fill_n/2             3.45 ns         3.06 ns
bm_ranges_fill_n/3             4.88 ns         3.06 ns
bm_ranges_fill_n/4             6.46 ns         3.06 ns
bm_ranges_fill_n/5             8.03 ns         3.06 ns
bm_ranges_fill_n/6             9.65 ns         3.07 ns
bm_ranges_fill_n/7             11.5 ns         3.06 ns
bm_ranges_fill_n/8             13.0 ns         3.06 ns
bm_ranges_fill_n/16            25.9 ns         3.06 ns
bm_ranges_fill_n/64             103 ns         4.62 ns
bm_ranges_fill_n/512            711 ns         4.40 ns
bm_ranges_fill_n/4096          5642 ns         9.86 ns
bm_ranges_fill_n/32768        45135 ns         33.6 ns
bm_ranges_fill_n/262144      360818 ns          243 ns
bm_ranges_fill_n/1048576    1442828 ns          982 ns
bm_ranges_fill/1               1.63 ns         3.17 ns
bm_ranges_fill/2               3.43 ns         3.28 ns
bm_ranges_fill/3               4.97 ns         3.31 ns
bm_ranges_fill/4               6.53 ns         3.27 ns
bm_ranges_fill/5               8.12 ns         3.33 ns
bm_ranges_fill/6               9.76 ns         3.32 ns
bm_ranges_fill/7               11.6 ns         3.29 ns
bm_ranges_fill/8               13.2 ns         3.26 ns
bm_ranges_fill/16              26.3 ns         3.26 ns
bm_ranges_fill/64               104 ns         4.92 ns
bm_ranges_fill/512              716 ns         4.47 ns
bm_ranges_fill/4096            5772 ns         8.21 ns
bm_ranges_fill/32768          45778 ns         33.1 ns
bm_ranges_fill/262144        351422 ns          241 ns
bm_ranges_fill/1048576      1404710 ns          965 ns
```
2024-03-17 20:00:54 +01:00
David Green
601e102bdb
[CodeGen] Use LocationSize for MMO getSize (#84751)
This is part of #70452 that changes the type used for the external
interface of MMO to LocationSize as opposed to uint64_t. This means the
constructors take LocationSize, and convert ~UINT64_C(0) to
LocationSize::beforeOrAfter(). The getSize methods return a
LocationSize.

This allows us to be more precise with unknown sizes, not accidentally
treating them as unsigned values, and in the future should allow us to
add proper scalable vector support but none of that is included in this
patch. It should mostly be an NFC.

Global ISel is still expected to use the underlying LLT as it needs, and
are not expected to see unknown sizes for generic operations. Most of
the changes are hopefully fairly mechanical, adding a lot of getValue()
calls and protecting them with hasValue() where needed.
2024-03-17 18:15:56 +00:00
Timm Bäder
5143a12413 [clang][Interp] Add __builtin_is_constant_evaluated warnings
Add the same warnings the current interpreter emits.
2024-03-17 18:07:51 +01:00
Timm Bäder
ca876711ae [clang][Interp][NFC] Make local pointer const 2024-03-17 18:07:51 +01:00
Timm Bäder
dff3e28df9 [clang][Interp][NFC] Print qualified name of Descriptor sources 2024-03-17 18:07:51 +01:00
Timm Bäder
a4b39f6515 [clang][Interp] Lazily visit const-qualified static data members in C++ 2024-03-17 18:07:51 +01:00
sethp
192be3c9c1
fix: constexpr bit_cast with empty base classes (#82383)
Prior to this commit, clang would fail to produce a constant value for
`b` in:

```c++
struct base {
};

struct s : base {
    int z;
};

constexpr auto b = std::bit_cast<s>(0x12); 
```

e.g. https://godbolt.org/z/srrbTMPq4
2024-03-17 17:35:13 +01:00
srcarroll
d39ac3a8e0
[mlir][math] Reland 58ef9bec071383744fb703ff08df9806f25e4095 (#85436)
The previous implementation decomposes tanh(x) into
`(exp(2x) - 1)/(exp(2x)+1), x < 0`
`(1 - exp(-2x))/(1 + exp(-2x)), x >= 0`
This is fine as it avoids overflow with the exponential, but the whole
decomposition is computed for both cases unconditionally, then the
result is chosen based off the sign of the input. This results in doing
two expensive exp computations.

The proposed change avoids doing the whole computation twice by
exploiting the reflection symmetry `tanh(-x) = -tanh(x)`. We can
"normalize" the input to be positive by setting `y = sign(x) * x`, where
the sign of `x` is computed as `sign(x) = (float)(x > 0) * (-2) + 1`.
Then compute `z = tanh(y) `with the decomposition above for `x >=0` and
"denormalize" the result `z * sign(x)` to retain the sign. The reason it
is done this way is that it is very amenable to vectorization.

This method trades the duplicate decomposition computations (which takes
5 instructions including an extra expensive exp and div) for 4 cheap
instructions to compute the signs value

`arith.cmpf `(which is a pre-existing instruction in the previous impl)
`arith.sitofp`
`arith.mulf`
`arith.addf`
and 1 more instruction to get the right sign in the result
5. `arith.mulf`. 
Moreover, numerically, this implementation will yield the exact same
results as the previous implementation.

As part of the relanding, a casting issue from the original commit has
been fixed, i.e. casting bool to float with `uitofp`. Additionally a
correctness test with `mlir-cpu-runner` has been added.
2024-03-17 11:23:30 -05:00
Benjamin Kramer
2c6fb7ce99 [bazel] Add a missing dependency for f2794ccede6d32a6b5ef7a376ced420331e2be27 2024-03-17 16:56:26 +01:00
Timm Bäder
0211389064 [clang][Interp] Handle __datasizeof. 2024-03-17 16:33:39 +01:00
yronglin
c5818c3abc
[libc++][NFC] Update LWG3477(Simplify constraints for semiregular-box) status (#85399)
Since we implemented `copyable-box` in
(https://reviews.llvm.org/D102135,
6829db727e),
this issue got addressed.

---------

Signed-off-by: yronglin <yronglin777@gmail.com>
2024-03-17 23:03:55 +08:00
Mark de Wever
56d45b09dc
[lldb][libc++] Adds slice_array data formatters. (#85544)
Co-authored-by: Michael Buch <michaelbuch12@gmail.com>
2024-03-17 14:56:35 +01:00
Benjamin Kramer
62361fe5dd [bazel] Port c51095f51b770f0663b65dd8a651601fca15701e 2024-03-17 14:17:29 +01:00
Chuanqi Xu
0e1e1fc8f0
Reland Print library module manifest path again (#84881)
Following of https://github.com/llvm/llvm-project/pull/82160

The reason why the above PR fails is that the `--sysroot` has lower
priority than the libc++ built from the same source. On the one hand, it
matches the codes behavior. We will add the built libc++ project paths
in the ToolChain class. But we will only add the path related to sysroot
in Linux class, which is derived from the ToolChain classes. So the
paths of just built libc++ is in the front of the paths relative to
sysroot. On the other hand, the behavior should be good from the higher
level. Since the just built libc++ has the same version number with the
just built clang, so it makes sense that these 2 compilers just matches.

So for patch it self, I hacked it by using resource dir in the test
since the resource dir has the higher priority, which is not strongly
correct since we won't do that in practice.

@kaz7 would you like to test on your environment to avoid this get
reverted again?

On the libc++ side, it shows that it lacks a `modules.json` file for the
just built libc++ directory. If we don't have that, it will be
problematic to use std modules from the just built clang and libc++
pair. Then it is not good. And I feel it may be problematic for future
compiler/standard library developers. So I feel this is somewhat a
libc++ issue that need to be fixed.

Also if we don't like the hacked test in the current patch, we must wait
for libc++ to fix this to proceed. But I feel this is somewhat odd since
the test of clang shouldn't dependent on libc++.

CC: @mordante

---------

Co-authored-by: Mark de Wever <koraq@xs4all.nl>
2024-03-17 21:14:53 +08:00
Benjamin Kramer
0269790c98 [bazel] Fix a missing comma from a2bad75879c33c0e6a2834bb0abcd3e1599d377d 2024-03-17 14:12:24 +01:00
Benjamin Kramer
daa350c199 [mlir] Work around MSVC bug
MSVC fails to parse this construct, leading to
MlirTranslateMain.cpp(70): error C2065: 'inputSplitMarker': undeclared identifier

Just switching to brace init works around the issue
2024-03-17 14:05:41 +01:00
XinWang10
7b766a6f50
[X86] Support APX CMOV/CFCMOV instructions (#82592)
This patch support ND CMOV instructions and CFCMOV instructions.

RFC:
https://discourse.llvm.org/t/rfc-design-for-apx-feature-egpr-and-ndd-support/73031/4
2024-03-17 20:18:56 +08:00
Jay Foad
bfb868201f
[AMDGPU] Fix predicates on FLAT scratch ST/SVS mode Pseudos (#85442)
Definitions like this did not work as intended:

  let is_flat_scratch = 1 in {
    let SubtargetPredicate = HasFlatScratchSVSMode in
def _SVS : FLAT_Scratch_Load_Pseudo<opName, regClass, HasTiedOutput, 1,
1>,
               FlatScratchInst<opName, "SVS">;

    let SubtargetPredicate = HasFlatScratchSTMode in
def _ST : FLAT_Scratch_Load_Pseudo<opName, regClass, HasTiedOutput, 0,
0, 0>,
               FlatScratchInst<opName, "ST">;
  }

They tried to override SubtargetPredicate, but then it was overridden
again (back to its default value) by setting is_flat_scratch, which
caused SubtargetPredicate to be recalculated in the base class. (This
patch also removes some overrides of SubtargetPredicate that are
redundant due to being recalculated in the base class.)

Fix this by pushing overrides of is_flat_scratch and is_flat_global "in"
as far as possible. This has the added benefit that there is no need to
override them around groups of Pseudo definitions like this:

let is_flat_global = 1 in {
defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Atomic_Pseudo
<"global_atomic_cmpswap",
                               VGPR_32, i32, v2i32, VReg_64>;
...
}

which are plainly Global instructions anyway.

Verified by inspecting the output of TableGen. It seems to be NFC in
practice.
2024-03-17 09:42:44 +00:00
Owen Pan
f3c5278efa [clang-format][NFC] Don't export IsCpp in Format.h 2024-03-17 00:36:12 -07:00
Petr Hosek
5a75242bc8
[libc] Include empty remove in baremetal stdio.h (#85336)
This is required to avoid compilation error in libc++.

See #85335 for more details.
2024-03-16 23:17:19 -07:00
Yingwei Zheng
252d01952c
[InstCombine] Drop UB-implying attrs/metadata after speculating an instruction (#85542)
When speculating an instruction in `InstCombinerImpl::FoldOpIntoSelect`,
the call may result in undefined behavior. This patch drops all
UB-implying attrs/metadata to fix this.

Fixes #85536.
2024-03-17 14:15:27 +08:00
Tom Stellard
f84980570d
[llvm-shlib] Fix libLLVM-18 symlink on mingw (#85554)
The TARGET_SONAME_FILE_NAME generator expression is not available on dll
target platforms.
2024-03-16 22:47:27 -07:00
Petr Hosek
6666b3fca8 [libc] Match baremetal stdlib.h entrypoints with types
To match the entrypoints and types we need to exclude __atexithandler_t
and __qsortrcompare_t, as well as qsort_r, which is a GNU extension.

This is a reland of llvm/llvm-project#85030.
2024-03-16 22:29:11 -07:00
Owen Pan
b92d6dd704 [clang-format][NFC] Delete 100+ redundant #include lines in .cpp files 2024-03-16 22:24:11 -07:00
Takuya Shimizu
65058a8d73
[AArch64][SelectionDAG] Expand v1f64-typed sin,cos,pow,log,exp intrinsics (#83745)
This patch makes NEON-enabled AArch64 backend expand the `sin, cos, pow,
log, log2, log10, exp, exp2, exp10` intrinsics for `v1f64` data type,
all of which caused selection failure before this patch.
Fixes https://github.com/llvm/llvm-project/issues/83729
2024-03-17 11:28:32 +09:00
Petr Hosek
8f878c5018
[libc] Include time.h in baremetal targets (#85026)
These types and conversion functions are used in embedded development.

Note that we cannot yet include other entrypoints such as asctime
because `src/time/time_utils.h` unconditionally uses `EOVERFLOW`, which
is only defined in POSIX and not in C standard. This issue is tracked by
#85556.
2024-03-16 16:11:04 -07:00
Owen Pan
d33d5630b2
[clang-format] Fix a bug in SpaceInEmptyBlock option (#85508)
Fixes #84695.
2024-03-16 14:48:51 -07:00
OverMighty
a2bad75879
[libc][math][c23] Add nextupl and nextdownl functions (#85484)
Fixes #85283.

cc @lntue
2024-03-16 17:21:07 -04:00
Owen Pan
84b5178124
[clang-format] Correctly parse C++11 attributes in enum specifiers (#85498)
Fixes #85476.
2024-03-16 13:51:36 -07:00
alirezamoshtaghi
2867095917
[clang] Skip implicit designators in DesignatedInitExpr::getBeginLoc (#83369)
Fixes https://github.com/llvm/llvm-project/issues/83185
2024-03-16 16:29:20 -04:00
Florian Hahn
e77378cc14
[Matrix] Adjust lifetime.ends during multiply fusion. (#84914)
At the moment, loads introduced by multiply fusion may be placed after
an objects lifetime has been terminated by lifetime.end. This introduces
reads to dead objects.

To avoid this, first collect all lifetime.end calls in the function.
During fusion, we deal with any lifetime.end calls that may alias any of
the loads.

Such lifetime.end calls are either moved when possible (both the
lifetime.end and the store are in the same block) or deleted.

PR: https://github.com/llvm/llvm-project/pull/84914
2024-03-16 20:41:36 +01:00
Mark de Wever
0847c903c8 Revert "[libc++] Fix tests on musl (#85085)"
This reverts commit b61fb18456ecd798b2fc340367018ab3109ebfae.

This commit landed with build failures in the pre-commit CI
https://buildkite.com/llvm-project/libcxx-ci/builds/34153
2024-03-16 20:22:49 +01:00
Usman Nadeem
c9325f8a2e
[DFAJumpThreading] Add an early exit heuristic for unpredictable values (#85015)
Right now the algorithm does not exit on unpredictable values. It
waits until all the paths have been enumerated to see if any of
those paths have that value. Waiting this late leads to a lot of
wasteful computation and higher compile time.

In this patch I have added a heuristic that checks if the value
comes from the same inner loops as the switch, if so, then it is
likely that the value will also be seen on a threadable path and
the code in `getStateDefMap()` return an empty map.

I tested this on the llvm test suite and the only change in the
number of threaded switches was in 7zip (before 23, after 18).
In all of those cases the current algorithm was partially threading
the loop because it was hitting a limit on the number of paths to
be explored. On increasing this limit even the current algorithm
finds paths where the unpredictable value is seen.

Compile time(with pass enabled by default and this patch):

https://llvm-compile-time-tracker.com/compare.php?from=8c5e9cf737138aba22a4a8f64ef2c5efc80dd7f9&to=42c75d888058b35c6d15901b34e36251d8f766b9&stat=instructions:u
2024-03-16 11:24:42 -07:00
Cyndy Ishida
f2794ccede
[InstallAPI] Introduce Basic Verifier (#85106)
This adds basic support for calling the verifier on global declarations
that are expected to represent symbol exports. The driver now
exclusively uses this for knowing what symbols make up a TBD file.
Future patches will check against the dylib's symbol table.
2024-03-16 10:37:52 -07:00
Cyndy Ishida
c51095f51b
[InstallAPI] Add installapi specific options & diagnostics (#85100)
* A lot of `tapi installapi` options are already shared with clang, but
not all. This patch handles installapi-specific options by filtering for
them in the initial argv input, then passing the rest to the clang
driver.
* Installapi not only generates a text file but also reports to library
developers when there are inconsistencies between an interface and its
implementation. To allow this, add support for reporting installapi
diagnostics. This will be leveraged in the verifier service.
2024-03-16 09:08:17 -07:00
Nikolas Klauser
f694f632d9
[libc++] Add <locale> include in <chrono> (#85521)
I accidentally removed this transitive include in #85478.
2024-03-16 16:40:36 +01:00
Nikolas Klauser
618ce78603
[libc++][NFC] Simplify scoped_lock::__unlock_unpack a bit (#85517) 2024-03-16 16:37:35 +01:00
Sirraide
74d1a40915
[Clang] Ignore assumptions with side effects at compile time (#85534)
Fixes #85519.
2024-03-16 16:05:50 +01:00
alx32
9d5edfde5c
[llvm-objdump][macho] Add support for ObjC relative method lists (#85477)
For Mach-O, ld64 supports the -fobjc-relative-method-lists flag which
changes the format in which method lists are generated. The format uses
delta encoding vs the original direct-pointer encoding.
This change adds support to llvm-objdump and llvm-otool for
decoding/dumping of method lists in the delta format. Previously, if a
binary with this information format was passed to the tooling, it would
output invalid information, trying to parse the delta lists as pointer
lists.
After this change, the tooling will output correct information if a
binary in this format is encountered.
The output format is closest feasible match to XCode 15.1's otool
output. Tests are included for both 32bit and 64bit binaries.

The code style was matched as close as possible to existing
implementation of parsing non-delta method lists.

Diff between llvm-objdump and XCode 15.1 otool:

![image](https://github.com/llvm/llvm-project/assets/103613512/2277e3ff-d59c-4fff-b93a-e0587ee740a6)

Note: This is a retry of this PR:
https://github.com/llvm/llvm-project/pull/84250
On the original PR, the armv7+armv8 builds were failing due to absolute
offsets being different.

Co-authored-by: Alex B <alexborcan@meta.com>
2024-03-16 07:51:45 -07:00