Commit Graph

15053 Commits

Author SHA1 Message Date
Simon Pilgrim f1a723063c [X86] Regenerate memcmp tests and add X64-AVX512 common prefix
Should help make the changes in D69157 clearer

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375215 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-18 09:59:51 +00:00
David Green eaef0d10bd [Codegen] Alter the default promotion for saturating adds and subs
The default promotion for the add_sat/sub_sat nodes currently does:
    ANY_EXTEND iN to iM
    SHL by M-N
    [US][ADD|SUB]SAT
    L/ASHR by M-N

If the promoted add_sat or sub_sat node is not legal, this can produce code
that effectively does a lot of shifting (and requiring large constants to be
materialised) just to use the overflow flag. It is simpler to just do the
saturation manually, using the higher bitwidth addition and a min/max against
the saturating bounds. That is what this patch attempts to do.

Differential Revision: https://reviews.llvm.org/D68926


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375211 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-18 09:47:48 +00:00
David Zarzycki 3a2363c797 [X86] Emit KTEST when possible
https://reviews.llvm.org/D69111

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375197 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-18 03:45:52 +00:00
Sanjay Patel 8c2e05f1ac [x86] add test for setcc to shift transform; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375158 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-17 19:32:24 +00:00
Reid Kleckner c21ecb75c2 [codeview] Workaround for PR43479, don't re-emit instr labels
Summary:
In the long run we should come up with another mechanism for marking
call instructions as heap allocation sites, and remove this workaround.
For now, we've had two bug reports about this, so let's apply this
workaround. SLH (the other client of instruction labels) probably has
the same bug, but the solution there is more likely to be to mark the
call instruction as not duplicatable, which doesn't work for debug info.

Reviewers: akhuang

Subscribers: aprantl, hiraditya, aganea, chandlerc, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69068

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375137 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-17 17:28:31 +00:00
David Green fde2ede635 [Codegen] Adjust saturation test. NFC.
Add some extra sat tests and adjust some of the existing tests to use signext where it would naturally be.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375009 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-16 15:50:42 +00:00
Craig Topper 5ddd81415d [LegalizeTypes] Don't call PromoteTargetBoolean from SplitVecOp_VSETCC.
PromoteTargetBoolean calls getSetccResultType to get the return
type. But we were passing it the setcc result type rather than the
setcc input type. This causes an issue on X86 with avx512vl where
the setcc result type for vXf16 vectors is vXi16 while the
result type for vXi16 vectors is vXi1.

There's really no guarantee that getSetccResultType is the type
we need here. So now we just grab the extend type from
getExtendForContent and extend to the original result VT of the
node we're splitting.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374970 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-16 02:50:04 +00:00
David Zarzycki c345de2744 [X86] Make memcmp() use PTEST if possible and also enable AVX1
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374922 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-15 17:40:12 +00:00
Sanjay Patel 45652a7550 [DAGCombiner] fold select-of-constants based on sign-bit test
Examples:
  i32 X > -1 ? C1 : -1 --> (X >>s 31) | C1
  i8 X < 0 ? C1 : 0 --> (X >>s 7) & C1

This is a small generalization of a fold requested in PR43650:
https://bugs.llvm.org/show_bug.cgi?id=43650

The sign-bit of the condition operand can be used as a mask for the true operand:
https://rise4fun.com/Alive/paT

Note that we already handle some of the patterns (isNegative + scalar) because
there's an over-specialized, yet over-reaching fold for that in foldSelectCCToShiftAnd().
It doesn't use any TLI hooks, so I can't easily rip out that code even though we're
duplicating part of it here. This fold is guarded by TLI.convertSelectOfConstantsToMath(),
so it should not cause problems for targets that prefer select over shift.

Also worth noting: I thought we could generalize this further to include the case where
the true operand of the select is not constant, but Alive says that may allow poison to
pass through where it does not in the original select form of the code.

Differential Revision: https://reviews.llvm.org/D68949

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374902 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-15 15:23:57 +00:00
Joerg Sonnenberger 732f95ff9a Reapply r374743 with a fix for the ocaml binding
Add a pass to lower is.constant and objectsize intrinsics

