Commit Graph

14089 Commits

Author SHA1 Message Date
Kevin P. Neal e972c4e0da Add AVX support to this test.
Requested by Craig Topper and Andrew Kaylor as part of D55897.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359461 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-29 16:06:04 +00:00
Simon Pilgrim 9043d57972 [X86][SSE] Add scalar horizontal add/sub tests for non-0/1 element extractions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359454 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-29 14:26:27 +00:00
Simon Pilgrim ee8d96fcfb [X86][SSE] Moved haddps test from phaddsub.ll to haddsub.ll (D61245)
Also merged duplicate PR39921 + PR39936 tests

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359437 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-29 11:30:47 +00:00
Simon Pilgrim b7310f5389 [X86] Add PR39921 HADD pairwise reduction test and AVX2 test coverage
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359409 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 21:04:47 +00:00
Simon Pilgrim f3be67d655 [X86][AVX] Add fast-hops target for add/fadd reduction tests
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359408 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 20:04:08 +00:00
Simon Pilgrim b4966362f9 [X86] Add PR39936 HADD Tests
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359407 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 20:03:11 +00:00
Simon Pilgrim 2fa97aca16 [X86][AVX] Enabled AVX512F tests and add PR40815 test case
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359401 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 15:04:30 +00:00
Simon Pilgrim a53eda72ec [X86][AVX] Combine non-lane crossing binary shuffles using X86ISD::VPERMV3
Some of the combines might be further improved if we lower more shuffles with X86ISD::VPERMV3 directly, instead of waiting to combine the results.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359400 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 14:31:01 +00:00
Sanjay Patel 750719fb74 [SelectionDAG] include FP min/max variants as binary operators
The x86 test diffs don't look great because of extra move ops,
but FP min/max should clearly be included in the list.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359399 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 13:19:29 +00:00
Sanjay Patel 88f49fa5ef [DAGCombiner] try repeated fdiv divisor transform before building estimate
This was originally part of D61028, but it's an independent diff.

If we try the repeated divisor reciprocal transform before producing an estimate sequence,
then we have an opportunity to use scalar fdiv. On x86, the trade-off is 1 divss vs. 5
vector FP ops in the default estimate sequence. On recent chips (Skylake, Ryzen), the
full-precision division is only 3 cycle throughput, so that's probably the better perf
default option and avoids problems from x86's inaccurate estimates.

The last 2 tests show that users still have the option to override the defaults by using
the function attributes for reciprocal estimates, but those patterns are potentially made
faster by converting the vector ops (including ymm ops) to scalar math.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359398 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 12:23:43 +00:00
Simon Pilgrim 509a83cf30 [X86][SSE] Optimize llvm.experimental.vector.reduce.xor.vXi1 parity reduction (PR38840)
An xor reduction of a bool vector can be optimized to a parity check of the MOVMSK/BITCAST'd integer - if the population count is odd return 1, else return 0.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359396 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 10:46:17 +00:00
Simon Pilgrim 1571d111a2 [X86][AVX] Add AVX512DQ coverage for masked memory ops tests (PR34584)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359395 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 10:02:34 +00:00
Craig Topper 2b887560b6 [X86] Remove (V)MOV64toSDrr/m and (V)MOVDI2SSrr/m. Use 128-bit result MOVD/MOVQ and COPY_TO_REGCLASS instead
Summary:
The register form of these instructions are CodeGenOnly instructions that cover
GR32->FR32 and GR64->FR64 bitcasts. There is a similar set of instructions for
the opposite bitcast. Due to the patterns using bitcasts these instructions get
marked as "bitcast" machine instructions as well. The peephole pass is able to
look through these as well as other copies to try to avoid register bank copies.

Because FR32/FR64/VR128 are all coalescable to each other we can end up in a
situation where a GR32->FR32->VR128->FR64->GR64 sequence can be reduced to
GR32->GR64 which the copyPhysReg code can't handle.

To prevent this, this patch removes one set of the 'bitcast' instructions. So
now we can only go GR32->VR128->FR32 or GR64->VR128->FR64. The instruction that
converts from GR32/GR64->VR128 has no special significance to the peephole pass
and won't be looked through.

