Mark de Wever [Mon, 17 Jul 2023 18:25:01 +0000 (20:25 +0200)]
[libc++][chrono] Fixes month inc and dec operations.
The operator++, operator++(int), operator--, and operator--(int) need to
change the month to a valid value. The wording is specified in terms of
operator+(const month& x, const months& y) noexcept;
which has the correct behavior. The aforementioned operators instead
used ++/-- on the internal value direction, resulting in incorrect
behaviour.
As a drive-by improve the unit tests:
- use the typical constexpr test method
- test whether the month is valid after the operations
- format the tests
Fixes: https://llvm.org/PR63912
Reviewed By: #libc, ldionne
Differential Revision: https://reviews.llvm.org/D155504
Haojian Wu [Sat, 8 Jul 2023 20:55:00 +0000 (22:55 +0200)]
[clangd] Refine the workflow for diagnostic Fixits.
- No longer store the diagnostic fixits in the clangdLSPServer
- When propagating the fixit via the code action, we use the Diag
information stored in the ParsedAST (in clangdServer.cpp)
Differential Revision: https://reviews.llvm.org/D155173
Martin Storsjö [Tue, 18 Jul 2023 15:21:23 +0000 (18:21 +0300)]
Revert "[AArch64] Fix an immediate out of range for large realignments on Windows"
This reverts commit
b1d0bc0f4395c69097bc11b6ba8f821f621272a9.
Builds with expensive checks show that 'sp' isn't a valid register
in ADDXrr - an object file built without exprnsive checks enabled
disassembles as "add x15, xzr, x16", instead of the intended
"add x15, sp, x16".
Razvan Lupusoru [Fri, 14 Jul 2023 17:40:57 +0000 (10:40 -0700)]
[openacc] Add dialect definition for acc declare
A declare directive is used to specify the creation of a visible device
copy of a variable for the duration of the implicit data region as it
relates to the scope in which the variable is declared.
In order to support this, the following new operations were added:
1) `acc.global_ctor` and `acc.global_dtor`. These are used whenever the
declare directive applies to a global.
2) `acc.declare_enter` and `acc.declare_exit`. These operations are
modeled similarly to `acc.enter_data` and `acc.exit_data`. The reason
they are not modeled like `acc.data` is so that these operations can be
used both for globals and regions like functions.
3) `acc.declare_device_resident` and `acc.declare_link`. These
operations are modeled in a manner consistent with previously defined
data entry operation model.
The `acc.getdeviceptr` was generalized so that it can be used with
acc.declare_exit.
Reviewed By: clementval, vzakhari
Differential Revision: https://reviews.llvm.org/D155322
Markus Böck [Tue, 18 Jul 2023 13:23:27 +0000 (15:23 +0200)]
[mlir][LLVM] Append call ops alias scopes to inlined operations
Currently when inlining, any alias scope information previously attached to the call op is lost. This leads to a loss of information that could be used by alias analysis to determine that two memory access operations do not alias.
This patch fixes this issue by also taking any alias scopes of the call operation into account. These can then simply be appended onto any inlined operations.
This is analogous to the following code in LLVM: https://github.com/llvm/llvm-project/blob/
1768c4597e70477af2d69f576f33400181a5f945/llvm/lib/Transforms/Utils/InlineFunction.cpp#L940
Differential Revision: https://reviews.llvm.org/D155595
Ingo Müller [Tue, 18 Jul 2023 08:15:53 +0000 (08:15 +0000)]
[mlir][transform][bufferization][python] Add .td file for bindings.
Reviewed By: springerm, ftynse
Differential Revision: https://reviews.llvm.org/D155564
Adrian Kuegel [Tue, 18 Jul 2023 14:10:48 +0000 (16:10 +0200)]
[mlir][Bazel] Add missing dependency.
Adrian Kuegel [Tue, 18 Jul 2023 14:02:15 +0000 (16:02 +0200)]
[mlir][Bazel] Add VectorToArmSME target.
Guillaume Chatelet [Tue, 18 Jul 2023 13:30:01 +0000 (13:30 +0000)]
[libc][memfunctions] Explicit error when platform in not supported
Reviewed By: gchatelet
Differential Revision: https://reviews.llvm.org/D155597
Adrian Kuegel [Tue, 18 Jul 2023 13:51:49 +0000 (15:51 +0200)]
[mlir][Bazel] Add missing dependency.
iambrj [Tue, 18 Jul 2023 13:36:30 +0000 (19:06 +0530)]
[MLIR][Presburger] Implement domain and range restriction for PresburgerRelation
This patch implements domain and range restriction for PresburgerRelation
Reviewed By: Groverkss
Differential Revision: https://reviews.llvm.org/D154798
Martin Braenne [Tue, 18 Jul 2023 11:28:09 +0000 (11:28 +0000)]
[clang][dataflow] Strengthen flow condition assertions.
Instead of asserting merely that the flow condition doesn't imply that a variable is true, make the stronger assertion that the flow condition implies that the variable is false.
Reviewed By: ymandel, xazax.hun
Differential Revision: https://reviews.llvm.org/D155067
Paweł Bylica [Tue, 18 Jul 2023 13:40:28 +0000 (15:40 +0200)]
[clang][NFC] Fix typos in sema builtins test
Christoph Stiller [Tue, 18 Jul 2023 12:36:37 +0000 (13:36 +0100)]
[MCA] Document behaviour of ResourceRef
Differential Revision: https://reviews.llvm.org/D155347
Alexey Bataev [Fri, 5 May 2023 14:49:15 +0000 (07:49 -0700)]
[SLP]Include cost of the reshuffling for same nodes with resizing.
Need to account reshuffling, required for the reused elements in the
buildvector nodes, which are copies (perfect match) of other nodes, but
include reused elements.
Differential Revision: https://reviews.llvm.org/D149966
John Brawn [Fri, 14 Jul 2023 12:49:33 +0000 (13:49 +0100)]
[ARM] Replace TransferImpOps with copyImplicitOps
In most places where TransferImpOps is currently used we just have one
machine instruction, so it's doing the same thing as copyImplicitOps
anyway. In those cases where we have more than one machine
instruction the destination is written to in each instruction so any
implicit defs should appear on all of them (and we shouldn't see any
implicit refs as these pseudo-instruction don't have any register
inputs), meaning the current use of TransferImpOps is incorrect and
we should be using copyImplicitOps on all of the generated
instructions.
Differential Revision: https://reviews.llvm.org/D155301
wanglei [Tue, 18 Jul 2023 12:41:56 +0000 (20:41 +0800)]
[LoongArch][NFC] Revise instruction format to match lsx and lasx styles
Replace lengthy `0b...` binary form with a unified 32-bit hexadecimal
representation for opcode. This reduces complexity when dealing with
opcode discontinuities.
Martin Storsjö [Mon, 17 Jul 2023 12:19:14 +0000 (15:19 +0300)]
[AArch64] Fix an immediate out of range for large realignments on Windows
Also add a missing FrameSetup flag on the existing add instruction.
This fixes https://github.com/llvm/llvm-project/issues/63701.
Differential Revision: https://reviews.llvm.org/D155447
Luke Lau [Mon, 17 Jul 2023 10:23:16 +0000 (11:23 +0100)]
[RISCV] Add VP patterns for vandn.[vv,vx]
This builds upon D155433
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D155434
Luke Lau [Mon, 17 Jul 2023 10:12:43 +0000 (11:12 +0100)]
[RISCV] Add SDNode patterns for vandn.[vv,vx]
Unfortunately we can't use the standard splat_vector and vnot PatFrags because
they are preprocessed to vmv.v.x's, so we need to define helpers to catch
those. We can't use SplatPat either because we need to nest another fragment
inside of it.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D155433
Matthias Springer [Tue, 18 Jul 2023 12:13:31 +0000 (14:13 +0200)]
[mlir][NVGPU][transform] Add `create_async_groups` transform op
This transform looks for suitable vector transfers from global memory to shared memory and converts them to async device copies.
Differential Revision: https://reviews.llvm.org/D155569
Guillaume Chatelet [Mon, 17 Jul 2023 21:35:03 +0000 (21:35 +0000)]
[libc][NFC] Split memmove implementations per platform
This is a follow up on D154800 and D154770 to make the code structure more principled and avoid too many nested #ifdef/#endif.
Reviewed By: courbet
Differential Revision: https://reviews.llvm.org/D155515
Jie Fu [Tue, 18 Jul 2023 12:17:18 +0000 (20:17 +0800)]
[Flang] Remove unused variable 'converter' in genCustomIntrinsicRefCore
/data/workspace/llvm-project/flang/lib/Lower/ConvertCall.cpp:1281:9: error: unused variable 'converter' [-Werror,-Wunused-variable]
auto &converter = callContext.converter;
^
1 error generated.
Nikita Popov [Tue, 18 Jul 2023 10:37:35 +0000 (12:37 +0200)]
[Constants] Use getGEPReturnType() (NFC)
This reimplements essentially the same logic.
dingfei [Tue, 18 Jul 2023 11:55:34 +0000 (19:55 +0800)]
[NFC][clang-extdef-mapping] fix test failure on unsupported targets
ms-stlye asm block is not supported on targets like arm/hexagon.
Specify a working target as POC.
Introduced by https://reviews.llvm.org/D154983
Differential Revision: https://reviews.llvm.org/D155576
Alex Zinenko [Mon, 17 Jul 2023 12:57:55 +0000 (12:57 +0000)]
[mlir] NFC: untangle SCF Patterns.h and Transforms.h
These two headers both contained a strange mix of definitions related to
both patterns and non-pattern transforms. Put patterns and "populate"
functions into Patterns.h and standalone transforms into Transforms.h.
Depends On: D155223
Reviewed By: nicolasvasilache
Differential Revision: https://reviews.llvm.org/D155454
Markus Böck [Mon, 17 Jul 2023 16:01:17 +0000 (18:01 +0200)]
[mlir][LLVM] Perform deep clone of alias scopes during inlining
This is the first and most basic and important step for inlining memory operations with alias scopes.
For correctness, it is required that any alias scopes of inlined operations are replaced with deep copies. This is necessary as otherwise the same function could be inlined twice in one function, and suddenly the alias scopes extended.
A simple example would be `foo(a, b); foo(a2, b2)`. `a` and `a2` may alias. If `foo` is inlined in both instances, the store and load operations from `foo` may suddenly claim that `a` and `a2` do not alias if we were to keep the original alias scopes.
This is analogous to the following class/code in LLVM: https://github.com/llvm/llvm-project/blob/
4eef2e30d6f89328a16d4f1d6b37f1c79afe850c/llvm/lib/Transforms/Utils/InlineFunction.cpp#L985
Differential Revision: https://reviews.llvm.org/D155479
Haojian Wu [Thu, 13 Jul 2023 12:03:24 +0000 (14:03 +0200)]
[include-cleaner] Avoid a caching issue when running --edit mode on multiple files.
Snapshot all analysing files before running the tool, this makes sure
that we analyse all files statelessly and avoid the FileManager caching issue
when running `-edit` on multiple files.
Differential Revision: https://reviews.llvm.org/D155195
Kiran Chandramohan [Tue, 18 Jul 2023 10:33:57 +0000 (10:33 +0000)]
[Flang] Include logical default with default-integer-8
Other compilers include the logical default also with the
default-integer-8 setting. This patch does the same for
flang.
Reviewed By: awarzynski, sscalpone
Differential Revision: https://reviews.llvm.org/D155279
Tom Eccles [Mon, 17 Jul 2023 15:52:54 +0000 (15:52 +0000)]
[flang][hlfir][NFC] catch dynamically optional args with no lowering
These should be lowered with genOptionalValue as in D154897, but I
haven't found any cases where this code path is actually hit (flang
tests, gfortran test suite), so I don't think it would be testable.
Adding an assertion for if this code path ever becomes live.
Differential Revision: https://reviews.llvm.org/D155477
Tom Eccles [Thu, 13 Jul 2023 15:36:22 +0000 (15:36 +0000)]
[flang][hlfir] support dynamically optional array arguments to intrinsics with custom handling
The previous code path created the elemental kernel by generating a
scalar intrinsic call using pre-prepared arguments using genIntrinsicRefCore,
which then generated the intrinsic call using genIntrinsicCall().
The problem with this approach was that the dynamically optional
arguments were marked as having no argLowering, which meant that they
were unconditionally passed by value without any check to see if they
were present.
It would be nice to put an if operation in the path for !argLowering,
doing something similar to genOptionalValue(). However, this can't be
done because it isn't clear what value should be used for the default.
If zero was used (like in genOptionalValue) this could effect the result
of MIN or MAX.
Instead, this patch re-uses the implementation for scalar dynamically
optional arguments (in non-elemental calls). This does the correct
thing, entirely ignoring absent optional arguments.
Depends On: D155292
Differential Revision: https://reviews.llvm.org/D155293
Tom Eccles [Tue, 11 Jul 2023 14:40:29 +0000 (14:40 +0000)]
[flang][hlfir] add support for elemental intrinsics with custom handling
Only minimal argument processing is needed here because they will be
lowered properly either by the elemental intrinsic call builder or the
lowering of the scalar call inside the elemental kernel.
Dynamically optional arrays are coming in the next patch.
Depends On: D155291
Differential Revision: https://reviews.llvm.org/D155292
Tom Eccles [Mon, 10 Jul 2023 16:48:01 +0000 (16:48 +0000)]
[flang][hlfir] custom intrinsic handling for scalar arguments
This should produce the same results as the FIR lowering
Differential Revision: https://reviews.llvm.org/D155291
Paulo Matos [Mon, 17 Jul 2023 06:41:43 +0000 (08:41 +0200)]
[InstCombine] Allow KnownBits to be propagated
Bug #63699 shows a hang on arm in instcombine because we do not
propagate known bits for fshl/fshr rotates. We perform the propagation
and add regression test.
Differential Revision: https://reviews.llvm.org/D155307
Matt Arsenault [Sun, 16 Jul 2023 18:51:17 +0000 (14:51 -0400)]
AMDGPU: Preserve flags in fdiv_fast lowering
We were dropping the flags and thus blocking contract into potential
fadd users. GlobalISel was already preserving the flags here.
https://reviews.llvm.org/D155443
Matt Arsenault [Sun, 16 Jul 2023 18:08:45 +0000 (14:08 -0400)]
AMDGPU: Generate and add fdiv tests
Prepare for new lowering strategies because we somehow didn't have
enough of them already.
Matt Arsenault [Sun, 16 Jul 2023 13:38:23 +0000 (09:38 -0400)]
ValueTracking: Fix computeKnownFPClass canonicalize handling
This mostly manifested as broken constant folding. This was
mishandling the dynamic denormal mode. It was also mishandling literal
signaling nans, such that they would also be treated as poison.
https://reviews.llvm.org/D155437
Matt Arsenault [Sun, 16 Jul 2023 13:48:59 +0000 (09:48 -0400)]
ValueTracking: Add more tests for canonicalize class handling
Matt Arsenault [Sat, 15 Jul 2023 14:03:07 +0000 (10:03 -0400)]
AMDGPU: Add some additional rcp/rsq tests
Nikita Popov [Tue, 18 Jul 2023 10:17:29 +0000 (12:17 +0200)]
[IR] Remove typed pointer handling from getGEPReturnType() (NFC)
Sander de Smalen [Tue, 18 Jul 2023 09:41:08 +0000 (09:41 +0000)]
[AArch64] Force streaming-compatible codegen when attributes are set.
Before this patch, the only way to generate streaming-compatible code
was to use the `-force-streaming-compatible-sve` flag, but the compiler
should also avoid the use of instructions invalid in streaming mode
when a function has the aarch64_pstate_sm_enabled/compatible attribute.
Reviewed By: paulwalker-arm, david-arm
Differential Revision: https://reviews.llvm.org/D155428
Matt Arsenault [Fri, 14 Jul 2023 22:54:55 +0000 (18:54 -0400)]
libomptarget: Try to fix dependency tracking for llvm tools
Mitch Phillips [Tue, 18 Jul 2023 10:19:48 +0000 (12:19 +0200)]
Revert "[sanitizer][asan][win] Intercept _strdup on Windows instead of strdup"
This reverts commit
31263211c6a4ef454216f2edbf9b2083a4c1474d.
Reason: Broke the ASan Windows bot: https://reviews.llvm.org/rG31263211c6a4ef454216f2edbf9b2083a4c1474d
Matt Arsenault [Fri, 14 Jul 2023 15:05:24 +0000 (11:05 -0400)]
MachineSink: Fix sinking VGPR def out of a divergent loop
This fixes sinking a VGPR def out of a loop past the reconvergence
point at the SI_END_CF. There was a prior fix which introduced
blockPrologueInterferes (D121277) to fix the same basic problem for
the post RA sink. This also had the special case isIgnorableUse case
which was incorrect, because in some contexts the exec use is not
ignorable.
I'm thinking about a new way to represent this which will avoid
needing hasIgnorableUse and isBasicBlockPrologue, which would function
more like the exception handling.
Fixes: SWDEV-407790
https://reviews.llvm.org/D155343
Matt Arsenault [Fri, 14 Jul 2023 13:59:20 +0000 (09:59 -0400)]
AMDGPU: Add baseline test for broken machine sinking
Nikita Popov [Tue, 18 Jul 2023 10:04:36 +0000 (12:04 +0200)]
[llvm] Remove uses of getWithSamePointeeType() (NFC)
Florian Hahn [Tue, 18 Jul 2023 09:52:08 +0000 (10:52 +0100)]
[LV] Move all VPlan transforms after initial VPlan construction.
Reorder VPlan transforms slightly so they are all grouped together,
after disabling Value -> VPValue lookup. In terms of codegen impact,
this should be NFC modulo a small number of instruction reorderings.
Preparation to split up tryToBuildVPlanWithVPRecipes in a follow-up.
Reviewed By: Ayal
Differential Revision: https://reviews.llvm.org/D154640
Nikita Popov [Tue, 18 Jul 2023 09:52:27 +0000 (11:52 +0200)]
[polly] Remove use of getWithSamePointeeType() (NFC)
Nikita Popov [Tue, 18 Jul 2023 09:42:29 +0000 (11:42 +0200)]
[Coroutines] Remove unused variable (NFC)
khei4 [Tue, 18 Jul 2023 09:31:46 +0000 (18:31 +0900)]
Revert "Revert "Revert "[MemCpyOpt] implement single BB stack-move optimization which unify the static unescaped allocas"""
This reverts commit
b02d349cbfaa81c9bbc928c4de46b12d976c1882.
Nikita Popov [Tue, 18 Jul 2023 09:39:02 +0000 (11:39 +0200)]
[llvm] Remove uses of isOpaqueOrPointeeTypeEquals() (NFC)
Andrzej Warzynski [Fri, 14 Jul 2023 11:55:13 +0000 (11:55 +0000)]
[mlir][ArmSME] Introduce custom TypeConverter for ArmSME
At the moment, SME-to-LLVM lowerings rely entirely on
`LLVMTypeConverter`. This patch introduces a dedicated `TypeConverter`
that inherits from `LLVMTypeConverter` (it will also be used when
lowering ArmSME Ops to LLVM).
The new type converter merely disables lowerings for `VectorType` to
prevent 2-d scalable vectors (common in the context of ArmSME), e.g.
`vector<[16]x[16]xi8>`,
entering the LLVM Type converter. LLVM does not support arrays of
scalable vectors and hence the need for specialisation. In the case of
SME such types are effectively eliminated when emitting LLVM IR
intrinsics for SME.
Differential Revision: https://reviews.llvm.org/D155365
Nikita Popov [Tue, 18 Jul 2023 09:35:03 +0000 (11:35 +0200)]
[ConstantFolding] Remove some typed pointer handling (NFC)
No need to insert a bitcast.
Nikita Popov [Tue, 18 Jul 2023 09:31:09 +0000 (11:31 +0200)]
[OpenMPIRBuilderTest] Remove unused variable (NFC)
Nikita Popov [Tue, 18 Jul 2023 09:28:13 +0000 (11:28 +0200)]
[OpenMPIRBuilder] Check GV type instead of pointee type (NFC)
Change the assertion to check the value type instead of the pointee
type. To facilitate this, store GlobalVariable* instead of Constant*
in the map.
Kiran Chandramohan [Tue, 18 Jul 2023 09:10:45 +0000 (09:10 +0000)]
[Flang][HLFIR] Intrinsics: Propagate fast math flags
Add a new FirOpBuilder constructor to propagate the fast math flag
from an operation. Use this constructor in the LowerHLFIRIntrinsics
pass.
This fixes the performance issue with the hlfir intrinsics flow
for polyhedron/test_fpu2.
Reviewed By: tblah, vzakhari
Differential Revision: https://reviews.llvm.org/D155438
Kiran Chandramohan [Tue, 18 Jul 2023 09:09:58 +0000 (09:09 +0000)]
[Flang][HLFIR] Relax size check for dot_product intrinsic
If the size of one of the operand arrays is not known at compile
time, do not issue a size mismatch error sinc they could match at
runtime.
Fixes the compilation error in polyhedron/induct2.
Reviewed By: tblah, vzakhari
Differential Revision: https://reviews.llvm.org/D155302
Nikita Popov [Tue, 18 Jul 2023 09:23:41 +0000 (11:23 +0200)]
[Bitcode] Remove uses of isOpaqueOrPointeeTypeEquals() (NFC)
ManuelJBrito [Mon, 17 Jul 2023 15:51:40 +0000 (16:51 +0100)]
[NewGVN] Abort PHIOfOps if singleton PHI is found
Currently we just bypass singleton phis, however we know that
in order to create the phi of ops all phis must be in the same block.
Therefore if one phi is a singleton then the rest are as well.
Differential Revision: https://reviews.llvm.org/D155478
Nikita Popov [Tue, 18 Jul 2023 09:20:18 +0000 (11:20 +0200)]
[LowerMatrixIntrinsics] Fix test expectations (NFC)
Some of the test expectation were incorrectly changed in
23c21759458014fc4d7cbea45b6fbe7349a0a4fd. Regenerate the tests.
Nikita Popov [Tue, 18 Jul 2023 09:13:26 +0000 (11:13 +0200)]
[llvm] Remove some uses of isOpaqueOrPointeeTypeEquals() (NFC)
dingfei [Tue, 18 Jul 2023 09:09:58 +0000 (17:09 +0800)]
[clang-extdef-mapping] register necessary targest for ms-style asm block
Without targets registered gives: "error: MS-style inline assembly is not
available: Unable to find target for this triple (no targets are registered)"
Differential Revision: https://reviews.llvm.org/D154983
dingfei [Tue, 18 Jul 2023 09:01:19 +0000 (17:01 +0800)]
[ASTImporter] Fields are imported first and reordered for correct layout
Fields are imported first and reordered for correct layout.
For partially imported record, layout computation is incorrect.
Differential Revision: https://reviews.llvm.org/D154764
Nikita Popov [Tue, 18 Jul 2023 09:00:44 +0000 (11:00 +0200)]
[IRBuilder] Remove various typed pointer handling (NFC)
Nuno Lopes [Tue, 18 Jul 2023 08:54:07 +0000 (09:54 +0100)]
[LowerMatrixIntrinsics] Use poison instead of undef as placeholder [NFC]
These values don't propagate to the output; they are always replaced with a subsequent shuffle
or insertelement.
Tested equivalence with Alive2, e.g., https://alive2.llvm.org/ce/z/fj4s78.
Weining Lu [Tue, 18 Jul 2023 03:19:26 +0000 (11:19 +0800)]
[LoongArch] Change 'using namespace llvm;' to 'namespace llvm {' in LoongArchTargetParser.cpp. NFC
And change 'using namespace llvm::LoongArch' to 'namespace LoongArch {'
to simplify the code a little bit.
Weining Lu [Tue, 18 Jul 2023 02:59:27 +0000 (10:59 +0800)]
[LoongArch] Remove useless 'invalid' and 'none' feature and arch names. NFC
Cullen Rhodes [Tue, 18 Jul 2023 08:29:53 +0000 (08:29 +0000)]
[mlir][ArmSME] Implement tile allocation
This patch adds a pass '-allocate-sme-tiles' to the ArmSME dialect that
implements allocation of SME ZA tiles.
It does this at the 'func.func' op level by replacing
'arm_sme.get_tile_id' ops with 'arith.constant' ops that represent the
tile number. The tiles in use in a given function are tracked by an
integer function attribute 'arm_sme.tiles_in_use' that is a 16-bit tile
mask with a bit for each 128-bit element tile (ZA0.Q-ZA15.Q), the
smallest ZA tile granule. This is initialized on the first
'arm_sme.get_tile_id' rewrite and updated on each subsequent rewrite.
Mixing of different element tile types is supported.
Section B2.3.2 of the SME spec [1] describes how the 128-bit element
tiles overlap with other element tiles.
Depends on D154941
[1] https://developer.arm.com/documentation/ddi0616/aa
Reviewed By: awarzynski
Differential Revision: https://reviews.llvm.org/D154955
Nikita Popov [Thu, 13 Jul 2023 15:25:18 +0000 (17:25 +0200)]
Reapply [InstSimplify] Make simplifyWithOpReplaced() recursive (PR63104)
A similar assumption as for the x^x case also existed for the absorber
case, which lead to a stage2 miscompile. That assumption is not fixed.
-----
Support replacement of operands not only in the immediate
instruction, but also instructions it uses.
To the most part, this extension is straightforward, but there are
two bits worth highlighting:
First, we can now no longer assume that if the Op is a vector, the
instruction also returns a vector. If Op is a vector and the
instruction returns a scalar, we should consider it as a cross-lane
operation.
Second, for the x ^ x special case and the absorber special case, we
can no longer assume that one of the operands is RepOp, as we might
have a replacement higher up the instruction chain.
There is one optimization regression, but it is in a fuzzer-generated
test case.
Fixes https://github.com/llvm/llvm-project/issues/63104.
dingfei [Tue, 18 Jul 2023 08:29:56 +0000 (16:29 +0800)]
[ASTImporter] Fix 'isVirtual()' assert failure while import overridden methods
CXXMethodDecl::isVirtual() count the number of overridden methods.
This assertion is not true before overridden methods are fully loaded.
The body of this CXXMethodDecl can introduce deps on a derived class
which contains a method overriding this method, causing the assertion failure.
ImportOverriddenMethods() is moved before body loading to fix this issue.
Testcase is contributed by Balázs Kéri (balazske)
Differential Revision: https://reviews.llvm.org/D154701
Jens Massberg [Tue, 18 Jul 2023 07:49:10 +0000 (09:49 +0200)]
[clangd][c++20] Add concept Hover tests.
Concepts aren't fully supporteb by hover yet. For the currently
supported case we add a test here to prevent regressions in the future.
Differential Revision: https://reviews.llvm.org/D155558
Pavel Labath [Tue, 18 Jul 2023 08:16:00 +0000 (10:16 +0200)]
[lldb/test] Fix command-disassemble-mixed.c
Add it to lit.local.cfg so that it's actually run, and change it to
(properly) use the %clang_host substitution.
Nikita Popov [Tue, 18 Jul 2023 08:11:57 +0000 (10:11 +0200)]
[InstSimplify] Add additional tests for with op replaced fold (NFC)
Andrzej Warzynski [Tue, 11 Jul 2023 16:21:39 +0000 (16:21 +0000)]
[mlir][ArmSME] Introduce new lowering layer (Vector -> ArmSME)
At the moment, the lowering from the Vector dialect to SME looks like
this:
* Vector --> SME LLVM IR intrinsics
This patch introduces a new lowering layer between the Vector dialect
and the Arm SME extension:
* Vector --> ArmSME dialect (custom Ops) --> SME LLVM IR intrinsics.
This is motivated by 2 considerations:
1. Storing `ZA` to memory (e.g. `vector.transfer_write`) requires an
`scf.for` loop over all rows of `ZA`. Similar logic will apply to
"load to ZA from memory". This is a rather complex transformation and
a custom Op seems justified.
2. As discussed in [1], we need to prevent the LLVM type converter from
having to convert types unsupported in LLVM, e.g.
`vector<[16]x[16]xi8>`. A dedicated abstraction layer with custom Ops
opens a path to some fine tuning (e.g. custom type converters) that
will allow us to avoid this.
To facilitate this change, two new custom SME Op are introduced:
* `TileStoreOp`, and
* `ZeroOp`.
Note that no new functionality is added - these Ops merely model what's
already supported. In particular, the following tile size is assumed
(dimension and element size are fixed):
* `vector<[16]x[16]xi8>`
The new lowering layer is introduced via a conversion pass between the
Vector and the SME dialects. You can use the `-convert-vector-to-sme`
flag to run it. The following function:
```
func.func @example(%arg0 : memref<?x?xi8>) {
// (...)
%cst = arith.constant dense<0> : vector<[16]x[16]xi8>
vector.transfer_write %cst, %arg0 : vector<[16]x[16]xi8>, memref<?x?xi8>
return
}
```
would be lowered to:
```
func.func @example(%arg0: memref<?x?xi8>) {
// (...)
%0 = arm_sme.zero : vector<[16]x[16]xi8>
arm_sme.tile_store %arg0[%c0, %c0], %0 : memref<?x?xi8>, vector<[16]x[16]xi8>
return
}
```
Later, a mechanism will be introduced to guarantee that `arm_sme.zero`
and `arm_sme.tile_store` operate on the same virtual tile. For `i8`
elements this is not required as there is only one tile.
In order to lower the above output to LLVM, use
* `-convert-vector-to-llvm="enable-arm-sme"`.
[1] https://github.com/openxla/iree/issues/14294
Reviewed By: WanderAway
Differential Revision: https://reviews.llvm.org/D154867
WANG Xuerui [Tue, 18 Jul 2023 07:47:50 +0000 (15:47 +0800)]
[LoongArch][NFC] Consistently derive instruction mnemonics from TableGen record names
The recent D154183 and D154195 have introduced a simpler way to specify
instruction mnemonics: by leveraging TableGen's `NAME` and string
processing features, the mnemonics can be automatically derived from the
respective TableGen record names. LoongArch instructions don't have
"strange" characters in their names, so this approach can be applied to
all the other instructions.
A `deriveInsnMnemonic` helper class, modeled after the LSX/LASX mnemonic
derivation logic, has been added, and all non-pseudo instruction formats
are converted to use it, losing their `opstr/opcstr` arguments in the
process.
There are minor differences that are worth mentioning though:
* The atomic instructions with implicit data barriers have an underscore
(`_`) in their mnemonics, that will get converted to a period (`.`) if
not specially handled. Double-underscore (`__`) in record names are
converted to a single underscore in the resulting mnemonic; the
definitions are tweaked accordingly.
* Various duplicated FP instructions need special handling, mainly
because of the need to handle both FPR32 and FPR64 classes for a
single hardware instruction. The substrings `_xS`, `_xD` and `_64` are
additionally dropped before deriving FP instructions' mnemonics.
All of these are pure refactoring, no functional change.
Reviewed By: SixWeining
Differential Revision: https://reviews.llvm.org/D154916
Cullen Rhodes [Tue, 18 Jul 2023 07:28:00 +0000 (07:28 +0000)]
[mlir][ArmSME] Add custom get_tile_id and cast ops
This patch adds three new custom ops to the ArmSME dialect:
* arm_sme.get_tile_id - returns a scalar integer representing an SME
"virtual tile" that is not in use.
* arm_sme.cast_tile_to_vector - casts from a tile id to a 2-d scalable
vector type, which represents an SME "virtual tile".
* arm_sme.cast_vector_to_tile - casts from a 2-d scalable vector type,
which represents an SME "virtual tile", to a tile id.
The 'arm_sme.get_tile_id' op currently only supports tile 0, a follow-up
patch will implement proper tile allocation. A further follow-up patch
will demonstrate load/store to/from ZA using these ops.
See the op descriptions for further details and examples.
Thanks to @paulwalker-arm and @awarzynski for helping drive this.
Reviewed By: awarzynski, dcaballe
Differential Revision: https://reviews.llvm.org/D154941
Martin Erhart [Mon, 17 Jul 2023 14:27:07 +0000 (14:27 +0000)]
[mlir][bufferization] Add DeallocOp
The dealloc operation deallocates each of the given memrefs if there is no alias
to that memref in the list of retained memrefs and the corresponding
condition value is set. This condition can be used to indicate and pass on
ownership of memref values (or in other words, the responsibility of
deallocating that memref). If two memrefs alias each other, only one will be
deallocated to avoid double free situations.
The memrefs to be deallocated must be the originally allocated memrefs,
however, the memrefs to be retained may be arbitrary memrefs.
Returns a list of conditions corresponding to the list of memrefs which
indicates the new ownerships, i.e., if the memref was deallocated the
ownership was dropped (set to 'false') and otherwise will be the same as the
input condition.
Differential Revision: https://reviews.llvm.org/D155467
Balázs Kéri [Tue, 18 Jul 2023 06:47:56 +0000 (08:47 +0200)]
[clang][analyzer] Add all success/failure messages to StdLibraryFunctionsChecker.
Success or failure messages are now shown at all checked functions, if the call
(return value) is interesting.
Additionally new functions are added: open, openat, socket, shutdown
Reviewed By: donat.nagy
Differential Revision: https://reviews.llvm.org/D154423
Balázs Kéri [Tue, 18 Jul 2023 06:47:40 +0000 (08:47 +0200)]
[clang][analyzer] Display notes in StdLibraryFunctionsChecker only if interesting
The note tag that was previously added in all cases when a standard function call
is found is displayed now only if the function call (return value) is "interesting".
This results in less unneeded notes but some of the previously good notes disappear
too. This is because interestingness is not always set as it should be.
Reviewed By: donat.nagy
Differential Revision: https://reviews.llvm.org/D153776
Balázs Kéri [Tue, 18 Jul 2023 06:47:05 +0000 (08:47 +0200)]
[clang][analyzer] Add and change NoteTags in StdLibraryFunctionsChecker.
Change 1: ErrnoChecker notes show only messages related to errno,
not to assumption of success or failure of functions.
Change 2: StdLibraryFunctionsChecker adds its own note about success
or failure of functions, and the errno related note, independently.
Change 3: Every modeled function in StdLibraryFunctionsChecker
should have a note tag message in all "cases". This is not implemented yet,
only for file (stream) related functions.
Reviewed By: donat.nagy
Differential Revision: https://reviews.llvm.org/D153612
David Green [Tue, 18 Jul 2023 07:28:27 +0000 (08:28 +0100)]
[AArch64] Regenerate a couple of mir GlobalISel tests. NFC
See D155311
Fangrui Song [Tue, 18 Jul 2023 07:28:17 +0000 (00:28 -0700)]
[lld][test] Remove unused features
"system-linker-elf" and "demangler" have been unused since
lld/test/old-elf/ was removed in 2016.
LiaoChunyu [Tue, 18 Jul 2023 07:10:53 +0000 (15:10 +0800)]
[RISCV] Lower VP_CTLZ_ZERO_UNDEF/VP_CTTZ_ZERO_UNDEF/VP_CTLZ by converting to FP and extracting the exponent.
D111904, D141585 made RISC-V customized lower vector ISD::CTLZ_ZERO_UNDEF/CTTZ_ZERO_UNDEF/CTLZ
by converting to float and using the float result.
Perhaps VP_CTLZ_ZERO_UNDEF/VP_CTTZ_ZERO_UNDEF/VP_CTLZ could use the similar feature.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D155150
Mikhail Goncharov [Tue, 18 Jul 2023 07:20:13 +0000 (09:20 +0200)]
[bazel] fix build of ArithUtils
Balazs Benics [Tue, 18 Jul 2023 07:15:11 +0000 (09:15 +0200)]
[ADT] Remove SFINAE constraint from llvm::iterator_range ctor for gcc-7
It turns out the SFINAE constraint breaks building MLIR using GCC-7,
which is an outdated, but supported compiler by llvm-project.
I tried to find a solution for fixing it, but I decided to cut branches
and just simply remove the SFINAE constraint until we drop GCC-7.
It was originally introduced by D152891.
Allegedly, GCC-8 and above builds just fine.
I tested GCC 8.4.0, and GCC 7.5.0, and now builds fine on both.
Differential Revision: https://reviews.llvm.org/D155441
Fixes https://github.com/llvm/llvm-project/issues/63843
Amir Bishara [Tue, 18 Jul 2023 07:13:20 +0000 (00:13 -0700)]
[mlir][cmake] Comment out redundant static assert regarding VarInfo struct
Reviewed By: aartbik
Differential Revision: https://reviews.llvm.org/D154940
Andrzej Warzynski [Sun, 16 Jul 2023 13:51:18 +0000 (13:51 +0000)]
[mlir][SparseTensor][ArmSVE] Conditionally disable SVE RUN line
This patch updates one SparseTensor integration test so that the VLA
vectorisation is run conditionally based on the value of the
MLIR_RUN_ARM_SME_TESTS CMake variable.
This change opens the path to reduce the duplication of RUN lines in
"mlir/test/Integration/Dialect/SparseTensor/CPU/". ATM, there are
usually 2 RUN lines to test vectorization in SparseTensor integration
tests:
* one for VLS vectorisation,
* one for VLA vectorisation whenever that's available and which
reduces to VLS vectorisation when VLA is not supported.
When VLA is not available, VLS vectorisation is verified twice. This
duplication should be avoided - integration test are relatively
expansive to run.
This patch makes sure that the 2nd vectorisation RUN line becomes:
```
if (SVE integration tests are enabled)
run VLA vectorisation
else
return
```
This logic is implemented using LIT's (relatively new) conditional
substitution [1]. It enables us to guarantee that all RUN lines are
unique and that the VLA vectorisation is only enabled when supported.
This patch updates only 1 test to set-up and to demonstrate the logic.
Subsequent patches will update the remaining tests.
[1] https://www.llvm.org/docs/TestingGuide.html
Differential Revision: https://reviews.llvm.org/D155403
Tomasz Kamiński [Tue, 18 Jul 2023 06:24:17 +0000 (08:24 +0200)]
[analyzer] Bind return value for assigment and copies of trivial empty classes
We now properly bind return value of the trivial copy constructor
and assignments of the empty objects. Such operations do not
perform any loads from the source, however they preserve identity
of the assigned object:
```
Empty e;
auto& x = (e = Empty());
clang_analyzer_dump(x); // &e, was Unknown
```
Reviewed By: xazax.hun
Differential Revision: https://reviews.llvm.org/D155442
Sameer Sahasrabuddhe [Tue, 18 Jul 2023 06:28:25 +0000 (11:58 +0530)]
[llvm] minor cleanup in GenericSSAContext
- update comments to reflect actual state
- use (implicitly inline) constexpr for a const static member
Itay Bookstein [Mon, 17 Jul 2023 18:56:27 +0000 (21:56 +0300)]
[CodeGen] Constify changeTypeToInteger
Surrounding methods are const, seems to be an oversight.
Signed-off-by: Itay Bookstein <itay.bookstein@nextsilicon.com>
Reviewed By: bogner
Differential Revision: https://reviews.llvm.org/D155505
Johannes Doerfert [Tue, 18 Jul 2023 05:47:45 +0000 (22:47 -0700)]
[Attributor][FIX] Initialize variable.
tomasz-kaminski-sonarsource [Mon, 17 Jul 2023 15:04:38 +0000 (17:04 +0200)]
[analyzer] Rework support for CFGScopeBegin, CFGScopeEnd, CFGLifetime elements
This patch reworks generation for the `CFGScopeBegin`, `CFGScopeEnd`,
and `CFGLiftimeEnd`, in a way that they are now compatible with each
other and `CFGAutomaticObjDtor`. All of the above elements are now
generated by a single code path, that conditionally inserts elements if
they are requested.
In addition, the handling of `goto` statements is improved.
The `goto` statement may leave multiple scopes (and trigger destruction
and lifetime end for the affected variables) and enter multiple scopes,
for example:
```lang=C++
{
int s1;
{
int s2;
goto label; // leaves s1, s2, and enters t1 t1
}
}
{
int t1;
{
int t2;
label:
}
}
```
This is performed by first determining the shared parent scope of the
source and destination. And then emitting elements for exiting each
scope between the source and the parent, and entering each scope
between the parent and destination. All such elements are appended
to the source block, as one label may be reached from multiple scopes.
Finally, the approach for handling backward jumps is changed. When
connecting a source block to a destination block that requires the
insertion of additional elements, we put this element into a new block,
which is then linked between the source and the destination block.
For example:
```lang=C++
{
int t;
label:
// Destination block referred to as 'DB'
}
{
// Source block referred to as 'SB'
Obj s;
goto label;
}
```
The jump between `SB` with terminator `T: goto` and `DB` should be
coupled with the following CFG elements:
```
CFGAutomaticObjDtor(s)
CFGLifetimeEnd(s)
CFGScopeEnd(s)
CFGScopeBegin(t)
```
To handle such situations, we create a new link (`LB`) that is linked as
the predecessor of `DB`, to which we transfer the terminator (`goto`
statement) of `SB`. Then `LB` is handled in the same manner as the
source block in the case of forward jumps.
This produces CFG that looks like this:
```
SB -> LB (T: goto) -> DB
```
Finally, the resulting block is linked as the successor of `SB`. Such an
approach uses existing handling of the `noreturn` destructors.
As a reminder, for each destructor of an automatic object that is
marked as `noreturn`, a new `noreturn` block (marked `NBn`) is
created, at the destructor is inserted at the end of it.
To illustrate, given two `noreturn` destructors, we will have:
```
SB -> NB1 (noreturn)
NB2 (noreturn)
LB (T:goto) -> DB
```
Reviewed By: ymandel, steakhal
Differential Revision: https://reviews.llvm.org/D153273
Fangrui Song [Tue, 18 Jul 2023 04:50:55 +0000 (21:50 -0700)]
[lit] Remove unreachable @ expansion code
ArgumentParser expands @ (fromfile_prefix_chars) by default, so the
expansion code path is unused.
Charlie Barto [Tue, 18 Jul 2023 04:02:06 +0000 (21:02 -0700)]
[sanitizer][asan][win] Intercept _strdup on Windows instead of strdup
Intercept `_strdup` on windows, instead of the nonexistent `strdup`.
Jianjian GUAN [Mon, 17 Jul 2023 08:02:25 +0000 (16:02 +0800)]
[AVR][NFC] Merge AVRMCCodeEmitter::emitInstruction into AVRMCCodeEmitter::encodeInstruction.
The reasons are:
1, `AVRMCCodeEmitter::emitInstruction` has only one use which is `AVRMCCodeEmitter::encodeInstruction`, and the parameter `STI` is not used in this function. I think it might be copied from other target.
2, We do have `AVRAsmPrinter::emitInstruction`, and it would invoke `AVRMCCodeEmitter::encodeInstruction` in its calling chain, so if we call `AVRMCCodeEmitter::emitInstruction` in `AVRMCCodeEmitter::encodeInstruction`, it would be confusing.
Reviewed By: benshi001
Differential Revision: https://reviews.llvm.org/D155426
Youling Tang [Tue, 18 Jul 2023 01:40:20 +0000 (09:40 +0800)]
[fuzzer] Enable loongarch64
Enable fuzzer on loongarch64.
Reviewed By: SixWeining, xen0n, MaskRay
Differential Revision: https://reviews.llvm.org/D140601
Mehdi Amini [Mon, 17 Jul 2023 19:47:39 +0000 (12:47 -0700)]
Revert "Remove rdar links; NFC"
This reverts commit
d618f1c3b12effd0c2bdb7d02108d3551f389d3d.
This commit wasn't reviewed ahead of time and significant concerns were
raised immediately after it landed. According to our developer policy
this warrants immediate revert of the commit.
https://llvm.org/docs/DeveloperPolicy.html#patch-reversion-policy
Differential Revision: https://reviews.llvm.org/D155509
Robert Suderman [Mon, 17 Jul 2023 23:14:16 +0000 (16:14 -0700)]
[mlir][linalg] Add a padding case for `ComplexType`
If the paddingAttr is an ArrayAttr with two values we know that
the element type is a `ComplexType` and we should pad the value
accordingly.
Reviewed By: mravishankar
Differential Revision: https://reviews.llvm.org/D154908
Konstantina Mitropoulou [Fri, 16 Jun 2023 02:02:33 +0000 (19:02 -0700)]
[DAGCombiner] Change foldAndOrOfSETCC() to optimize and/or patterns
CMP(A,C)||CMP(B,C) => CMP(MIN/MAX(A,B), C)
CMP(A,C)&&CMP(B,C) => CMP(MIN/MAX(A,B), C)
This first patch handles integer types.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D153502
Konstantina Mitropoulou [Wed, 21 Jun 2023 22:53:47 +0000 (15:53 -0700)]
[NFC] Tests for future commit in DAGCombiner
Reviewed By: arsenm
Differential Revision: https://reviews.llvm.org/D153479