7894 Commits

Author SHA1 Message Date
Matt Arsenault
4cf1a19b7e Reapply "AMDGPU: Handle legal v2f16/v2bf16 atomicrmw fadd for global/flat (#95394)"
This reverts commit 95b77d90aae10725ea692e120aac083ef1c1297d.
2024-06-17 16:34:35 +02:00
Matt Arsenault
405882db94 AMDGPU: Fix legalization for llvm.amdgcn.struct.buffer.atomic.fadd.v2bf16 2024-06-17 15:20:23 +02:00
Pierre van Houtryve
770393bb99
[MachineLICM] Correctly Apply Register Masks (#95746)
Fix regression introduced in d4b8b72
2024-06-17 13:42:00 +02:00
Matt Arsenault
87aed82456 AMDGPU: Cleanup struct buffer atomic fadd intrinsic tests
Only gfx908 was tested, and the returning versions weren't tested.
2024-06-17 12:00:50 +02:00
Vikash Gupta
525318e5dc
[AMDGPU][LIT] Added a MIR LIT showing the SGPR spills (#94584)
This MIR test case is added to seek the consumption of VGPR lanes being
used for SGPR spills during si-lower-sgpr-spills pass of AMDGPU pass
pipeline. Basically, in this pass, stack slots are mapped to available
VGPR lanes for spilling purpose, thus ending the need for stack slots.

In current scenario, each new SGPR spill goes into new VGPR lanes as,
being mapped from its distinct stack slots assigned during SGPR
allocation pass. It can be clearly seen in the added test case.
2024-06-17 13:03:55 +05:30
Nikita Popov
5ef768d22b
[AMDGPULowerBufferFatPointers] Expand const exprs using fat pointers (#95558)
Expand all constant expressions that use fat pointers upfront, so that
the rewriting logic only has to deal with instructions and not the
constant expression variants as well.

My primary motivation is to remove the creation of illegal constant
expressions (mul and shl) from this pass, but this also cuts down quite
a bit on the amount of duplicate logic.
2024-06-17 09:28:09 +02:00
Matt Arsenault
570f36229a AMDGPU: Fix legalization for llvm.amdgcn.raw.buffer.atomic.fadd.v2bf16
We somehow ended up with llvm.amdgcn.raw.ptr.buffer.atomic.fadd, and
llvm.amdgcn.raw.buffer.ptr.atomic.fadd.v2bf16 intrinsic definitions, despite
the second being the canonical mangling for the first intrinsic with v2bf16.
This requires us to handle it as a separate case. Surprisingly, cases
generating the regular 1st intrinsic with bfloat end up getting ID'd as
the second. The selection is still broken for the gfx9 cases.
2024-06-16 21:46:42 +02:00
Matt Arsenault
55696dba23 AMDGPU: Expand raw ptr buffer atomic fadd tests
These were only checking the no return versions on gfx908
2024-06-16 21:33:34 +02:00
Matt Arsenault
907e73936f AMDGPU: Don't use amdgpu_ps for some atomic tests
The default calling convention requires fewer shuffling moves and shrinks
the test output.
2024-06-16 21:20:45 +02:00
Nico Weber
95b77d90aa Revert "AMDGPU: Handle legal v2f16/v2bf16 atomicrmw fadd for global/flat (#95394)"
This reverts commit 5021e6dd548323e1169be3d466d440009e6d1f8e.
Breaks tests, see https://github.com/llvm/llvm-project/pull/95394#issuecomment-2169394503
2024-06-15 12:33:13 -04:00
Christudasan Devadasan
5e9fcb9572
[AMDGPU][GISel] Use datalayout alignment for buffer-load legalization (#95578)
It matches the legalization of buffer loads similar to the SelectionDAG.
2024-06-15 18:19:52 +05:30
Matt Arsenault
5021e6dd54
AMDGPU: Handle legal v2f16/v2bf16 atomicrmw fadd for global/flat (#95394)
Unlike the existing fadd cases, choose to ignore the requirement for
amdgpu-unsafe-fp-atomics in case of fine-grained memory access. This
is to minimize migration pain to the new atomic control metadata. This
should not break any users, as the atomic intrinsics are still
directly consumed, and clang does not yet produce vector FP atomicrmw.
2024-06-15 09:58:12 +02:00
Matt Arsenault
0a9a5f989f
AMDGPU: Legalize atomicrmw fadd for v2f16/v2bf16 for local memory (#95393)
Make this legal for gfx940 and gfx12
2024-06-15 09:55:04 +02:00
Jeffrey Byrnes
84e9401a7f
[AMDGPU] Fix lit failure (#95620)
Lit test in
7091dd277a
was not updated for
e7e90dd1c1
2024-06-14 16:45:11 -07:00
Tim Gymnich
7091dd277a
[AMDGPU] Fix lowering of abs for i16 vectors with more than 2 elements (#95413)
fixes #94606

Expansion of `ABS` for `i16` vectors with more than 2 elements is
currently falling back to scalarization of the vector.
This PR adds a custom lowering for `ABS` on `i16` vectors that splits
the vector into multiple `<2 x i 16>` vectors.
2024-06-14 22:53:30 +02:00
Thorsten Schütt
b1f9440fa9
[GlobalIsel] Import GEP flags (#93850)
https://github.com/llvm/llvm-project/pull/90824
2024-06-14 20:56:43 +02:00
Brian Favela
e7e90dd1c1
[AMDGPU] Adding multiple use analysis to SIPeepholeSDWA (#94800)
Allow for multiple uses of an operand where each instruction can be
promoted to SDWA.

For instance:

; v_and_b32 v2, lit(0x0000ffff), v2
; v_and_b32 v3, 6, v2
; v_and_b32 v2, 1, v2

Can be folded to:
; v_and_b32 v3, 6, sel_lo(v2)
; v_and_b32 v2, 1, sel_lo(v2)
2024-06-14 19:14:19 +02:00
Nikita Popov
0774000e32
[AMDGPULowerBufferFatPointers] Fix offset-only ptrtoint (#95543)
For ptrtoint that truncates to the offset only, the expansion generated
a shift by the bit width, which is poison. Instead, we should return the
offset directly.

(The same problem exists for the constant expression case, but I plan to
address that separately, and more comprehensively.)
2024-06-14 16:38:57 +02:00
Stephen Tozer
094572701d
[RemoveDIs] Print IR with debug records by default (#91724)
This patch makes the final major change of the RemoveDIs project, changing the
default IR output from debug intrinsics to debug records. This is expected to
break a large number of tests: every single one that tests for uses or
declarations of debug intrinsics and does not explicitly disable writing
records. 

If this patch has broken your downstream tests (or upstream tests on a
configuration I wasn't able to run):
1. If you need to immediately unblock a build, pass
`--write-experimental-debuginfo=false` to LLVM's option processing for all
failing tests (remember to use `-mllvm` for clang/flang to forward arguments to
LLVM).
2. For most test failures, the changes are trivial and mechanical, enough that
they can be done by script; see the migration guide for a guide on how to do
this: https://llvm.org/docs/RemoveDIsDebugInfo.html#test-updates
3. If any tests fail for reasons other than FileCheck check lines that need
updating, such as assertion failures, that is most likely a real bug with this
patch and should be reported as such.

For more information, see the recent PSA:
https://discourse.llvm.org/t/psa-ir-output-changing-from-debug-intrinsics-to-debug-records/79578
2024-06-14 15:07:27 +01:00
Vikram Hegde
cf4c3d9843
[AMDGPU] Extend llvm.amdgcn.set.inactive intrinsic to support Reg32/Reg64 types (#94457)
Missed this while handling other patches. Any comments/concerns ?
2024-06-14 14:15:28 +02:00
David Stuttard
1fb1fcf343
Add mad support for v_pk_* 16 bit integer (#95104) 2024-06-13 16:46:40 +01:00
Matt Arsenault
444dd9b093
AMDGPU: Cleanup FP atomicrmw tests and cover fmin/fmax (#95131)
We apparently are missing codegen support for atomicrmw fmin/fmax. Also
clean up FP atomicrmw tests
to be more consistent and comprehensively test the relevant cases
2024-06-13 17:07:30 +02:00
Janek van Oirschot
3d1705d00c
MCExpr-ify AMDGPU PALMetadata (#93236)
Allows MCExprs as passed values to PALMetadata. Also adds related
`DelayedMCExpr` classes which serve as a pseudo-fixup to resolve MCExprs
as late as possible (i.e., right before emit through string or blob,
where they should be resolvable).
2024-06-13 13:59:31 +01:00
Matt Arsenault
5e8cf0bf11
AMDGPU: Fix buffer intrinsic store of bfloat (#95377) 2024-06-13 13:13:04 +02:00
Matt Arsenault
c0ff36ea23
AMDGPU: Fix buffer intrinsic handling for various 16-bit elements. (#95376)
Mostly fixes handling of bfloat vectors, but also some missing
i16 cases.
2024-06-13 12:33:18 +02:00
Matt Arsenault
935d377350
AMDGPU: Fix using wrong memory type for non-image resource intrinsics (#94911)
An 8 x i16 raw load was incorrectly using a 64-bit memory type, which
would assert in the MachineMemOperand constructor.

This is preparation for a cleanup which will make the buffer intrinsics
work for all legal types.
2024-06-13 11:10:28 +02:00
Björn Pettersson
445973cace
[LegalizeTypes] Handle non byte-sized elt types when splitting INSERT/EXTRACT_VECTOR_ELT (#93357)
DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT and
DAGTypeLegalizer::SplitVecRes_EXTRACT_VECTOR_ELT did not handle
non byte-sized elements properly. In fact, it only dealt with
elements smaller than 8 bits (as well as byte-sized elements).

This patch generalizes the support for non byte-sized element by
always widening the the vector elements to next "round integer type"
(a power of 2 bit size). This should make sure that we can access a
single element via a simple byte-addressed scalar load/store.

Also removing a suspicious CustomLowerNode call from
SplitVecRes_INSERT_VECTOR_ELT. Considering that it did not reset
the Lo/Hi out arguments before the return I think that
DAGTypeLegalizer::SplitVectorResult could be fooled into registering
the input vector as being the result. This should however not have
caused any problems since DAGTypeLegalizer::SplitVectorResult is
doing the same CustomLowerNode call, making the code removed by
this patch redundant.
2024-06-13 11:09:18 +02:00
Scott Egerton
4a305d40a3
[AMDGPU] Exclude certain opcodes from being marked as single use (#91802)
The s_singleuse_vdst instruction is used to mark regions of instructions
that produce values that have only one use.
Certain instructions take more than one cycle to execute, resulting in
regions being incorrectly marked.
This patch excludes these multi-cycle instructions from being marked as
either producing single use values or consuming single use values
or both depending on the instruction.
2024-06-12 10:43:23 +01:00
Matt Arsenault
f3afdc4ad9
AtomicExpand: Fix creating invalid ptrmask for fat pointers (#94955)
The ptrmask intrinsic requires the integer mask to be the index size,
not the pointer size.
2024-06-12 10:45:42 +02:00
Nikita Popov
cb3a6bded7 [AMDGPULowerBufferFatPointers] Restore zero offset special case
OffAccum will never be nullptr now, instead check for a zero
constant.
2024-06-12 10:30:23 +02:00
Matt Arsenault
dd7540f3da AMDGPU: Handle buffer load/store for 64-bit element types
Note pointers still don't work correctly.
2024-06-12 10:26:16 +02:00
Nikita Popov
6fc63ab77d
[AMDGPULowerBufferFatPointers] Simplify and fix GEP offset emission (#95115)
Use emitGEPOffset() to emit the GEP offset, which already has all the
necessary logic.

This also fixes the nuw flag incorrectly being set on the offset
calculation, while only nsw is implied by inbounds.
2024-06-12 09:51:18 +02:00
Carl Ritson
db096adba0
[AMDGPU] Remove SIWholeQuadMode pseudo wavemode optimization (#94133)
This does not work correctly in divergent control flow. Can be replaced
with a later exec mask manipulation optimizer.

This reverts commit a3646ec1bc662e221c2a1d182987257c50958789.
2024-06-12 15:51:40 +09:00
Matt Arsenault
a2bc50aa8b AMDGPU: Add more tests for vector typed atomicrmw fadd
Some cases should be legal for gfx940.
2024-06-11 14:44:28 +02:00
Pierre van Houtryve
d4b8b7217f
[CodeGen][MachineLICM] Use RegUnits in HoistRegionPostRA (#94608)
Those BitVectors get expensive on targets like AMDGPU with thousands of
registers, and RegAliasIterator is also expensive.

We can move all liveness calculations to use RegUnits instead to speed
it up for targets where RegAliasIterator is expensive, like AMDGPU.
On targets where RegAliasIterator is cheap, this alternative can be a little more expensive, but I believe the tradeoff is worth it.
2024-06-11 14:27:35 +02:00
Mariusz Sikora
0bc33f41ab
[AMDGPU] Update tests for last-use in global/scratch/flat/buffer load… (#94975)
… instructions
2024-06-11 06:30:13 +02:00
Jay Foad
58550a7938
[AMDGPU] Restore non-buffer atomic tests lost in #93801 (#94978) 2024-06-10 15:49:18 +01:00
Matt Arsenault
c894f90c58
AMDGPU: Do not assert on v6x16 buffer load intrinsics (#94966)
Just use the original type and let it hit a standard legalization error.
2024-06-10 16:38:06 +02:00
Matt Arsenault
dbc99e9521 AMDGPU: Simplify some tests by not using amdgpu_ps
Since inreg now works for the default calling convention, we can
check the output with fewer argument shuffling instructions.
2024-06-10 16:14:51 +02:00
Matt Arsenault
73d9041254 AMDGPU: Fix using useless cachepolicy argument in buffer atomic test
This was probably intended to test the immediate offset addressing
mode. Add some tests to check immediate offsets, and clean up run lines.
2024-06-10 16:14:51 +02:00
Jay Foad
18ec885a26
[RFC][AMDGPU] Remove old llvm.amdgcn.buffer.* and tbuffer intrinsics (#93801)
They have been superseded by llvm.amdgcn.raw.buffer.* and
llvm.amdgcn.struct.buffer.*.
2024-06-10 12:14:51 +01:00
Jay Foad
317ed770e3 [AMDGPU] Fix typos in GCN-PROMOTE check prefix 2024-06-10 10:24:23 +01:00
Jay Foad
c9fd7b1a54 [AMDGPU] Remove unused checks left over from X86 2024-06-10 10:12:05 +01:00
Andreas Jonson
cc19374afa
[AMDGPU] Swap range metadata to attribute for workitem id. (#94871)
Swap out range metadata to range attribute for calls to be able to
deprecate range metadata on calls in the future.
2024-06-09 10:29:50 -04:00
David Green
a284bdb311 [DAG] Fold fdiv X, c2 -> fmul X, 1/c2 without AllowReciprocal if exact (#93882)
This moves the combine of fdiv by constant to fmul out of an
'if (Options.UnsafeFPMath || Flags.hasAllowReciprocal()' block,
so that it triggers if the divide is exact. An extra check for
Recip.isDenormal() is added as multiple places make reference
to it being unsafe or slow on certain platforms.
2024-06-09 12:28:20 +01:00
Quentin Colombet
25506f4864
[SDISel][Combine] Constant fold FP16_TO_FP (#94790)
In some case, constant can survive early constant folding optimization
because they are hidden behind several layers of type changes.

E.g., consider the following sequence (extracted from the arm test that
this commit changes):
```
    t2: v1f16 = BUILD_VECTOR ConstantFP:f16<APFloat(0)>
    t4: v1f16 = insert_vector_elt t2, ConstantFP:f16<APFloat(0)>, Constant:i32<0>
  t5: f16 = bitcast t4
t6: f32 = fp_extend t5
```

Because the constant (APFloat(0)) is hidden behind a <1 x ty> type, all
the constant folding that normally happen for scalar nodes when using
`SelectionDAG::getNode` are blocked.

As a result the constant manages to survive as an actual conversion
instruction down to the select phase:
```
t11: f32 = fp16_to_fp Constant:i32<0>
```

With the change in this patch, we try to do constant folding one more
time during dag combine, which in the motivating example result in the
much better sequence:
```
t7: ch = CopyToReg t0, Register:f32 %0, ConstantFP:f32<0.000000e+00>
```

Note: I'm sure we have this problem in a lot of other places. Generally
speaking I believe SDISel is not that good with <1 x ty> compared to
pure scalar. However, I only changed what I could easily test.
2024-06-08 11:31:13 +02:00
Quentin Colombet
0605e984fa
[SDISel][Builder] Fix the instantiation of <1 x bfloat|half> (#94591)
Prior to this change, `SelectionDAGBuilder` was producing `SDNode`s of
the form: `f32 = extract_vector_elt <1 x bfloat|half>, i32 0` when
lowering phis of `<1 x bfloat|half>` and running on a target that
promotes this type to `f32` (like some x86 or AMDGPU targets.)

This construct is invalid since this type of node only allows type
extensions for integer types.
It went unotice because the `extract_vector_elt` node is later broken
down in `bitcast` followed by `bf16_to_fp|fp_extend`. However, when the
argument of the phi is a constant we were crashing because the existing
code would try to constant fold this `extract_vector_elt` into a
any_ext.

This patch fixes this by using a proper decomposition for `<1 x
bfloat|half>`:
```
bfloat|half = bitcast <1 x blfoat|half>
float = fp_extend bfloat|half
```

This change should be NFC for the non-constant-folding cases and fix the
SDISel crashes (reported in
https://github.com/llvm/llvm-project/issues/94449) for the folding
cases.

Note: The change on the arm test is a missing fp16 to f32 constant folding
exposed by this patch. I'll push a separate improvement for that.
2024-06-07 18:47:37 +02:00
Jay Foad
df6750eaa8
[AMDGPU] Fix interaction between WQM and llvm.amdgcn.init.exec (#93680)
Whole quad mode requires inserting a copy of the initial EXEC mask. In a
function that also uses llvm.amdgcn.init.exec, insert the COPY after
initializing EXEC.
2024-06-07 13:23:15 +01:00
Simon Pilgrim
af3ffff34f
[DAG] Always allow folding XOR patterns to ABS pre-legalization (#94601)
Removes residual ARM handling for vXi64 ABS nodes to prevent infinite loops.
2024-06-07 11:02:50 +01:00
paperchalice
1bc8b3258e
[NewPM][CodeGen] Port regallocfast to new pass manager (#94426)
This pull request port `regallocfast` to new pass manager. It exposes
the parameter `filter` to handle different register classes for AMDGPU.
IIUC AMDGPU need to allocate different register classes separately so it
need implement its own `--<reg-class>-regalloc`. Now users can use e.g.
`-passe=regallocfast<filter=sgpr>` to allocate specific register class.
The command line option `--regalloc-npm` is still in work progress, plan
to reuse the syntax of passes, e.g. use
`--regalloc-npm=regallocfast<filter=sgpr>,greedy<filter=vgpr>` to
replace `--sgpr-regalloc` and `--vgpr-regalloc`.
2024-06-07 12:22:42 +08:00