I guess the other option would be to add support to copyPhysReg to just promote
the GR32->GR64 to a GR64->GR64 copy. The upper bits were basically undefined
anyway. But removing the CodeGenOnly instruction in favor of one that won't be
optimized seemed safer.

I deleted the peephole test because it couldn't be made to work with the bitcast
instructions removed.

The load version of the instructions were unnecessary as the pattern that selects
them contains a bitcasted load which should never happen.

Fixes PR41619.

Reviewers: RKSimon, spatel

Reviewed By: RKSimon

Subscribers: hiraditya, llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359392 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-28 06:25:33 +00:00
Simon Pilgrim 723da7d379 Revert rL359389: [X86][SSE] Add support for <64 x i1> bool reduction
Minor generalization of the existing <32 x i1> pre-AVX2 split code.
........
Causing irregular buildbot failures.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359391 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 20:44:08 +00:00
Simon Pilgrim f0586753f1 [X86][AVX] Add additional SSE/AVX expandload and compressstore targets
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359390 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 20:20:02 +00:00
Simon Pilgrim df4ebd860c [X86][SSE] Add support for <64 x i1> bool reduction
Minor generalization of the existing <32 x i1> pre-AVX2 split code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359389 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 20:04:44 +00:00
Simon Pilgrim 2060bec1eb [X86][AVX] Cleanup and add additional expandload and compressstore tests
sort order by types and add vXi32/vXi16/vXi8 test coverage

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359388 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 19:57:34 +00:00
Simon Pilgrim 8c3e398a3c [X86][AVX512] Improve vector bool reductions
As predicate masks are legal on AVX512 targets, we avoid MOVMSK in these cases, but we can just bitcast the bool vector to the integer equivalent directly - avoiding expansion of the reduction to a shuffle pattern.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359386 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 17:32:46 +00:00
Simon Pilgrim 416f89e2cc [X86] Add vector boolean reduction tests (PR38840)
AND/OR/XOR tests for the @llvm.experimental.vector.reduce intrinsics

AND/OR are pretty good (pre-AVX512), XOR (not so common but used for parity reduction) is still pretty bad.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359385 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 16:49:54 +00:00
Simon Pilgrim 5378974fba Fix check-prefixes typo
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359382 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 15:41:14 +00:00
Simon Pilgrim 93fdfcf73b [X86][SSE] Add initial test case for subvector insert/extract of illegal types
Suggested by @nikic on D59188

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359379 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 15:30:06 +00:00
Simon Pilgrim 14033682e6 [X86][AVX] Merge mask select with shuffles across extract_subvector (PR40332)
Fixes PR40332 in the limited case where we're selecting between a target shuffle and a zero vector.

We can extend this in the future to handle more opcodes and non-zero selections.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359378 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 13:35:32 +00:00
Craig Topper bb63d99309 [X86] Use MOVQ for i64 atomic_stores when SSE2 is enabled
Summary: If we have SSE2 we can use a MOVQ to store 64-bits and avoid falling back to a cmpxchg8b loop. If its a seq_cst store we need to insert an mfence after the store.

Reviewers: spatel, RKSimon, reames, jfb, efriedma

Reviewed By: RKSimon

Subscribers: hiraditya, dexonsmith, llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359368 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-27 03:38:15 +00:00
Nick Desaulniers b3cb8ab451 [AsmPrinter] refactor to support %c w/ GlobalAddress'
Summary:
Targets like ARM, MSP430, PPC, and SystemZ have complex behavior when
printing the address of a MachineOperand::MO_GlobalAddress. Move that
handling into a new overriden method in each base class. A virtual
method was added to the base class for handling the generic case.

Refactors a few subclasses to support the target independent %a, %c, and
%n.

The patch also contains small cleanups for AVRAsmPrinter and
SystemZAsmPrinter.

It seems that NVPTXTargetLowering is possibly missing some logic to
transform GlobalAddressSDNodes for
TargetLowering::LowerAsmOperandForConstraint to handle with "i" extended
inline assembly asm constraints.

Fixes:
- https://bugs.llvm.org/show_bug.cgi?id=41402
- https://github.com/ClangBuiltLinux/linux/issues/449

Reviewers: echristo, void

Reviewed By: void

