54662 Commits

Author SHA1 Message Date
Wesley Wiser
0abb779161
[LLVM] [X86] Fix integer overflows in frame layout for huge frames (#101840)
Fix 32-bit integer overflows in the X86 target frame layout when dealing
with frames larger than 4gb. When this occurs, we'll scavenge a scratch
register to be able to hold the correct stack offset for frame locals.

This completes reapplying #84114.

Fixes #48911
Fixes #75944 
Fixes #87154
2024-08-19 19:31:20 +04:00
Simon Pilgrim
b05c55472b
[X86] LowerABD - simplify i32/i64 to use sub+sub+cmov instead of repeating nodes via abs (#102174)
Using X86ISD::SUB nodes directly allows us to drive the X86ISD::CMOV node with exact flags instead of trying to cleanup the generic codegen via ICMP/SUBO nodes.
2024-08-19 13:50:07 +01:00
Qiu Chaofan
b6d1df2afd
[PowerPC] Support -mno-red-zone option (#94581) 2024-08-19 17:58:08 +08:00
Daniil Kovalev
de5deb7b07
[PAC][ELF][AArch64] Encode several ptrauth features in PAuth core info (#102508)
For llvm_linux platform, define the following meaning for bits 9, 10,
11:

- bit 9: set if indirect gotos signing is enabled;
- bit 10: set if type info vtable pointer discrimination is enabled;
- bit 11: set if function pointer type discrimination is enabled.
2024-08-19 12:53:43 +03:00
Weining Lu
63267ca901 [LoongArch] Fix the assertion for atomic store with 'ptr' type 2024-08-19 17:17:36 +08:00
Kerry McLaughlin
9211977d13
[AArch64][SME] Return false from produceCompactUnwindFrame if VG save required. (#104588)
The compact unwind format requires all registers are stored in pairs, so
return false from produceCompactUnwindFrame if we require saving VG.
2024-08-19 10:17:10 +01:00
Nikita Popov
83879f4f53
[SimplifyCFG] Don't block sinking for allocas if no phi created (#104579)
SimplifyCFG sinking currently does not sink loads/stores of allocas,
because historically SROA was unable to handle the resulting IR. Since
then, SROA both learned to speculate loads/stores over selects and phis,
*and* SimplifyCFG sinking has been deferred to the end of the function
simplification pipeline, which means that SROA happens before it.

As such, I believe that this workaround should no longer be necessary.
Given how sensitive SimplifyCFG sinking seems to be, this patch takes a
very conservative step towards removing this, by allowing sinking if we
don't actually need to form a phi over the pointer argument.

This fixes https://github.com/llvm/llvm-project/issues/104567, where
sinking a store to an escaped alloca allows converting a switch into
arithmetic.
2024-08-19 09:55:30 +02:00
hev
985d64b03a
[LoongArch] Merge base and offset for LSX/LASX memory accesses (#104452) 2024-08-19 15:23:05 +08:00
Daniel Cederman
7faf1a0868
[Sparc] Add errata workaround pass for GR712RC and UT700 (#103843)
This patch adds a pass that provides workarounds for the errata
described in GRLIB-TN-0009, GRLIB-TN-0010, GRLIB-TN-0011, GRLIB-TN-0012,
and GRLIB-TN-0013, that are applicable to the GR712RC and UT700. The
documents are available for download from here:

https://www.gaisler.com/index.php/information/app-tech-notes

The pass will detect certain sensitive instruction sequences and prevent
them from occurring by inserting NOP instruction. Below is an overview
of each of the workarounds. A similar implementation is available in
GCC.

GRLIB-TN-0009:

* Insert NOPs to prevent the sequence (stb/sth/st/stf) -> (single
non-store/load instruction) -> (any store)

* Insert NOPs to prevent the sequence (std/stdf) -> (any store)

GRLIB-TN-0010:

* Insert a NOP between load instruction and atomic instruction (swap and
casa).

* Insert a NOP at branch target if load in delay slot and atomic
instruction at branch target.

* Do not allow functions to begin with atomic instruction.

GRLIB-TN-0011:

* Insert .p2align 4 before atomic instructions (swap and casa).

GRLIB-TN-0012:

* Place a NOP at the branch target of an integer branch if it is a
floating-point operation or a floating-point branch.

GRLIB-TN-0013:

* Prevent (div/sqrt) instructions in the delay slot.

* Insert NOPs to prevent the sequence (div/sqrt) -> (two or three
floating point operations or loads) -> (div/sqrt).

* Do not insert NOPs if any of the floating point operations have a
dependency on the destination register of the first (div/sqrt).

* Do not insert NOPs if one of the floating point operations is a
(div/sqrt).

* Insert NOPs to prevent (div/sqrt) followed by a branch.
2024-08-19 07:59:58 +02:00
Pengcheng Wang
a80a90e34b
[RISCV][MC] Support experimental extensions Zvbc32e and Zvkgs (#103709)
These two extensions add addtional instructions for carryless
multiplication with 32-bits elements and Vector-Scalar GCM
instructions.

Please see https://github.com/riscv/riscv-isa-manual/pull/1306.
2024-08-19 11:50:32 +08:00
Noah Goldstein
731ae694a3 Revert "[CodeGenPrepare] Folding urem with loop invariant value"
This reverts commit c64ce8bf283120fd145a57d0e61f9697f719139d.

Seems to be causing stage2 failures on buildbots. Reverting while I
investigate.
2024-08-18 20:36:35 -07:00
Tianqing Wang
7f87b5bf0e
[SelectionDAG][X86] Preserve unpredictable metadata for conditional branches in SelectionDAG, as well as JCCs generated by X86 backend. (#102101)
This builds on 09515f2c2, which preserves unpredictable metadata in
CodeGen for `select`. This patch does it for conditional branches.
2024-08-19 11:04:48 +08:00
Austin Kerbow
7d5281a66d
[AMDGPU][NFC] Fix preload-kernarg.ll test after attributor move (#98840)
Update was to stale version of the test with missing functions and extra
runlines that had been removed.
2024-08-18 17:04:27 -07:00
Noah Goldstein
c64ce8bf28 [CodeGenPrepare] Folding urem with loop invariant value
```
for(i = Start; i < End; ++i)
   Rem = (i nuw+ IncrLoopInvariant) u% RemAmtLoopInvariant;
```
 ->
```
Rem = (Start nuw+ IncrLoopInvariant) % RemAmtLoopInvariant;
for(i = Start; i < End; ++i, ++rem)
   Rem = rem == RemAmtLoopInvariant ? 0 : Rem;
```

In its current state, only if `IncrLoopInvariant` and `Start` both
being zero.

Alive2 seemed unable to prove this (see:
https://alive2.llvm.org/ce/z/ATGDp3 which is clearly wrong but still
checks out...) so wrote an exhaustive test here:
https://godbolt.org/z/WYa561388

Closes #96625
2024-08-18 15:58:24 -07:00
Noah Goldstein
f16125a13c [CodeGenPrepare][X86] Add tests for folding urem with loop invariant value; NFC 2024-08-18 15:58:24 -07:00
Philip Reames
27a62ec72a
[LSR] Split the -lsr-term-fold transformation into it's own pass (#104234)
This transformation doesn't actually use any of the internal state of
LSR and recomputes all information from SCEV.  Splitting it out makes
it easier to test.
    
Note that long term I would like to write a version of this transform
which *is* integrated with LSR's solver, but if that happens, we'll
just delete the extra pass.
    
Integration wise, I switched from using TTI to using a pass configuration
variable.  This seems slightly more idiomatic, and means we don't run
the extra logic on any target other than RISCV.
2024-08-17 18:34:23 -07:00
weiguozhi
0b092dfee3
[X86] Don't save/restore fp around longjmp instructions (#102556)
Longjmp instructions can also modify fp register, it is expected
behavior. We should not save/restore fp around these instructions.
2024-08-17 11:51:05 -07:00
Changpeng Fang
16929219b0
AMDGPU: Add tonearest and towardzero roundings for intrinsic llvm.fptrunc.round (#104486)
This work simplifies and generalizes the instruction definition for
intrinsic llvm.fptrunc.round. We no longer name the instruction with the
rounding mode. Instead, we introduce an immediate operand for the
rounding mode for the pseudo instruction. This immediate will be used to
set up the hardware mode register at the time the real instruction is
generated. We name the pseudo instruction as FPTRUNC_ROUND_F16_F32 (for
f32 -> f16), which is easy to generalize for other types.

"round.towardzero" and "round.tonearest" are added for f32 -> f16
truncating, in addition to the existing "round.upward" and
"round.downward". Other rounding modes are not supported by hardware at
this moment.
2024-08-17 11:22:47 -07:00
Carl Ritson
fc6300a5f7
[AMDGPU] Disable inline constants for pseudo scalar transcendentals (#104395)
Prevent operand folding from inlining constants into pseudo scalar
transcendental f16 instructions.
However still allow literal constants.
2024-08-17 16:52:38 +09:00
Pradeep Kumar
1ff630d5c3
[LLVM][NVPTX] Add support for brkpt instruction (#104470)
This commit adds NVPTX codegen support for brkpt instruction
(https://docs.nvidia.com/cuda/parallel-thread-execution/#miscellaneous-instructions-brkpt)
with test under CodeGen/NVPTX/brkpt.ll
2024-08-17 10:00:24 +05:30
Thurston Dang
324b676a3d Revert "[AArch64] Fold more load.x into load.i with large offset"
This reverts commit 43ffe2eed0d9f73789dbe213023733d164999306.

Reason: buildbot breakage starting at https://lab.llvm.org/buildbot/#/builders/85/builds/1102

I manually bisected and found that clang crashed with 43ffe2eed0d9f73789dbe213023733d164999306 but not the immediately preceding commit (33190490c667aaf8b08d5af8b8ce84524f856e80)
2024-08-16 22:32:12 +00:00
Craig Topper
ebe7265b14
[Mips] Fix fast isel for i16 bswap. (#103398)
We need to mask the SRL result to 8 bits before ORing in the SLL. This
is needed in case bits 23:16 of the input aren't zero. They will have
been shifted into bits 15:8.

We don't need to AND the result with 0xffff. It's ok if the upper 16
bits of the register are garbage.

Fixes #103035.
2024-08-16 14:54:51 -07:00
Krzysztof Drewniak
70995a1a33
[ScalarizeMaskedMemIntr] Optimize splat non-constant masks (#104537)
In cases (like the ones added in the tests) where the condition of a
masked load or store is a splat but not a constant (that is, a masked
operation is being used to implement patterns like "load if the current
lane is in-bounds, otherwise return 0"), optimize the 'scalarized' code
to perform an aligned vector load/store if the splat constant is true.

Additionally, take a few steps to preserve aliasing information and
names when nothing is scalarized while I'm here.

As motivation, some LLVM IR users will genatate masked load/store in
cases that map to this kind of predicated operation (where either the
vector is loaded/stored or it isn't) in order to take advantage of
hardware primitives, but on AMDGPU, where we don't have a masked load or
store, this pass would scalarize a load or store that was intended to be
- and can be - vectorized while also introducing expensive branches.

Fixes #104520

Pre-commit tests at #104527
2024-08-16 16:24:25 -05:00
Amy Kwan
cf721e29c6
[PowerPC] Do not merge TLS constants within PPCMergeStringPool.cpp (#94059)
This patch prevents thread-local constants to be merged within
PPCMergeStringPool.cpp.

The PPCMergeStringPool pass primarily merges non-thread-local constants
together, and thread-local constants should not be mixed together with
other (non-thread-local) constants. In the event that thread-local and
other non-thread-local constants are pooled together, the
llvm.threadlocal.address intrinsic can fail as it expects its argument
to be a thread-local global value, but the merged string structure
created by the PPCMergeStringPool pass is not thread-local as a whole.
2024-08-16 15:06:50 -04:00
Ahmed Bougacha
8becb80c43
[AArch64] Remove apple-a7-sysreg. (#102709)
This feature provided CPM_IOACC_CTL_EL3, a lone system register that has
been carried over since the original ARM64 implementation, where it was
the only processor-specific register in a long list of architectural
sysregs. We don't need it here.

It's been used as a generic processor-specific sysreg in tests, but the
functionality they target is now better covered in other more exhaustive
tests.
2024-08-16 11:27:21 -07:00
Helena Kotas
db279c72f2
[HLSL] Change default linkage of HLSL functions to internal (#95331)
An HLSL function has internal linkage by default unless it is:
1. shader entry point function
2. marked with the `export` keyword
(https://github.com/llvm/llvm-project/issues/92812)
3. patch constant function (not implemented yet)

This PR adds a link-time pass `DXILFinalizeLinkage` that updates the
linkage of functions to make sure only shader entry points and exported
functions are visible from the module (have _program linkage_). All
other functions will be updated to have internal linkage.

Related spec update: microsoft/hlsl-specs#295

Fixes #llvm/llvm-project#92071
2024-08-16 10:32:10 -07:00
Craig Topper
d8c9d58393
[RISCV] Don't support TRUNCATE_SSAT_U. (#104468)
RISC-V doesn't have an instruction for this. We were treating it the
same as TRUNCATE_USAT_U.
2024-08-16 08:42:36 -07:00
Simon Pilgrim
397bcfef74 [X86] Fold extract_subvector(int_to_fp(x)) vXi32/vXf32 cases to match existing fp_to_int folds 2024-08-16 14:57:37 +01:00
Thorsten Schütt
710a552ded
[GlobalIsel] Revisit ext of ext. (#102769)
Credits:
https://reviews.llvm.org/D86516

combine-ext.mir

Notable semantic changes:
InstCombine does not mix zero and sign extend,
  see CastInst::isEliminableCastPair.
New version has legality checks.
Folds sext/zext of anyext -> sext/zext
Support for nneg

Future work:
nneg zext of sext -> sext
sext of nneg zext -> sext
2024-08-16 15:38:56 +02:00
Tobias Stadler
abdc2b17d2
[AArch64][GlobalISel] Disable fixed-point iteration in all Combiners
Disable fixed-point iteration in all AArch64 Combiners after #102163.
See inline comments for justification of test changes.

Pull Request: https://github.com/llvm/llvm-project/pull/102167
2024-08-16 15:15:29 +02:00
Lukacma
ff906403dd
Add FPMR register and update dependencies of FP8 instructions (#102910)
Currently FP8 instructions are missing dependecies on system registers,
namely FPMR and FPCR. This patch fixes this issue.
2024-08-16 14:05:07 +01:00
Simon Pilgrim
a84790e5fc
[X86] SimplifyDemandedVectorEltsForTargetNode - reduce width of X86 conversions nodes when upper elements are not demanded. (#102882)
Fixes #83402
2024-08-16 12:23:39 +01:00
Simon Pilgrim
39a0dedcbf [X86] lowerShuffleAsDecomposedShuffleMerge - don't lower to unpack+permute if either source is zero.
Fixes #104482
2024-08-16 10:42:02 +01:00
Simon Pilgrim
e54f683fc5 [X86] Add shuffle tests for #104482 2024-08-16 10:42:01 +01:00
Luke Lau
7bef16a04d [RISCV] Merge bitrotate crash test into shuffle reverse tests. NFC
Use vscale_range instead of having a separate test to run with +zvl1024b.
2024-08-16 16:12:46 +08:00
Luke Lau
8d71016ede [RISCV] Merge shuffle reverse tests. NFC
shuffle-reverse.ll also tests reverse shuffles with two source
vectors, so copy them over.
2024-08-16 15:49:08 +08:00
Luke Lau
e4b24e68a2 [RISCV] Use shufflevector in shuffle reverse tests. NFC
Fixed length @llvm.vector.reverses are converted to vector_shuffle
nodes in SelectionDAGBuilder anyway, and this matches the name of the
test file.
2024-08-16 15:49:08 +08:00
Luke Lau
5cdd2042a0 [RISCV] Remove -riscv-v-vector-bits-max from reverse tests. NFC
There doesn't seem to be any difference in the output anymore between
the options.
2024-08-16 15:49:08 +08:00
Wang Yaduo
1900810b6f
[RISCV] Simplify (srl (and X, Mask), Const) to TH_EXTU (#102802) 2024-08-16 14:23:00 +08:00
Luke Lau
ac92dcc756
[RISCV] Lower fixed reverse vector_shuffles through vector_reverse (#104461)
This teaches lowerVECTOR_REVERSE to handle fixed length vectors, and
then lowers reverse vector_shuffles through it.

The motiviation for this is to allow fixed length vectors to share a
potential optimization on vector_reverse in an upcoming patch (splitting
up LMUL > 1 vrgathers.vv)
2024-08-16 13:26:30 +08:00
Craig Topper
e027e04f01
[DAGCombiner] Don't let scalarizeBinOpOfSplats create illegal scalar MULHS/MULHU (#104518)
Type legalization lacks generic support for these operations. They are
normally only created when the type is legal. This scalarization case is
new.

We could update type legalization, but there some corner cases that make
it not straightforward. For example, if the promoted type isn't 2x the
narrow type we need to over promote.

Fixes #104480
2024-08-15 21:07:22 -07:00
Kevin McAfee
99a10f1fe8
Update load intrinsic attributes (#101562)
This patch adds default attributes to many intrinsics and the WillReturn
attribute to some as well. The defaults include WillReturn. The WillReturn
attribute is relevant for dead code elimination as intrinsics without
WillReturn are assumed to have side effects and cannot be removed even
if their return value is unused. It is also relevant for potential
changes to SDAG behavior regarding treatment of intrinsics that function
as loads.
2024-08-15 13:34:49 -07:00
Craig Topper
2adc012c34
[RISCV][GISel] Support nxv16p0 for RV32. (#101573)
Pointers are 32 bits on RV32 so nxv1p0 is lmul=mf2 and nxv16p0 is
lmul=m8.

Split the test so we can have different alignments and register class
sizes for rv32 and rv64 for the pointer tests.
2024-08-15 13:17:47 -07:00
Amy Kwan
9325381998
[PowerPC][GlobalMerge] Enable GlobalMerge by default on AIX (#101226)
This patch turns on the GlobalMerge pass by default on AIX and updates
LIT tests accordingly.
2024-08-15 15:25:54 -04:00
Nikita Popov
afa0f53f96 [ValueTracking] Fix f16 fptosi range for large integers
We were missing the signed flag on the negative value, so the
range was incorrectly interpreted for integers larger than 64-bit.

Split out from https://github.com/llvm/llvm-project/pull/80309.
2024-08-15 18:18:19 +02:00
Luke Lau
11c2da8fb7
[RISCV] Narrow indices to e16 for LMUL > 1 when lowering vector_reverse (#104427)
The vector_shuffle lowering already does this to reduce register
pressure, so also do it here.
2024-08-15 23:18:03 +08:00
Jeffrey Byrnes
fcefe957dd
[LegalizeTypes][AMDGPU]: Allow for scalarization of insert_subvector (#104236)
Legalization for when the inserted subvector is to be scalarized.

https://godbolt.org/z/vx3joWqoh
2024-08-15 08:07:05 -07:00
WANG Rui
82cf6558e5 [LoongArch] Pre-commit tests for validating the merge base offset in vecotrs. NFC 2024-08-15 21:06:27 +08:00
Hua Tian
43ba1097ee
[llvm][CodeGen] Resolve issues when updating live intervals in window scheduler (#101945)
Corrupted live interval information can cause window scheduling to crash
in some cases. By adding the missing MBB's live interval information in the
ModuloScheduleExpander, the information can be correctly analyzed in 
the window scheduler.
2024-08-15 19:03:27 +08:00
zhongyunde 00443407
43ffe2eed0 [AArch64] Fold more load.x into load.i with large offset
The list of load.x is refer to canFoldIntoAddrMode on D152828.
Also support LDRSroX missed in canFoldIntoAddrMode
2024-08-15 18:22:52 +08:00