5450 Commits

Author SHA1 Message Date
Matt Arsenault
a4610c2064 TableGen: Fix missing C++ mode comments 2023-05-10 08:01:27 +01:00
Alexey Vishnyakov
9c07aa75b9 [TableGen] Fix null pointer dereferences in TreePattern::ParseTreePattern()
Bugs were found by Svace static analysis tool. Null pointers are
dereferenced right after error checking that does not return from
function.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D147706
2023-05-09 18:06:10 -07:00
Jon Roelofs
30b4351c7c
cmake: add missing dependencies on Attributes.inc
Differential revision: https://reviews.llvm.org/D150144
2023-05-08 15:35:57 -07:00
Akshay Khadse
5c7c3af1d0 Reapply [Coverity] Fix explicit null dereferences
This change fixes static code analysis errors

Reviewed By: skan

Differential Revision: https://reviews.llvm.org/D149506
2023-05-08 21:19:40 +08:00
NAKAMURA Takumi
631bfdbee5 Switch llvm/CodeGen/MachineValueType.h to the generated one
Prune `SupportTests/MVTTest` since it is no longer needed.

Depends on D148769

Differential Revision: https://reviews.llvm.org/D148770
2023-05-03 00:13:20 +09:00
NAKAMURA Takumi
5d71ec6e44 Split out CodeGenTypes from CodeGen for LLT/MVT
This reduces dependencies on `llvm-tblgen` so much.

`CodeGenTypes` depends on `Support` at the moment.
Be careful to append deps on this, since Targets' tablegens
depend on this.

Depends on D149024

Differential Revision: https://reviews.llvm.org/D148769
2023-05-03 00:13:20 +09:00
NAKAMURA Takumi
c1221251fb Restore CodeGen/MachineValueType.h from Support
This is rework of;

  - rG13e77db2df94 (r328395; MVT)

Since `LowLevelType.h` has been restored to `CodeGen`, `MachinveValueType.h`
can be restored as well.

Depends on D148767

Differential Revision: https://reviews.llvm.org/D149024
2023-05-03 00:13:20 +09:00
NAKAMURA Takumi
9cfeba5b12 Restore CodeGen/LowLevelType from Support
This is rework of;
  - D30046 (LLT)

Since I have introduced `llvm-min-tblgen` as D146352, `llvm-tblgen`
may depend on `CodeGen`.

`LowLevlType.h` originally belonged to `CodeGen`. Almost all userse are
still under `CodeGen` or `Target`. I think `CodeGen` is the right place
to put `LowLevelType.h`.

`MachineValueType.h` may be moved as well. (later, D149024)

I have made many modules depend on `CodeGen`. It is consistent but
inefficient. It will be split out later, D148769

Besides, I had to isolate MVT and LLT in modmap, since
`llvm::PredicateInfo` clashes between `TableGen/CodeGenSchedule.h`
and `Transforms/Utils/PredicateInfo.h`.
(I think better to introduce namespace llvm::TableGen)

Depends on D145937, D146352, and D148768.

Differential Revision: https://reviews.llvm.org/D148767
2023-05-03 00:13:19 +09:00
NAKAMURA Takumi
65365cff3b Add deps on LLVMTableGenCommon even if it is actually unused. 2023-05-02 12:43:16 +09:00
NAKAMURA Takumi
137d8039e4 llvm-tblgen: Split out obj.LLVMTableGenCommon
`$<TARGET_OBJECTS:llvm-min-tblgen>` was too lazy.
It has `rc.res` in the list with MS toolchain.

Fixup for D146352
2023-05-02 12:25:28 +09:00
NAKAMURA Takumi
243e8f8d23 Introduce llvm-min-tblgen to build public header files
`llvm-min-tblgen` is capable of building `llvm/include/llvm`;

- `-gen-attrs`
- `-gen-directive-*`
- `-gen-intrinsics-*`
- `-gen-riscv-target-def`

`llvm-min-tblgen` is built and used only when `llvm-tblgen` is built in-tree.
This is not installed.

`llvm-tblgen` is built with complete set and may be installed.
`check-llvm` uses not `llvm-min-tblgen` but `llvm-tblgen`.

`LLVM_TABLEGEN_PROJECT` overrides the definition of `tablegen(project)`.
`LLVM_HEADERS` is used as the overridden prefix for LLVM header generators.

If `EXPORT` is not specified in `add_tablegen`, its tablegen is treated as internal.

Let `llvm-tblgen` depend on `intrinsics_gen`

Depends on D149072