Subscribers: void, craig.topper, jholewinski, dschuff, jyknight, dylanmckay, sdardis, nemanjai, javed.absar, sbc100, jgravelle-google, eraman, kristof.beyls, hiraditya, aheejin, kbarton, fedor.sergeev, jrtc27, atanasyan, jsji, llvm-commits, kees, tpimh, nathanchance, peter.smith, srhines

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359337 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-26 18:45:04 +00:00
Simon Pilgrim 4db70c21dc [X86][AVX] Fold extract_subvector(broadcast(x)) -> broadcast(x) iff x has one use
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359332 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-26 18:02:14 +00:00
Sanjay Patel d3cefe91ff [x86] add tests for fmin/fmax; NFC
'maximum' and 'minimum' still crash, so they are commented out.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359306 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-26 13:36:37 +00:00
Simon Pilgrim cc6487ed56 [X86][SSE] Disable shouldFoldConstantShiftPairToMask for btver1/btver2 targets (PR40758)
As detailed on PR40758, Bobcat/Jaguar can perform vector immediate shifts on the same pipes as vector ANDs with the same latency - so it doesn't make sense to replace a shl+lshr with a shift+and pair as it requires an additional mask (with the extra constant pool, loading and register pressure costs).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359293 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-26 10:49:13 +00:00
Simon Pilgrim 8a0d120e52 [X86][AVX] Combine shuffles extracted from a common vector
A small step towards combining shuffles across vector sizes - this recognizes when a shuffle's operands are all extracted from the same larger source and tries to combine to an unary shuffle of that source instead. Fixes one of the test cases from PR34380.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359292 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-26 09:56:14 +00:00
Sanjay Patel 8f63d03e3a [x86] add tests for vector fdiv reciprocal estimate; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359238 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-25 20:35:47 +00:00
Craig Topper 2d0f20640c [SelectionDAG][X86] Use stack load/store in PromoteIntRes_BITCAST when the input needs to be be split and the output type is a vector.
We had special case handling here, but it uses a scalar any_extend for the
promotion then bitcasts to the final type. This won't split up the input data
into multiple promoted elements like we need.

This patch falls back to doing the conversion through memory.

Fixes PR41594 which I believe was reflected in the bitcast-vector-bool.ll
changes. The changes to vector-half-conversions.ll are fixing a previously
unknown miscompile from this issue.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359219 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-25 18:19:59 +00:00
Simon Pilgrim d6778e97e0 [X86][SSE] combineBitcastvxi1 - add support for bitcasting to non-scalar integers
Truncate the movmsk scalar integer result to the equivalent scalar integer width as before but then bitcast to the requested type.

We still have the issue identified in PR41594 but D61114 should handle this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359176 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-25 09:34:36 +00:00
Amy Huang ec039c845f Recommitting r358783 and r358786 "[MS] Emit S_HEAPALLOCSITE debug info" with fixes for buildbot error (undefined assembler label).
Summary:
This emits labels around heapallocsite calls and S_HEAPALLOCSITE debug
info in codeview. Currently only changes FastISel, so emitting labels still
needs to be implemented in SelectionDAG.

Reviewers: rnk

Subscribers: aprantl, hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359149 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 23:02:48 +00:00
Sanjay Patel 42ee3f5798 [DAGCombiner] scale repeated FP divisor by splat factor
If we have a vector FP division with a splatted divisor, use the existing transform
that converts 'x/y' into 'x * (1.0/y)' to allow more conversions. This can then
potentially be converted into a scalar FP division by existing combines (rL358984)
as seen in the tests here.

That can be a potentially big perf difference if scalar fdiv has better timing
(including avoiding possible frequency throttling for vector ops).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359147 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 22:28:58 +00:00
Craig Topper c28a81a948 [X86] Prevent folding a load into an AND if that AND is really a ZEXT_INREG that should use movzx.
This can save a 32-bit immediate move.

We would shrink the load and fold it if it was non-volatile, but that's trickier to check for.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359129 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 19:28:38 +00:00
Craig Topper fc1e159675 [X86] Remove dead nodes left after ReplaceAllUsesWith calls during address matching
ReplaceAllUsesWith doesn't remove the node that was replaced. So its left around in the graph messing up use counts on other nodes.

