54000 Commits

Author SHA1 Message Date
Alexis Engelke
bb260eb87d
[CodeGen] Only deduplicate PHIs on critical edges (#97064)
PHIElim deduplicates identical PHI nodes to reduce the number of copies
inserted. There are two cases:

1. Identical PHI nodes are in different blocks. That's the reason for
   this optimization; this can't be avoided at SSA-level. A necessary
   prerequisite for this is that the predecessors of all basic blocks
   (where such a PHI node could occur) are the same. This implies that
   all (>= 2) predecessors must have multiple successors, i.e. all edges
   into the block are critical edges.

2. Identical PHI nodes are in the same block. CSE can remove these.
   There are a few cases, however, where they still occur regardless:

   - expand-large-div-rem creates PHI nodes with large integers, which
     get lowered into one PHI per MVT. Later, some identical values
     (zeroes) get folded, resulting in identical PHI nodes.
   - peephole-opt occasionally inserts PHIs for the same value.
   - Some pseudo instruction emitters create redundant PHI nodes (e.g.,
     AVR's insertShift), merging the same values more than once.

   In any case, this happens rarely and MachineCSE handles most cases
   anyway, so that PHIElim only gets to see very few of such cases (see
   changed test files).

Currently, all PHI nodes are inserted into a DenseMap that checks
equality not by pointer but by operands. This hash map is pretty
expensive (hashing itself and the hash map), but only really useful in
the first case.

Avoid this expensive hashing most of the time by restricting it to basic
blocks with only critical input edges. This improves performance for
code with many PHI nodes, especially at -O0. (Note that Clang often
doesn't generate PHI nodes and -O0 includes no mem2reg. Other
compilers always generate PHI nodes.)
2024-07-03 11:19:05 +02:00
Jay Foad
f3a02253e9
[test] Remove immarg parameter attribute from calls (#97432)
It is documented that immarg is only valid on intrinsic declarations,
although the verifier also tolerates it on intrinsic calls.

This patch updates tests that are not specifically testing the
behavior of the IR parser or verifier.
2024-07-03 09:02:31 +01:00
Luke Lau
b3be148967
[RISCV] Use LiveIntervals::extendToIndices to extend AVL in insertVSETVLI (#97512)
In #96200 we handled extending AVL LiveIntervals across basic blocks,
which fixed a crash in a test case in
133ab9a8c82a31549f060da33fd7e14f1d7f39fd.

This was done by manually adding a single segment to the LiveInterval to
extend it from AVL def -> inserted vsetvli, but in hindsight this was
too simple and fails to handle cases where the vsetlvi is located before
the AVL def.

This patch fixes this by using LiveIntervals::extendToIndices instead
which can handle these cases.

(The crash that this fixes is separate from the crash in #97264)
2024-07-03 16:01:23 +08:00
Thorsten Schütt
c5b67dde98
[GlobalIsel][NFC] Modernize UBFX combine (#97513)
Credits: https://reviews.llvm.org/D99283
2024-07-03 09:19:40 +02:00
Fabian Ritter
e1094dd889
[AMDGPU][DAG] Enable ganging up of memcpy loads/stores for AMDGPU (#96185)
In the SelectionDAG lowering of the memcpy intrinsic, this optimization
introduces additional chains between fixed-size groups of loads and the
corresponding stores. While initially introduced to ensure that wider
load/store-pair instructions are generated on AArch64, this optimization
also improves code generation for AMDGPU: Ganged loads are scheduled
into a clause; stores only await completion of their corresponding load.

The chosen value of 16 performed good in microbenchmarks, values of 8,
32, or 64 would perform similarly.
The testcase updates are autogenerated by
utils/update_llc_test_checks.py.

See also:
 - PR introducing this optimization: https://reviews.llvm.org/D46477

Part of SWDEV-455845.
2024-07-03 08:32:35 +02:00
Min-Yih Hsu
8b55d342b6
[RISCV][LoopIdiomVectorize] Support VP intrinsics in LoopIdiomVectorize (#94082)
Teach LoopIdiomVectorize to use VP intrinsics to replace the byte
compare loops. Right now only RISC-V uses LoopIdiomVectorize of this
style.
2024-07-02 18:48:28 -07:00
Ryotaro KASUGA
0a369b06e3
Reapply "[MachinePipeliner] Fix constraints aren't considered in cert… (#97259)
…ain cases" (#97246)

This reverts commit e6a961dbef773b16bda2cebc4bf9f3d1e0da42fc.

There is no difference from the original change. I re-ran the failed
test and it passed. So the failure wasn't caused by this change.
test result: https://lab.llvm.org/buildbot/#/builders/176/builds/585
2024-07-03 09:15:41 +09:00
Evgenii Kudriashov
b5b0a22ecc
[X86][GlobalISel] Support StructRet arguments (#96629)
We follow SelectionDAG and FastISel manner: set a register during formal
arguments lowering and use this register to insert a copy of StructRet
argument to RAX register during return lowering.

Also add RAX register to RET instruction to fix a difference between
GlobalISel and SelectionDAG, when the copy instruction could be
deleted.
2024-07-03 00:56:50 +02:00
Igor Kudrin
23db37c51c
[CodeGen] Do not emit TRAP for unreachable after @llvm.trap (#94570)
With `--trap-unreachable`, `clang` can emit double `TRAP` instructions
for code that contains a call to `__builtin_trap()`:

```
> cat test.c
void test() { __builtin_trap(); }
> clang test.c --target=x86_64 -mllvm --trap-unreachable -O1 -S -o -
...
test:
...
  ud2
  ud2
...
```

`SimplifyCFGPass` inserts `unreachable` after a call to a `noreturn`
function, and later this instruction causes `TRAP/G_TRAP` to be emitted
in `SelectionDAGBuilder::visitUnreachable()` or
`IRTranslator::translateUnreachable()` if
`TargetOptions.TrapUnreachable` is set.

The patch checks the instruction before `unreachable` and avoids
inserting an additional trap.
2024-07-02 15:36:02 -07:00
Matt Arsenault
79516ddbee
AMDGPU: Fix assert from wrong address space size assumption (#97267)
This was assuming the source address space was at least as large
as the destination of the cast. I'm not sure why this was casting
to begin with; the assumption seems to be the source
address space from the root addrspacecast matches the underlying
object so directly check that.

Fixes #97457
2024-07-02 23:18:25 +02:00
Igor Kudrin
45507166a1
[AArch64][MachineOutliner][NFC] Re-enable some tests (#96376)
Part of the tests did not run and some checks were missing due to
incorrect prefixes. The patch also updates the check lines to catch up
with recent changes.

The problematic revisions were:
 * [D70635](https://reviews.llvm.org/D70635)
 * [D71658](https://reviews.llvm.org/D71658)
 * [D111780](https://reviews.llvm.org/D111780)
2024-07-02 14:17:34 -07:00
Tim Gymnich
2ee86a1ebb
[AArch64][GlobalISel] Improve non-SVE popcount for 32bit and 64 bit using udot (#96409)
Follow up for #95881

Use udot instead of a sequence of uaddlp instructions when summing up
lanes for popcount.
2024-07-02 22:01:58 +01:00
Philip Reames
7217201dd9 [RISCV] Add coverage of build vectors with rv32 + v + bitmanip
rv32+v allows cases with XLEN < ELEN, and since we're about to add
a bitmanip specific lowering, it's good to have coverage of this
corner case.
2024-07-02 10:09:37 -07:00
Simon Pilgrim
1f7d31e342 [AMDGPU] Regenerate srem.ll tests - more closely match the testing in sdiv.ll 2024-07-02 17:14:39 +01:00
Paul Kirth
b146a57f67
Reapply "[RISCV] Support RISCV Atomics ABI attributes (#84597)"
This patch adds support for the atomic_abi attribute, specifid in
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#tag_riscv_atomic_abi-14-uleb128version.

This was previously reverted due to ld.bfd segfaulting w/ unknown riscv
attributes. Attribute emission is now guarded by a backend flag
`--riscv-abi-attributes`, which is off by default. Linker support in
LLD for attribute merging is now in a standalone patch.

Reviewers: kito-cheng, MaskRay, asb

Reviewed By: MaskRay

Pull Request: https://github.com/llvm/llvm-project/pull/90266
2024-07-02 08:23:03 -07:00
Jay Foad
43b9888214
[AMDGPU] Use nan as the identity for atomicrmw fmax/fmin (#97411)
atomicrmw fmax/fmin perform the same operation as llvm.maxnum/minnum
which return the other operand if one operand is nan. This means that,
in the presence of nan arguments, +/- inf is not an identity for these
operations but nan is (at least if you don't care about nan payloads).
2024-07-02 15:45:36 +01:00
Matt Arsenault
940ea5b8c5 AMDGPU: Add some exotic truncating store tests
PR#97010 is touching the legalize rules for 5 vector stores,
but not all of them so check some more cases to make sure they work.
2024-07-02 16:33:36 +02:00
Tim Gymnich
696805d133
[AArch64] Improve non-SVE popcount for 32bit and 64 bit using udot (#95881)
fixes #95860

Use `udot` instead of a sequence of `uaddlp` instructions when summing
up lanes for `popcount`.
2024-07-02 14:45:01 +01:00
Luke Lau
62a967d5dc
[RISCV] Return nullptr for PHI defs in VSETVLIInfo::getAVLDefMI (#97395)
When checking if a VSETVLIInfo is compatible, we call hasEquallyZeroAVL
if only the AVL-zeroness is demanded. This will try to lookup the
defining MachineInstr (to check if it's an ADDI immediate) via
getAVLDefMI, but in it we were asserting that the VSETVLIInfo's AVL
wouldn't come from a phi. It turns out this can happen in normal
circumstances.

This causes a crash when compiling highway, so this fixes it by relaxing
the assertion.
2024-07-02 20:41:11 +08:00
Heejin Ahn
fb6e024f49
[WebAssembly] Update generic and bleeding-edge CPUs (#96584)
This updates the list of features in 'generic' and 'bleeding-edge' CPUs
in the backend to match

4e0a0eae58/clang/lib/Basic/Targets/WebAssembly.cpp (L150-L178)

This updates existing CodeGen tests in a way that, if a test has
separate RUN lines for a reference-types test and a non-reference-types
test, I added -mattr=-reference-types to the no-reftype test's RUN
command line. I didn't delete existing -mattr=+reference-types lines in
reftype tests because having it helps readability.

Also, when tests is not really about reference-types but they have to
updated because they happen to contain call_indirect lines because now
call_indirect will take __indirect_function_table as an argument, I just
added the table argument to the expected output.

`target-features-cpus.ll` has been updated reflecting the newly added
features.
2024-07-01 19:12:01 -07:00
Yunzezhu94
a833fa7d3e
[RISCV] Move Machine Copy Propagation Pass before Branch relaxation pass (#97261)
Machine Copy Propagation Pass may enlarge branch relaxation distance by
breaking generation of compressed insts. This commit moves Machine Copy
Propagation Pass before Branch relaxation pass so the results of Branch
relaxation pass won't be affected by Machine Copy Propagation Pass.
2024-07-02 09:58:00 +08:00
Chengjunp
cbd3f252e3
[NVPTX] Support inline asm with 128-bit operand in NVPTX backend (#97113)
This change supports the 128-bit operands for inline ptx asm, both input
and output.\
\
The major changes are:

- Tablegen:\
    Define Int128Regs in NVPTXRegisterInfo.td. But this register does
not set as general register type in NVPTX backend so that this change
will not influence the codegen without inline asm.\
    Define three NVPTX intrinsics, IMOV128rr, V2I64toI128 and
I128toV2I64. The first one moves a register, the second one moves two
64-bit registers into one 128-bit register, and the third one just does
the opposite.
- NVPTXISelLowering & NVPTXISelDAGToDAG:\
    Custom lowering CopyToReg and CopyFromReg with 128-bit operands.
CopyToReg deals with the inputs of the inline asm and the CopyFromReg
deals with the outputs.\
    CopyToReg is custom lowered into a V2I64toI128, which takes in the
expanded values(Lo and Hi) of the input, and moves into a 128-bit reg.\
    CopyFromReg is custom lowered by adding a I128toV2I64, which breaks
down the 128-bit outputs of inline asm into the expanded values.
2024-07-01 16:30:33 -07:00
Craig Topper
7e6e4986e6
[RISCV] Use EXTLOAD instead of ZEXTLOAD when lowering riscv_masked_strided_load with zero stride. (#97317)
The splat we generate after the load doesn't use the extended bits, so it
shouldn't matter which extend type we use.

EXTLOAD is lowered as SEXTLOAD on every element type except i8.
2024-07-01 13:11:52 -07:00
Philip Reames
ae6549a7d9 [RISCV] Add build vector coverage for rva22u + V 2024-07-01 13:10:04 -07:00
Shilei Tian
9a4f57ec1e
[SelectionDAG] Use EVT::getIntegerVT in getBitcastedAnyExtOrTrunc (#96658)
`SelectionDAG::getBitcastedAnyExtOrTrunc` assumes that there is always a
valid
integer type corresponding to another type, which is not always true
when it
comes to vector type. For example, `<3 x i8>` doesn't have a
corresponding
integer type.

Fix SWDEV-464698.
2024-07-01 15:10:57 -04:00
Matt Arsenault
bff619f910 Revert "AMDGPU: Use real copysign in fast pow (#97152)"
This reverts commit d3e7c4ce7a3d7f08cea02cba8f34c590a349688b.
2024-07-01 20:54:50 +02:00
Matt Arsenault
d3e7c4ce7a
AMDGPU: Use real copysign in fast pow (#97152)
Previously this would introduce some codegen regressions, but
those have been avoided by simplifying demanded bits on copysign
operations.
2024-07-01 20:16:22 +02:00
Jeffrey Byrnes
f903e3ec77 [AMDGPU] Reset kill flags for multiple uses of SDWAInst Ops
Change-Id: I8b56d86a55c397623567945a87ad2f55749680bc
2024-07-01 09:14:02 -07:00
Simon Pilgrim
e6bc72dfe8 [X86] Add MOVMSK bit extraction test coverage for #66191
Regressions due to middle-end canonicalizing ICMP_EQ(AND(X,MSB),0) -> ICMP_SGT(X,-1) etc.
2024-07-01 15:28:07 +01:00
Matt Arsenault
0d88f662ff GlobalISel: ComputeNumSignBits from load range metadata
We're missing SimplifyDemandedBits styles of optimizations,
so one case differs from the DAG from not trimming the constant.
The other case is an optimization we get that the DAG doesn't do to
split the 64-bit shift.

https://reviews.llvm.org/D138082
2024-07-01 15:26:50 +02:00
Matt Arsenault
7032076242
GlobalISel: Drop vector range metadata on bitcast lowering (#97279)
If we are reinterpreting the type, the range metadata also needs to be
converted. I believe the DAG has the same bug.
2024-07-01 15:26:09 +02:00
David Sherwood
7b2e16f952
[AArch64] Fix scheduling model issue #96394 (#97047)
The NeoverseZeroMove predicate assumes that the first operand is always
an immediate, which isn't always true. For example, it could be a stack
offset, etc. This patch fixes that by checking if the operand is an
immediate first.
2024-07-01 11:34:23 +01:00
Matt Arsenault
8eee6d33f7
DAG: Call SimplifyDemandedBits on copysign value operand (#97180)
So far the only cases that seem to benefit are the weird
copysign with different typed inputs.
2024-07-01 12:29:11 +02:00
Matt Arsenault
db9252b115
DAG: Call SimplifyDemandedBits on fcopysign sign value (#97151)
Math library code has quite a few places with complex bit
logic that are ultimately fed into a copysign. This helps
avoid some regressions in a future patch.

This assumes the position in the float type, which should
at least be valid for IEEE types. Not sure if we need to guard
against ppc_fp128 or anything else weird.

There appears to be some value in simplifying the value operand
as well, but I'll address that separately.
2024-07-01 12:19:17 +02:00
Matt Arsenault
c769dc457c
AMDGPU: Add baseline test for copysign combine (#97150)
Pre-commit tests showing we try to SimplifyDemandedBits on the
sign operand.
2024-07-01 12:14:57 +02:00
Matt Arsenault
3562001007 AMDGPU: Regenerate test checks to avoid spurious diff 2024-07-01 11:10:17 +02:00
Shengchen Kan
32273ea22d [X86][test] Add a separate test for NDD CMOV 2024-07-01 15:32:23 +08:00
CarolineConcatto
6859e5a169
[CLANG][LLVM][AArch64]Add SME2.1 intrinsics for MOVAZ array to vector (#88901)
According to the specification in
    ARM-software/acle#309 this adds the intrinsics

    Move and zero multiple ZA single-vector groups to vector registers

    // Variants are also available for _za8_u8, _za16_s16, _za16_u16,
    // _za16_f16, _za16_bf16, _za32_s32, _za32_u32, _za32_f32,
    // _za64_s64, _za64_u64 and _za64_f64
    svint8x2_t svreadz_za8_s8_vg1x2(uint32_t slice)
    __arm_streaming __arm_inout("za");

    // Variants are also available for _za8_u8, _za16_s16, _za16_u16,
    // _za16_f16, _za16_bf16, _za32_s32, _za32_u32, _za32_f32,
    // _za64_s64, _za64_u64 and _za64_f64
    svint8x4_t svreadz_za8_s8_vg1x4(uint32_t slice)
    __arm_streaming __arm_inout("za");
2024-07-01 08:23:16 +01:00
Luke Lau
651e91658b [RISCV] Add missing CHECK lines for new vsetvli test. NFC 2024-07-01 14:05:22 +08:00
Luke Lau
95b0187165
[RISCV] Remove deleted AVL register defs from LiveInterval instr maps (#97011)
When coalescing vsetvlis we might remove a use of a register AVL, which
in turn might leave the AVL def dead. When it's dead (currently limited
to just ADDIs) we delete the def, but we were forgetting to remove it
from LiveInterval's instruction map. This fixes #95865
2024-07-01 10:15:58 +08:00
Ryotaro KASUGA
e6a961dbef
Revert "[MachinePipeliner] Fix constraints aren't considered in certain cases" (#97246)
Reverts llvm/llvm-project#95356

Due to ppc64le test failures caught by the LLVM Buildbot.
https://lab.llvm.org/buildbot/#/builders/176/builds/576
2024-07-01 10:32:58 +09:00
Phoebe Wang
9b9405621b
[X86] Relax VPERMV3 to VPERMV combine for more types (#97206)
This is a follow up of #96414
2024-07-01 08:41:19 +08:00
Ryotaro KASUGA
e19ac0dcfd
[MachinePipeliner] Fix constraints aren't considered in certain cases (#95356)
when scheduling

When scheduling an instruction, if both any predecessors and any
successors of the instruction are already scheduled, `SchedStart` isn't
taken into account. It may result generating incorrect code. This patch
fixes the problem. Also, this patch merges `SchedStart` into
`EarlyStart` (same for `SchedEnd`).

Fixes https://github.com/llvm/llvm-project/issues/93936
2024-07-01 09:07:32 +09:00
Yingwei Zheng
4997af98a0
[SimplifyCFG] Simplify nested branches (#97067)
This patch folds the following pattern (I don't know what to call this):
```
bb0:
  br i1 %cond1, label %bb1, label %bb2
bb1:
  br i1 %cond2, label %bb3, label %bb4
bb2:
  br i1 %cond2, label %bb4, label %bb3
bb3:
  ...
bb4:
  ...
```
into
```
bb0:
  %cond = xor i1 %cond1, %cond2
  br i1 %cond, label %bb4, label %bb3
bb3:
  ...
bb4:
  ...
```

Alive2: https://alive2.llvm.org/ce/z/5iOJEL
Closes https://github.com/llvm/llvm-project/issues/97022.
Closes https://github.com/llvm/llvm-project/issues/83417.

I found this pattern in some verilator-generated code, which is widely
used in RTL simulation. This fold will reduces branches and improves the
performance of CPU frontend. To my surprise, this pattern is also common
in C/C++ code base.
Affected libraries/applications:
cmake/cvc5/freetype/git/gromacs/jq/linux/openblas/openmpi/openssl/php/postgres/ruby/sqlite/wireshark/z3/...
2024-07-01 03:35:39 +08:00
Fangrui Song
41a08e764a [MC] Move Mach-O specific getAtom and isSectionAtomizableBySymbols to Mach-O files
and devirtualize isSectionAtomizableBySymbols.
2024-06-30 10:23:13 -07:00
Nuno Lopes
0e6257fbc2 SSAUpdater: use poison instead of undef in phi entries for unreachable predecessors 2024-06-30 11:51:30 +01:00
Phoebe Wang
eed7c5e29c [X86] Peek through bitcast to find more opportunity for VPERMV3 -> VPERMV combine
A follow up of #96414
2024-06-30 17:17:20 +08:00
Phoebe Wang
d9f1166732
[X86] Combine VPERMV3 to VPERMV for i8/i16 (#96414)
VPERM[I,T]2[B,W] are 3 uops on Skylake and Icelake so we try to use
VPERMV.
2024-06-30 16:52:55 +08:00
Akshay Deodhar
9fa7c05a1f
[NVPTX] Improved support for grid_constant (#97112)
- Supports escaped grid_constant pointers less conservatively. Casts
uses inside Calls, PtrToInts, Stores where the pointer is a _value
operand_ to generic address space, immediately before the escape, while
keeping other uses in the param address space

- Related to: https://github.com/llvm/llvm-project/pull/96125
2024-06-30 00:50:37 -07:00
Matt Arsenault
76bc071418
DAG: Fix assert when legalizing v3f16 ldexp (#97098)
For the v3f16.v3i32 case, the v3f16 would request widening
to v4f16, but the v3i32 does not require widening to be a legal
type, so GetWidenedVector would fail. We need to widen the exponent
vector to the same element count as the result.

 Fixes: SWDEV-470951
2024-06-30 08:29:20 +02:00