Differential Revision: https://reviews.llvm.org/D146352
2023-05-02 11:32:22 +09:00
Craig Topper
09f6bdda24 [RISCV] Remove INVALID from the list of CPUs in RISCVTargetParser. NFC
This value is never used outside and is only used as a sentinel
internally which we can solve with other means.
2023-05-01 15:26:09 -07:00
Sergei Barannikov
60f815d241 [TableGen] Forward declare CodeGenRegister et al. (NFC) 2023-04-30 07:01:00 +03:00
Matt Arsenault
bc37be1855 LangRef: Add "dynamic" option to "denormal-fp-math"
This is stricter than the default "ieee", and should probably be the
default. This patch leaves the default alone. I can change this in a
future patch.

There are non-reversible transforms I would like to perform which are
legal under IEEE denormal handling, but illegal with flushing zero
behavior. Namely, conversions between llvm.is.fpclass and fcmp with
zeroes.

Under "ieee" handling, it is legal to translate between
llvm.is.fpclass(x, fcZero) and fcmp x, 0.

Under "preserve-sign" handling, it is legal to translate between
llvm.is.fpclass(x, fcSubnormal|fcZero) and fcmp x, 0.

I would like to compile and distribute some math library functions in
a mode where it's callable from code with and without denormals
enabled, which requires not changing the compares with denormals or
zeroes.

If an IEEE function transforms an llvm.is.fpclass call into an fcmp 0,
it is no longer possible to call the function from code with denormals
enabled, or write an optimization to move the function into a denormal
flushing mode. For the original function, if x was a denormal, the
class would evaluate to false. If the function compiled with denormal
handling was converted to or called from a preserve-sign function, the
fcmp now evaluates to true.

This could also be of use for strictfp handling, where code may be
changing the denormal mode.

Alternative name could be "unknown".

Replaces the old AMDGPU custom inlining logic with more conservative
logic which tries to permit inlining for callees with dynamic handling
and avoids inlining other mismatched modes.
2023-04-29 08:44:59 -04:00
NAKAMURA Takumi
24706aff15 TableGen: Replace IntrinsicEmitter::ComputeFixedEncoding() and cleanup
Depends on D146915

Differential Revision: https://reviews.llvm.org/D145937
2023-04-26 23:49:08 +09:00
NAKAMURA Takumi
91b80ce417 TableGen: Implement TypeSig generator in Intrinsics.td
This commit doesn't replace `IntrinsicEmitter::ComputeFixedEncoding()`,
but compares outputs to it, to make sure implementation correct.

Depends on D145871, D145872, D145874, and D146914

Differential Revision: https://reviews.llvm.org/D146915
2023-04-26 23:48:39 +09:00
NAKAMURA Takumi
5540e29a0a Reformat 2023-04-26 23:47:15 +09:00
NAKAMURA Takumi
c49f850d55 Migrate IIT_Info into Intrinsics.td
- Define `IIT_Info` in `Intrinsics.td`
  - Implement `EmitIITInfo` in `IntrinsicEmitter.cpp`
  - Use generated `IIT_Info` in `Function.cpp`

Depends on D145873 and D146179

Differential Revision: https://reviews.llvm.org/D146914
2023-04-25 08:53:18 +09:00
NAKAMURA Takumi
ddaf085e7b Fully generate MachineValueType.h
Part of D146914
2023-04-25 08:53:18 +09:00
Tom Weaver
b63c08c773 Revert "[Coverity] Fix explicit null dereferences"
This reverts commit 22b23a5213b57ce1834f5b50fbbf8a50297efc8a.

This commit caused the following two build bots to start failing:
https://lab.llvm.org/buildbot/#/builders/216/builds/20322
https://lab.llvm.org/buildbot/#/builders/123/builds/18511
2023-04-24 11:14:10 +01:00
Craig Topper
d20c29d996 [TableGen] Make getRegisterValueType stricter about HwModes.
I don't think this code would work correctly if the register class
used used HwModes. Add asserts to make sure it's not used with HwModes.

Also fix a long outdated comment on the function.
2023-04-23 23:28:23 -07:00
Shengchen Kan
9616fd1a7d [X86][tablgen] Fix typo in comments, NFC 2023-04-24 13:57:00 +08:00
Craig Topper
7a6dc3d24c [TableGen] Remove unused ForceMode and CodeGen fields from TypeInfer. NFC
As well as the ForceMode field in PatternToMatch.
2023-04-23 20:32:14 -07:00
Craig Topper
24a8251b04 [TableGen] Remove unused method form ScopeMatcher. NFC 2023-04-23 00:44:50 -07:00
Craig Topper
a8aa43bb1a [TableGen] Intialize vector with constructor instead of assign. NFC 2023-04-22 22:37:57 -07:00
Akshay Khadse
22b23a5213 [Coverity] Fix explicit null dereferences
This change fixes static code analysis errors