One thing to note, is that this isn't valid if the node being deleted is the root node of an LEA match that gets rejected. In that case the node needs to stay alive because the isel table walking code would still have a reference to it that its going to try to match next. I don't think that's the case here though because the nodes being deleted here should be "and", "srl", and "zero_extend" none of which can be the root node of an LEA match.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359121 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 18:02:07 +00:00
Simon Pilgrim be72558708 [X86][SSE] Add tests for bitcasting vXi1 bool vectors to non-simple types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359116 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 17:25:45 +00:00
Sanjay Patel 03f6e8657c [x86] make sure horizontal op and broadcast types match to simplify (PR41414)
If the types don't match, we can't just remove the shuffle.
There may be some other opportunity for optimization here,
but this should prevent the crashing seen in:
https://bugs.llvm.org/show_bug.cgi?id=41414

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359095 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 14:05:08 +00:00
Simon Pilgrim 8b62c4ddd9 [X86][SSE] Add masked bit test cases for PR26697
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359082 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 10:34:15 +00:00
Francis Visoiu Mistrih 04dcbb5165 [Remarks] Add string deduplication using a string table
* Add support for uniquing strings in the remark streamer and emitting the string table in the remarks section.

* Add parsing support for the string table in the RemarkParser.

From this remark:

```
--- !Missed
Pass:     inline
Name:     NoDefinition
DebugLoc: { File: 'test-suite/SingleSource/UnitTests/2002-04-17-PrintfChar.c',
            Line: 7, Column: 3 }
Function: printArgsNoRet
Args:
  - Callee:   printf
  - String:   ' will not be inlined into '
  - Caller:   printArgsNoRet
    DebugLoc: { File: 'test-suite/SingleSource/UnitTests/2002-04-17-PrintfChar.c',
                Line: 6, Column: 0 }
  - String:   ' because its definition is unavailable'
...
```

to:

```
--- !Missed
Pass: 0
Name: 1
DebugLoc: { File: 3, Line: 7, Column: 3 }
Function: 2
Args:
  - Callee:   4
  - String:   5
  - Caller:   2
    DebugLoc: { File: 3, Line: 6, Column: 0 }
  - String:   6
...
```

And the string table in the .remarks/__remarks section containing:

```
inline\0NoDefinition\0printArgsNoRet\0
test-suite/SingleSource/UnitTests/2002-04-17-PrintfChar.c\0printf\0
will not be inlined into \0 because its definition is unavailable\0
```

This is mostly supposed to be used for testing purposes, but it gives us
a 2x reduction in the remark size, and is an incremental change for the
updates to the remarks file format.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359050 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-24 00:06:24 +00:00
Francis Visoiu Mistrih a8196a8e04 [CGP] Look through bitcasts when duplicating returns for tail calls
The simple case of:

```
int *callee();
void *caller(void *a) {
  if (a == NULL)
    return callee();
  return a;
}
```

would generate a regular call instead of a tail call because we don't
look through the bitcast of the call to `callee` when duplicating the
return blocks.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359041 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 21:57:46 +00:00
Francis Visoiu Mistrih 7f2f10be2a [X86] Add codegen prepare test exercising a bitcast + tail call
In preparation of https://reviews.llvm.org/D60837, add this test where
we don't perform a tail call because we don't look through a bitcast.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359040 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 21:57:43 +00:00
Amy Huang 320b0cfdcd Revert "[MS] Emit S_HEAPALLOCSITE debug info" because of ToTWin64(db)
buildbot failure.

This reverts commit d07d6d617713bececf57f3547434dd52f0f13f9e and
c774f687b6880484a126ed3e3d737e74c926f0ae.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359034 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 21:12:58 +00:00
Craig Topper 2aee714ecd [X86] Autogenerate complete checks. NFC
Prep for D60993

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359031 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 20:52:00 +00:00
Sanjay Patel bd11c290c4 [x86] fix test checks for fdiv combine; NFC
Must have picked up some transient code changes when originally generating this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359008 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 16:31:30 +00:00
Sanjay Patel a479f0531b [x86] add tests for vector fdiv with splat divisor; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359006 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 16:16:16 +00:00
Sanjay Patel fcd06adc8e [x86] use psubus for more vsetcc lowering (PR39859)
Circling back to a leftover bit from PR39859:
https://bugs.llvm.org/show_bug.cgi?id=39859#c1