This pass lowers is.constant and objectsize intrinsics not simplified by
earlier constant folding, i.e. if the object given is not constant or if
not using the optimized pass chain. The result is recursively simplified
and constant conditionals are pruned, so that dead blocks are removed
even for -O0. This allows inline asm blocks with operand constraints to
work all the time.

The new pass replaces the existing lowering in the codegen-prepare pass
and fallbacks in SDAG/GlobalISEL and FastISel. The latter now assert
on the intrinsics.

Differential Revision: https://reviews.llvm.org/D65280


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374784 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-14 16:15:14 +00:00
Sanjay Patel bd673156a7 [x86] adjust select to sra tests; NFC
Avoid demanded-bits-based specializations (that may not be ideal,
but that's another problem).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374783 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-14 15:53:55 +00:00
Sanjay Patel a8bfb47f37 [x86] add tests for possible select to sra transforms; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374779 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-14 14:43:06 +00:00
Dmitri Gribenko e0cea29324 Revert "Add a pass to lower is.constant and objectsize intrinsics"
This reverts commit r374743. It broke the build with Ocaml enabled:
http://lab.llvm.org:8011/builders/clang-x86_64-debian-fast/builds/19218

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374768 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-14 12:22:48 +00:00
Craig Topper eca2f6ad30 [X86] Teach EmitTest to handle ISD::SSUBO/USUBO in order to use the Z flag from the subtract directly during isel.
This prevents isel from emitting a TEST instruction that
optimizeCompareInstr will need to remove later.

In some of the modified tests, the SUB gets duplicated due to
the flags being needed in two places and being clobbered in
between. optimizeCompareInstr was able to optimize away the TEST
that was using the result of one of them, but optimizeCompareInstr
doesn't know to turn SUB into CMP after removing the TEST. It
only knows how to turn SUB into CMP if the result was already
dead.

With this change the TEST never exists, so optimizeCompareInstr
doesn't have to remove it. Then it can just turn the SUB into
CMP immediately.

Fixes PR43649.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374755 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-14 06:47:56 +00:00
Craig Topper 7cfac68776 [X86] Autogenerate complete checks. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374748 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-14 01:41:04 +00:00
Joerg Sonnenberger 314e3cde15 Add a pass to lower is.constant and objectsize intrinsics
This pass lowers is.constant and objectsize intrinsics not simplified by
earlier constant folding, i.e. if the object given is not constant or if
not using the optimized pass chain. The result is recursively simplified
and constant conditionals are pruned, so that dead blocks are removed
even for -O0. This allows inline asm blocks with operand constraints to
work all the time.

The new pass replaces the existing lowering in the codegen-prepare pass
and fallbacks in SDAG/GlobalISEL and FastISel. The latter now assert
on the intrinsics.

Differential Revision: https://reviews.llvm.org/D65280


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374743 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-13 23:00:15 +00:00
Craig Topper cf5b798076 [X86] Enable use of avx512 saturating truncate instructions in more cases.
This enables use of the saturating truncate instructions when the
result type is less than 128 bits. It also enables the use of
saturating truncate instructions on KNL when the input is less
than 512 bits. We can do this by widening the input and then
extracting the result.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374731 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-13 19:07:28 +00:00
Simon Pilgrim 09c57f735c [X86][AVX] Add i686 avx splat tests
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374719 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-13 13:18:07 +00:00
Craig Topper 213f1f4cbf [X86] Add a one use check on the setcc to the min/max canonicalization code in combineSelect.
This seems to improve std::midpoint code where we have a min and
a max with the same condition. If we split the setcc we can end
up with two compares if the one of the operands is a constant.
Since we aggressively canonicalize compares with constants.
For non-constants it can interfere with our ability to share
control flow if we need to expand cmovs into control flow.

I'm also not sure I understand this min/max canonicalization code.
The motivating case talks about comparing with 0. But we don't
check for 0 explicitly.

Removes one instruction from the codegen for PR43658.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374706 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-13 06:48:05 +00:00
Craig Topper e166f9ed84 [X86] Enable v4i32->v4i16 and v8i16->v8i8 saturating truncates to use pack instructions with avx512.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374705 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-13 05:47:47 +00:00
Craig Topper aa7ea7f0db [X86] Add v2i64->v2i32/v2i16/v2i8 test cases to the trunc packus/ssat/usat tests. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374704 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-13 05:47:42 +00:00
Simon Pilgrim 276965a576 [X86][SSE] Avoid unnecessary PMOVZX in v4i8 sum reduction
This should go away once D66004 has landed and we can simplify shuffle chains using demanded elts.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374658 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-12 15:19:13 +00:00
Craig Topper ec998a2f4e [X86] Use pack instructions for packus/ssat truncate patterns when 256-bit is the largest legal vector and the result type is at least 256 bits.
Since the input type is larger than 256-bits we'll need to some
concatenating to reassemble the results. The pack instructions
ability to concatenate while packing make this a shorter/faster
sequence.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374643 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-12 07:59:29 +00:00
Craig Topper 6e215a38ba [X86] Test SKX cpu in the vector-trunc-packus/ssat/usat.ll tests instad of min-legal-vector-width.ll
This adds "min-legal-vector-width"="256" function attributes to
all the tests for a larger than 256-bit input. Also switch any
larger than 512-bit inputs to use a load. This makes the
arguments consistent with min-legal-vector-width attribute which
should usually be at least as large as the arguments.

The SKX configuration will avoid using zmm registers on the
modified test cases. For many of them we should use something
closer to the AVX2 codegen with pack instructions instead of
the avx512 saturating truncates.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374642 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-12 07:59:24 +00:00
Craig Topper f68c4aef85 [X86] Fold a VTRUNCS/VTRUNCUS+store into a saturating truncating store.
We already did this for VTRUNCUS with a specific combination of
types. This extends this to VTRUNCS and handles any types where
a truncating store is legal.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374615 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-12 00:01:08 +00:00
Craig Topper d42eac67f5 [X86] Add test case showing missing opportunity to fold vmovsdb into a store after type legalization. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374614 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-12 00:00:59 +00:00
David Blaikie 86b0b371bb DebugInfo: Use base address selection entries for debug_loc
Unify the range and loc emission (for both DWARFv4 and DWARFv5 style lists) and take advantage of that unification to use strategic base addresses for loclists.

Differential Revision: https://reviews.llvm.org/D68620

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374600 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 21:52:41 +00:00
David Green 043238b41c Revert 374373: [Codegen] Alter the default promotion for saturating adds and subs
This commit is not extending the promoted integers as it should. Reverting
whilst I look into the details.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374592 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 20:33:03 +00:00
David Blaikie 9a6583f43f llvm-dwarfdump: Add verbose printing for debug_loclists
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374582 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 19:06:35 +00:00
Simon Pilgrim 072da28304 [X86][SSE] Add support for v4i8 add reduction
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374579 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 17:54:15 +00:00
Sanjay Patel f2c20cc531 [DAGCombiner] fold vselect-of-constants to shift
The diffs suggest that we are missing some more basic
analysis/transforms, but this keeps the vector path in
sync with the scalar (rL374397). This is again a
preliminary step for introducing the reverse transform
in IR as proposed in D63382.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374555 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 14:17:56 +00:00
Craig Topper a621fe0853 [X86] Add v8i64->v8i8 ssat/usat/packus truncate tests to min-legal-vector-width.ll
I wonder if we should split the v8i8 stores in order to form
two v4i8 saturating truncating stores. This would remove the
unpckl needed to concatenated the v4i8 results to make a
single store.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374519 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 07:24:36 +00:00
Craig Topper cc3c27eb63 [X86] Add a DAG combine to turn v16i16->v16i8 VTRUNCUS+store into a saturating truncating store.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374509 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 04:16:49 +00:00
Craig Topper 6231d42f12 [X86] Add test case for trunc_packus_v16i32_v16i8_store to min-legal-vector-width.ll
We aren't folding the vpmovuswb into the store.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374507 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 04:02:04 +00:00
Craig Topper 03162b6c1f [X86] Add more packus/ssat/usat truncate tests from legal vectors to less than 128-bit vectors.
Some of these have sub-optimal codegen for avx512 relative to avx2.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374505 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 03:46:39 +00:00
Craig Topper 70a8e54738 [X86] Improve the AVX512 bailout in combineTruncateWithSat to allow pack instructions in more situations.
If we don't have VLX we won't end up selecting a saturating
truncate for 256-bit or smaller vectors so we should just use
the pack lowering.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374487 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 00:38:51 +00:00
Craig Topper 3218be418e [X86] Update trunc_packus_v32i32_v32i8 test in min-legal-vector-width.ll to use a load for the large type and add the min-legal-vector-width attribute.
The attribute is needed to avoid zmm registers. Using memory
avoids argument splitting for large vectors.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374486 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-11 00:38:41 +00:00
Craig Topper c60c94f201 [X86] Add test cases for packus/ssat/usat 32i32->v32i8 test cases. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374459 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 21:46:44 +00:00
Sanjay Patel 0e8408c6d4 [x86] reduce duplicate test assertions; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374436 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 19:52:27 +00:00
Craig Topper 2acd87bbf2 [X86] Use packusdw+vpmovuswb to implement v16i32->V16i8 that clamps signed inputs to be between 0 and 255 when zmm registers are disabled on SKX.
If we've disable zmm registers, the v16i32 will need to be split. This split will propagate through min/max the truncate. This creates two sequences that need to be concatenated back to v16i8. We can instead use packusdw to do part of the clamping, truncating, and concatenating all at once. Then we can use a vpmovuswb to finish off the clamp.

Differential Revision: https://reviews.llvm.org/D68763

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374431 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 19:40:44 +00:00
Sanjay Patel 885227718e [DAGCombiner] fold select-of-constants to shift
This reverses the scalar canonicalization proposed in D63382.

Pre: isPowerOf2(C1)
%r = select i1 %cond, i32 C1, i32 0
=>
%z = zext i1 %cond to i32
%r = shl i32 %z, log2(C1)

https://rise4fun.com/Alive/Z50

x86 already tries to fold this pattern, but it isn't done
uniformly, so we still see a diff. AArch64 probably should
enable the TLI hook to benefit too, but that's a follow-on.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374397 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 17:52:02 +00:00
David Green fc8ff5c7b7 [Codegen] Alter the default promotion for saturating adds and subs
The default promotion for the add_sat/sub_sat nodes currently does:
   1. ANY_EXTEND iN to iM
   2. SHL by M-N
   3. [US][ADD|SUB]SAT
   4. L/ASHR by M-N
If the promoted add_sat or sub_sat node is not legal, this can produce code
that effectively does a lot of shifting (and requiring large constants to be
materialised) just to use the overflow flag. It is simpler to just do the
saturation manually, using the higher bitwidth addition and a min/max against
the saturating bounds. That is what this patch attempts to do.

Differential Revision: https://reviews.llvm.org/D68643


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374373 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 16:04:49 +00:00
Simon Pilgrim 4c0c0f3730 [X86] combineFMA - Convert to use isNegatibleForFree/GetNegatedExpression.
Split off from D67557.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374356 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 14:14:12 +00:00
Amaury Sechet 33d66718c9 [DAGCombine] Match more patterns for half word bswap
Summary: It ensures that the bswap is generated even when a part of the subtree already matches a bswap transform.

Reviewers: craig.topper, efriedma, RKSimon, lebedev.ri

Subscribers: llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68250

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374340 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 13:20:10 +00:00
Sanjay Patel 467596061a [AArch64][x86] add tests for (v)select bit magic; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374334 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 12:53:24 +00:00
Craig Topper 9590c4473f [X86] Add test case for trunc_packus_v16i32_v16i8 with avx512vl+avx512bw and prefer-vector-width=256 and min-legal-vector-width=256. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374283 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-10 06:25:00 +00:00
David Blaikie 230cf52e6e llvm-dwarfdump: Support multiple debug_loclists contributions
Also fixing the incorrect "offset" field being computed/printed for each
location list.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374232 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-09 21:25:28 +00:00
David Green 4086525278 Add and adjust saturating tests. NFC
This adds some extra testing to the existing [su][add/sub]_sat X86 and AArch64
tests and adds equivalent tests for ARM.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374169 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-09 14:17:38 +00:00
Amaury Sechet 95a2fb2bc5 Add test for rotating truncated vectors. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374043 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-08 13:08:51 +00:00
Craig Topper 29c8da51db [X86] Shrink zero extends of gather indices from type less than i32 to types larger than i32.
Gather instructions can use i32 or i64 elements for indices. If
the index is zero extended from a type smaller than i32 to i64, we
can shrink the extend to just extend to i32.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373982 91177308-0d34-0410-b5e6-96231b3b80d8
2019-10-07 23:03:12 +00:00