Reviewed By: skan

Differential Revision: https://reviews.llvm.org/D148912
2023-04-23 12:07:11 +08:00
Craig Topper
d280187093 [TableGen] Re-work FactorNodes to avoid an extra temporary vector.
Instead of copying elements to the NewOptionsToMatchVector, we
now shift down elements in OptionsToMatch as we create holes by
pulling out equal matchers. After we finish processing the vector,
we'll trim the size to just the elements that are still in use.
2023-04-22 21:04:55 -07:00
NAKAMURA Takumi
ad6e878b80 [CMake] Reorder deps and reformat 2023-04-23 11:29:44 +09:00
Craig Topper
63f6e70be9 [TableGen] Early exit from ExpandHwModeBasedTypes when there are no HwModes.
Most targets don't use HwModes. For these targets we can skip
collecting the HwModes and copying all the pattern pointers.
2023-04-21 17:27:25 -07:00
Craig Topper
8769a945eb [TableGen] Remove some unnecessary TreePatternNodePtrs. NFC
The patterns we're referring are still owned by the PatternToMatch
object. We don't need to increment their reference count here.
2023-04-21 17:11:09 -07:00
Akshay Khadse
66219728e3 [Coverity] Fix uninitialized scalar members in TableGen
This change fixes static code analysis warnings

Reviewed By: skan

Differential Revision: https://reviews.llvm.org/D148815
2023-04-21 17:42:33 +08:00
Shengchen Kan
33e2e713c6 [X86][Tablgen] Rename IgnoresVEX_W to IgnoresW, VEX_WIG to WIG, NFCI
We no longer distinguish REX.W from VEX.W in .td.
2023-04-20 11:15:09 +08:00
Craig Topper
d34125a1a8 [TableGen] Use heap allocated arrays instead of vectors for TreePatternNode::Types and ResultPerm. NFC
These vectors are resized in the constructor and never change size.
We can manually allocate two arrays instead.

This reduces the size of TreePatternNode by removing the
unneeded capacity end pointer fields from the std::vector.
2023-04-19 15:22:58 -07:00
Chen Zheng
3f4055dec4 [GlobalISelEmitter] handle operand without MVT/class
There are some patterns in td files without MVT/class set
for some operands in target pattern that are from the source
pattern. This prevents GlobalISelEmitter from adding them as
a valid rule, because the target child operand is an
unsupported kind operand. For now, for a leaf child, only
IntInit and DefInit are handled in GlobalISelEmitter.

This issue can be workaround by adding MVT/class to the
patterns in the td files, like the workarounds for patterns
anyext and setcc in PPCInstrInfo.td in D140878.

To avoid adding the same workarounds for other patterns in
td files, this patch tries to handle the UnsetInit case in
GlobalISelEmitter.

Adding the new handling allows us to remove the workarounds
in the td files and also generates many selection rules for
PPC target.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D141247
2023-04-19 07:00:57 +00:00
Craig Topper
83507644ed [TableGen] Reduce the amount of storage space used for AddrSpaces in TypeSetByHwMode. NFC
We reserved 16 AddrSpaces in every TypeSetByHwMode. But we only ever
use the first one on targets that make use of the AddrSpace feature.

The vector was populated by pushing for each entry in the ArrayRef
passed to the TypeSetByHwMode constructor. Each entry is a
ValueTypeByHwMode that stores one VT for each HwMode.

The vector is accessed by a loop in TypeSetByHwMode::getValueTypeByHwMode.
That loop is over HwModes with in the TypeSetByHwMode. This is
unrelated to how the vector was created. The entries in the vector
don't represent HwModes.

The targets that use AddrSpace don't make use of HwModes so the
loop in getValueTypeByHwMode will only run 1 iteration. So we only
the first entry in the vector is meaningful used.

This patch simplifies things by storing only 1 AddrSpace in
TypeSetByMode. Reducing the memory used by TypeSetByHwMode.
More work will be needed to support HwModes with AddrSpace if we
need a different AddrSpace for each HwMode.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D148194
2023-04-18 15:34:22 -07:00
Akshay Khadse
ba46252b69 Fix uninitialized pointer members in TableGen
Fixes static code analysis errors