...we have this counter-intuitive (based on the test diffs) opportunity to use 'psubus'.
This appears to be the better perf option for both Haswell and Jaguar based on llvm-mca.
We already do this transform for the SETULT predicate, so this makes the code more
symmetrical too. If we have pminub/pminuw, we prefer those, so this should not affect
anything but pre-SSE4.1 subtargets.

  $ cat before.s
	movdqa	-16(%rip), %xmm2    ## xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
	pxor	%xmm0, %xmm2
	pcmpgtw	-32(%rip), %xmm2 ## xmm2 = [255,255,255,255,255,255,255,255]
	pand	%xmm2, %xmm0
	pandn	%xmm1, %xmm2
	por	%xmm2, %xmm0

  $ cat after.s
	movdqa	-16(%rip), %xmm2    ## xmm2 = [256,256,256,256,256,256,256,256]
	psubusw	%xmm0, %xmm2
	pxor	%xmm3, %xmm3
	pcmpeqw	%xmm2, %xmm3
	pand	%xmm3, %xmm0
	pandn	%xmm1, %xmm3
	por	%xmm3, %xmm0

  $ llvm-mca before.s -mcpu=haswell
  Iterations:        100
  Instructions:      600
  Total Cycles:      909
  Total uOps:        700

  Dispatch Width:    4
  uOps Per Cycle:    0.77
  IPC:               0.66
  Block RThroughput: 1.8

  $ llvm-mca after.s -mcpu=haswell
  Iterations:        100
  Instructions:      700
  Total Cycles:      409
  Total uOps:        700

  Dispatch Width:    4
  uOps Per Cycle:    1.71
  IPC:               1.71
  Block RThroughput: 1.8

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358999 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 15:20:17 +00:00
Sanjay Patel 4ef72253f1 [DAGCombiner] generalize binop-of-splats scalarization
If we only match build vectors, we can miss some patterns
that use shuffles as seen in the affected tests.

Note that the underlying calls within getSplatSourceVector()
have the potential for compile-time explosion because of
exponential recursion looking through binop opcodes, but
currently the list of supported opcodes is very limited.
Both of those problems should be addressed in follow-up
patches.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358984 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 13:16:41 +00:00
Bjorn Pettersson 734bf57ca8 [DAGCombiner] Combine OR as ADD when no common bits are set
Summary:
The DAGCombiner is rewriting (canonicalizing) an ISD::ADD
with no common bits set in the operands as an ISD::OR node.

This could sometimes result in "missing out" on some
combines that normally are performed for ADD. To be more
specific this could happen if we already have rewritten an
ADD into OR, and later (after legalizations or combines)
we expose patterns that could have been optimized if we
had seen the OR as an ADD (e.g. reassociations based on ADD).

To make the DAG combiner less sensitive to if ADD or OR is
used for these "no common bits set" ADD/OR operations we
now apply most of the ADD combines also to an OR operation,
when value tracking indicates that the operands have no
common bits set.

Reviewers: spatel, RKSimon, craig.topper, kparzysz

Reviewed By: spatel

Subscribers: arsenm, rampitec, lebedev.ri, jvesely, nhaehnle, hiraditya, javed.absar, llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358965 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-23 10:01:08 +00:00
Sanjay Patel 5e45666b12 [SelectionDAG] move splat util functions up from x86 lowering
This was supposed to be NFC, but the change in SDLoc
definitions causes instruction scheduling changes.

There's nothing x86-specific in this code, and it can
likely be used from DAGCombiner's simplifyVBinOp().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358930 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-22 22:43:36 +00:00
Simon Pilgrim 524491cf14 [TargetLowering][AMDGPU][X86] Improve SimplifyDemandedBits bitcast handling
This patch adds support for BigBitWidth -> SmallBitWidth bitcasts, splitting the DemandedBits/Elts accordingly.

The AMDGPU backend needed an extra  (srl (and x, c1 << c2), c2) -> (and (srl(x, c2), c1) combine to encourage BFE creation, I investigated putting this in DAGCombine but it caused a lot of noise on other targets - some improvements, some regressions.

The X86 changes are all definite wins.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358887 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-22 14:04:35 +00:00