20017 Commits

Author SHA1 Message Date
Arthur Eubanks
6bbb73b4cb
[X86] Fix determining if globals with size <8 bits are large (#84975)
Previously any global under 8 bits would accidentally be considered 0
sized, which is considered a large global.
2024-03-12 12:43:29 -07:00
Arthur Eubanks
45219702e7 [test][X86] Precommit test for large data threshold and i1 global 2024-03-12 19:08:40 +00:00
Simon Pilgrim
c1af6ab505 [X86] getFauxShuffleMask - recognise CONCAT(SUB0, SUB1) style patterns
Handles the INSERT_SUBVECTOR(INSERT_SUBVECTOR(UNDEF,SUB0,0),SUB1,N) pattern

Currently limited to v8i64/v8f64 cases as only AVX512 has decent cross lane 2-input shuffles, the plan is to relax this as I deal with some regressions
2024-03-12 17:40:19 +00:00
Bjorn Pettersson
4d0f79e346 Pre commit test cases SRL/SRA support in canCreateUndefOrPoison. NFC
Add test cases to show that we can't push freeze through SRA/SRL with
'exact' flag when there are multiple uses.
2024-03-12 16:03:18 +01:00
Phoebe Wang
e89b4bcf32
[X86] Remove SlowDivide tuning from GRTTuning (#84676)
The DIV32/64 throughput was improved since Goldmont in the Atom
architecture. The Alder Lake-E shows similar number too. So we shouldn't
add such tunings to Gracemont and later products.

Checked from Agner Fog's table and uops.info.
2024-03-12 13:41:49 +08:00
Simon Pilgrim
6cd68c2f87 [X86] Add base SSE2 coverage to SRL/SRA combines tests 2024-03-11 16:25:05 +00:00
Simon Pilgrim
7dc4d5f6a0 [X86] Add AVX512 (x86-64-v4) coverage to generic shift combines tests 2024-03-11 16:22:47 +00:00
Simon Pilgrim
862c7e0218 [X86] combineAndShuffleNot - ensure the type is legal before create X86ISD::ANDNP target nodes
Fixes #84660
2024-03-10 16:23:51 +00:00
Simon Pilgrim
92d7aca441
[X86] Add missing immediate qualifier to the (V)CMPSS/D instructions (#84496)
Matches (V)CMPPS/D and makes it easier to algorithmically recreate the instruction name in various analysis scripts I'm working on
2024-03-09 16:21:25 +00:00
Jay Foad
fd3eaf76ba
[GISel] Enforce G_PTR_ADD RHS type matching index size for addr space (#84352) 2024-03-09 09:07:22 +00:00
Evgenii Kudriashov
10edabbcf3
[X86][GlobalISel] Enable G_SDIV/G_UDIV/G_SREM/G_UREM (#81615)
* Create a libcall for s64 type for 32 bit targets.
* Fix a bug in REM selection: SUBREG_TO_REG is not intended to produce a
value from super registers.
* Replace selector tests by end-to-end tests. Other passes
check the selected MIR better.
2024-03-08 00:10:53 +01:00
Noah Goldstein
9f96db8e31 [X86] Fold (icmp ult (add x,-C),2) -> (or (icmp eq X,C), (icmp eq X,C+1)) for Vectors
This is undoing a middle-end transform which does the opposite. Since
X86 doesn't have unsigned vector comparison instructions pre-AVX512,
the simplified form gets worse codegen.

Fixes #66479

Proofs: https://alive2.llvm.org/ce/z/UCz3wt

Closes #84104
Closes #66479
2024-03-07 13:12:09 -06:00
Noah Goldstein
3e73a080fa [X86] Add tests for folding (icmp ult (add x,-C),2) -> (or (icmp eq X,C), (icmp eq X,C+1)); NFC 2024-03-07 13:12:09 -06:00
SahilPatidar
9e0f5909d0
[DAG] Fix Failure to reassociate SMAX/SMIN/UMAX/UMIN (#82175)
Resolve #58110
2024-03-07 15:15:17 +00:00
Fangrui Song
e63ea9d6f7 [CommandFlags] Rename option -relax-elf-relocations to -x86-relax-relocations
relax-elf-relocations is misleading and there were AMDGPU/SystemZ tests
misusing this x86-specific option.
2024-03-06 23:03:11 -08:00
Simon Pilgrim
0bd9255f8a
[X86] Improve KnownBits for X86ISD::PSADBW nodes (#83830)
Don't just return the known zero upperbits, compute the absdiff Knownbits and perform the horizontal sum.

Add implementations that handle both the X86ISD::PSADBW nodes and the INTRINSIC_WO_CHAIN intrinsics (pre-legalization).
2024-03-06 17:23:15 +00:00
Benjamin Kramer
55c466da2f [X86][AVX512BF16] Add a few missing insert/extract patterns
These are really the same as the f16 (and i16) instructions, but we need
them for any type that can occur.
2024-03-06 00:52:29 +01:00
elhewaty
26058e68ea
[DAG] select (sext m), (add X, C), X --> (add X, (and C, (sext m)))) (#83640)
- [DAG][X86] Add tests for Folding select m, add(X, C), X --> add (X, and(C, m))(NFC)
- [DAG][X86] Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
- Fixes: https://github.com/llvm/llvm-project/issues/66101
2024-03-05 16:41:41 +00:00
Yeting Kuo
d95a0d7c0f
[DAG] Teach SelectionDAGBuilder to read parameter alignment of compressstore/expandload. (#83763)
Previously SelectionDAGBuilder used ABI alignment for
compressstore/expandload. This patch allows SelectionDAGBuilder to use
parameter alignment like vp intrinsics. This does not follow the
original code to default use vector type alignment, since it is possible
implemented to unaligned vector alignment.
2024-03-05 20:48:37 +08:00
Simon Pilgrim
49f95052c8 [X86] pr59305.ll - replace "X86-64" check prefix with "X64" 2024-03-05 11:33:34 +00:00
Simon Pilgrim
191f7678f7 [X86] 2007-03-15-GEP-Idx-Sink.ll - regenerate test checks 2024-03-05 11:33:34 +00:00
MalaySanghiIntel
564b81db85
Add support for x87 registers on GISel register selection (#83528)
We handle 3 register classes for x87 - rfp32, rfp64 and rfp80.
1. X87 registers are assigned a pseudo register class. We need a new
register bank for these classes.
2. We add bank information and enums for these.
3. Legalizer is updated to allow 32b and 64b even in absence of SSE.
This is required because with SSE enabled, x86 doesn't use fp stack and
instead uses SSE registers.
4. Functions in X86RegisterBankInfo need to decide whether to use the
pseudo classes or SSE-enabled classes. I add MachineInstr as an argument
to static helper function getPartialMappingIdx to this end.

Add/Update tests.
2024-03-05 03:00:14 +01:00
AtariDreams
3e40c96d89
[X86] Resolve FIXME: Add FPCW as a rounding control register (#82452)
To prevent tests from breaking, another fix had to be made: Now, we
check if the instruction after a waiting instruction is a call, and if
so, we insert the wait.
2024-03-05 08:47:05 +08:00
Craig Topper
bdfebc310e [X86] Use update_mir_test_checks.py to generate CHECK lines in masked_compressstore_isel.ll. NFC 2024-03-04 16:17:26 -08:00
Noah Goldstein
a4951eca40 Recommit "[X86] Don't always separate conditions in (br (and/or cond0, cond1)) into separate branches" (2nd Try)
Changes in Recommit:
    1) Fix non-determanism by using `SmallMapVector` instead of
       `SmallPtrSet`.
    2) Fix bug in dependency pruning where we discounted the actual
       `and/or` combining the two conditions. This lead to over pruning.

Closes #81689
2024-03-04 13:23:56 -06:00
Shilei Tian
8300f30a92 [SelectionDAG] Add STRICT_BF16_TO_FP and STRICT_FP_TO_BF16 (#80056)
This patch adds the support for `STRICT_BF16_TO_FP` and
`STRICT_FP_TO_BF16`.
2024-03-04 01:08:49 -05:00
Shilei Tian
2c5d01c2cf Revert "[SelectionDAG] Add STRICT_BF16_TO_FP and STRICT_FP_TO_BF16 (#80056)"
This reverts commit b0c158bd947c360a4652eb0de3a4794f46deb88b.

The changes in `compiler-rt` broke tests.
2024-03-04 00:33:31 -05:00
Shilei Tian
b0c158bd94
[SelectionDAG] Add STRICT_BF16_TO_FP and STRICT_FP_TO_BF16 (#80056)
This patch adds the support for `STRICT_BF16_TO_FP` and
`STRICT_FP_TO_BF16`.
2024-03-04 00:01:50 -05:00
Phoebe Wang
ccc48d45b8 [X86][NFC] Replace X32 check prefixes with X86
We try to only use X32 for gnux32 triple tests.
2024-03-04 11:13:13 +08:00
Phoebe Wang
ff72c83b01
[X86] Add missing subvector_subreg_lowering for BF16 (#83720)
Fixes: #83358
2024-03-04 10:15:43 +08:00
NAKAMURA Takumi
5b4759f9fd Revert "[X86] Don't always separate conditions in (br (and/or cond0, cond1)) into separate branches"
This has been buggy for a while.

Reverts #81689
This reverts commit ae76dfb74701e05e5ab4be194e20e49f10768e46.
2024-03-03 22:31:28 +09:00
Shengchen Kan
37293e69e6
[X86][CodeGen] Support long instruction fixup for APX NDD instructions (#83578)
RFC:
https://discourse.llvm.org/t/rfc-support-long-instruction-fixup-for-x86/76539
2024-03-03 13:03:35 +08:00
Simon Pilgrim
ca827d53c5
[X86] Convert logicalshift(x, C) -> and(x, M) iff x is allsignbits (#83596)
If we're logical shifting an all-signbits value, then we can just mask out the shifted bits.

This helps removes some unnecessary bitcasted vXi16 shifts used for vXi8 shifts (which SimplifyDemandedBits will struggle to remove through the bitcast), and allows some AVX1 shifts of 256-bit values to stay as a YMM instruction.

Noticed in codegen from #82290
2024-03-02 12:44:33 +00:00
Noah Goldstein
ae76dfb747 [X86] Don't always separate conditions in (br (and/or cond0, cond1)) into separate branches
It makes sense to split if the cost of computing `cond1` is high
(proportionally to how likely `cond0` is), but it doesn't really make
sense to introduce a second branch if its only a few instructions.

Splitting can also get in the way of potentially folding patterns.

This patch introduces some logic to try to check if the cost of
computing `cond1` is relatively low, and if so don't split the
branches.

Modest improvement on clang bootstrap build:
https://llvm-compile-time-tracker.com/compare.php?from=79ce933114e46c891a5632f7ad4a004b93a5b808&to=978278eabc0bafe2f390ca8fcdad24154f954020&stat=cycles
Average stage2-O3:   0.59% Improvement (cycles)
Average stage2-O0-g: 1.20% Improvement (cycles)

Likewise on llvm-test-suite on SKX saw a net 0.84% improvement  (cycles)

There is also a modest compile time improvement with this patch:
https://llvm-compile-time-tracker.com/compare.php?from=79ce933114e46c891a5632f7ad4a004b93a5b808&to=978278eabc0bafe2f390ca8fcdad24154f954020&stat=instructions%3Au

Note that the stage2 instruction count increases is expected, this
patch trades instructions for decreasing branch-misses (which is
proportionately lower):
https://llvm-compile-time-tracker.com/compare.php?from=79ce933114e46c891a5632f7ad4a004b93a5b808&to=978278eabc0bafe2f390ca8fcdad24154f954020&stat=branch-misses

NB: This will also likely help for APX targets with the new `CCMP` and
`CTEST` instructions.

Closes #81689
2024-03-01 15:35:34 -06:00
Noah Goldstein
ec415aff63 [X86] Regenerate X86/lsr-addrecloops.ll test; NFC 2024-03-01 15:35:34 -06:00
Simon Pilgrim
1e8d3c357e [X86] cmp-shiftX-maskX.ll - add additional tests for #83596
Shows cases where logical shifts of allsignbits values can be profitably converted to masks
2024-03-01 19:20:14 +00:00
Simon Pilgrim
582718fe61 [X86] cmp-shiftX-maskX.ll - add AVX1 test coverage 2024-03-01 19:20:14 +00:00
Simon Pilgrim
765a5d62bc
[X86] Pre-SSE42 v2i64 sgt lowering - check if representable as v2i32 (#83560)
Without PCMPGTQ, if the i64 elements are sign-extended enough to be representable as i32 then we can compare the lower i32 bits with PCMPGTD and splat the results into the upper elements.

Value tracking has meant we already get pretty close with this, but this allows us to remove a lot of unnecessary bit flipping.
2024-03-01 14:29:12 +00:00
Shengchen Kan
924ad198f5 [X86][CodeGen] Add missing patterns for APX NDD instructions about encoding trick 2024-03-01 21:26:10 +08:00
Shengchen Kan
420928b2fa [X86][CodeGen] Fix compile crash in EVEX compression for corner case
The base register of OPmi_ND may be allocated to the same physic
register as the ND operand.

OPmi_ND is not compressible b/c it has different semnatic from OPmi.
In this case, `isRedundantNewDataDest` should return false, otherwise
we would get error

Assertion `!IsNDLike && "Missing entry for ND-like instruction"' failed.
2024-03-01 16:13:09 +08:00
Simon Pilgrim
80a328b011 [X86] SimplifyDemandedVectorEltsForTargetNode - add basic PCMPEQ/PCMPGT handling 2024-02-29 15:22:12 +00:00
RicoAfoat
1e6627ecef
[X86] matchAddressRecursively - ensure dead nodes are replaced before matching the index register (#82881)
Fixes #82431 - see #82431 for more information.
2024-02-29 14:55:51 +00:00
Simon Pilgrim
139bcda542 [X86] SimplifyDemandedVectorEltsForTargetNode - add basic CVTPH2PS/CVTPS2PH handling
Allows us to peek through the F16 conversion nodes, mainly to simplify shuffles

An easy part of #83414
2024-02-29 12:33:49 +00:00
Simon Pilgrim
b50b50bfbf [X86] cmov-fp.ll - regenerate with common 'NOSSE' prefix to reduce duplication 2024-02-29 12:16:52 +00:00
Simon Pilgrim
7ff3f9760d [X86] getFauxShuffleMask - handle insert_vector_elt(bitcast(extract_vector_elt(x))) shuffle patterns
If the bitcast is between types of equal scalar size (i.e. fp<->int bitcasts), then we can safely peek through them

Fixes #83289
2024-02-29 10:32:49 +00:00
Simon Pilgrim
30b63def50 [X86] Regenerate tests to add missing avx512 constant comments 2024-02-29 10:32:48 +00:00
Simon Pilgrim
b4bc19e2e6 [X86] Add tests showing failure to demand only the sign bit of a sitofp/uitofp node
sitofp - if we only demand the signbit, then we can try to use the source integer
uitofp - signbit is guaranteed to be zero

Noticed while reviewing #82290
2024-02-28 18:49:24 +00:00
AtariDreams
0a54b36d5e
[X86] Resolve FIXME: Create cld only when needed (#82415)
Only use cld when we also have rep instructions, are calling a function, or contain inline asm.
2024-02-28 12:32:58 +00:00
Simon Pilgrim
6287b7b9e9 [X86] combineEXTRACT_SUBVECTOR - extract 256-bit comparisons if only one subvector is required
If only one subvector extraction will be necessary (i.e. because the other is constant etc.) then extract the source operands and perform as a 128-bit comparison

Ideally DAGCombiner's narrowExtractedVectorBinOp would handle this but its tricky to confirm when a target opcode can be safely extracted and performed as a different vector type

Partially improves an outstanding regression in #82290
2024-02-28 12:24:34 +00:00
Simon Pilgrim
37daff028f [X86] setcc-lowering.ll - regenerate with AVX2 test coverage
Added while triaging a regression from #82290
2024-02-28 11:19:48 +00:00