Reviewed By: LuoYuanke

Differential Revision: https://reviews.llvm.org/D148464
2023-04-18 18:57:05 +08:00
Craig Topper
46b536f822 [TableGen] Const-correct TreePatternNode::getChild. NFC
Make the const version return a const TreePatterNode* and add a non-const
version to return a non-const TreePatternNode*.
2023-04-18 01:20:42 -07:00
Craig Topper
c446f2dbab [TableGen] Call std::vector::reserve to preallocate memory before a loop of push_back. NFC 2023-04-18 00:31:38 -07:00
Craig Topper
528b25c64a [TableGen] clang-format some recent changes. NFC 2023-04-17 20:26:47 -07:00
Shraiysh Vaishay
7021182d6b [nfc][llvm] Replace pointer cast functions in PointerUnion by llvm casting functions.
This patch replaces the uses of PointerUnion.is function by llvm::isa,
PointerUnion.get function by llvm::cast, and PointerUnion.dyn_cast by
llvm::dyn_cast_if_present. This is according to the FIXME in
the definition of the class PointerUnion.

This patch does not remove them as they are being used in other
subprojects.

Reviewed By: mehdi_amini

Differential Revision: https://reviews.llvm.org/D148449
2023-04-17 13:40:51 -05:00
Craig Topper
73925b3a0c [TableGen] Use PointerUnion for Operator and Val in TreePatternNode.
These fields are never set at the same time so we can store them
using a single PointerUnion.
2023-04-16 20:10:51 -07:00
Craig Topper
f0c3dfdbf1 [TableGen] Avoid extra IntrusiveRefCntPtr when calling SimplifyTree. NFC
Add a helper to get modifiable access to the IntrusiveRefCntPtr
stored in the Children array. This avoids copying and overwriting the child.
2023-04-16 18:57:27 -07:00
Craig Topper
56fdac60aa [TableGen] Make InlinePatternFragments a member of TreePatternNode again. NFC
Now that we use IntrusiveRefCntPtr instead of std::shared_ptr
we don't need to pass a TreePatternNodePtr to this method.
2023-04-14 19:43:44 -07:00
Craig Topper
40e356d67f [TableGen] Replace std::shared_ptr with InstrusiveRefCntPtr for TreePatternNode. NFC
An intrusive reference counter uses less memory than the control
block of std::shared_ptr.

This should allow some additional code simplifications if we
don't need to pass around shared_ptr in order to create new
shared_ptrs.
2023-04-14 10:56:36 -07:00
NAKAMURA Takumi
fcc5f9ef50 Generate staging MachineValueType.h (partially) from ValueTypes.td
- Implement `VTEmitter` as `llvm-tblgen -gen-vt`.
- Create a copy of `llvm/Support/MachineValueType.h` into `unittests/Support`.
  It includes `GenVT.inc` generated by `VTEmitter`.
- Implement `MVTTest` in `SupportTests`. It checks equivalence between
  `llvm/Support/MachineValueType.h` and the generated header.

Differential Revision: https://reviews.llvm.org/D146906
2023-04-14 08:41:44 +09:00
Craig Topper
44d46c4b3c [TableGen] Store CodeGenInstruction reference in EmitNodeMatcherCommon. NFC
Instead of storing a string containing the instruction name, store a
reference to the instruction. We can use that reference to print the
instruction name when we emit the table.

The only slightly annoying part is that we have to find the
CodeGenInstruction for IMPLICIT_DEF. GlobalISel is doing
a similar thing.
2023-04-12 20:44:36 -07:00
Craig Topper
bb2e9f23ca [TableGen] Call std::vector::reserve to preallocate memory before a loop of push_back. NFC 2023-04-11 00:07:57 -07:00
Bing1 Yu
213b735894 [NFC] add check for potentially dereferencing null return value
Reviewed By: pengfei

Differential Revision: https://reviews.llvm.org/D147771
2023-04-11 14:42:47 +08:00
Craig Topper
7df434e3ff [TableGen] Avoid vector copy in TreePatter::InlinePatternFragments. NFC
Instead of copying a vector and clearing the original, we can swap
with an empty vector.
2023-04-10 23:01:15 -07:00
Craig Topper
dea417f75e [TableGen] Pass TreePatternNodePtr to InlinePatternFragments by const reference. NFC
Not all paths through this function require the reference count
to be incremened. Pass by reference so we don't increase the count
unnecessarily.
2023-04-10 15:04:24 -07:00