[PATCH] D114306: [X86] Don't combine (x86cmp (trunc (movmsk (bitcast X))), 0) if the truncate discards bits.
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 19 19:12:03 PST 2021
craig.topper created this revision.
craig.topper added reviewers: RKSimon, spatel, pengfei.
Herald added a subscriber: hiraditya.
craig.topper requested review of this revision.
Herald added a project: LLVM.
We have transform that tries turn a pmovmskb into movmskps/pd or
movmskps to movmskpd. This transform isn't valid if the truncate
discarded bits that might be set by the original movmsk.
We could fix this by inserting an AND after the new movmsk to discard
the equivalent of the truncated bits, but I've left that for later
patch.
Fixes PR52567.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D114306
Files:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/pr52567.ll
Index: llvm/test/CodeGen/X86/pr52567.ll
===================================================================
--- llvm/test/CodeGen/X86/pr52567.ll
+++ llvm/test/CodeGen/X86/pr52567.ll
@@ -2,17 +2,16 @@
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
; The and in the test below discards half the bits from vector icmp result.
-; FIXME: The generated code is using a movmskps, but fails to discard bits
-; 2 and 3 before the testl.
+; We use a testb after a pmovmskb to examine only 8 bits.
define i32 @foo(<4 x float> %arg) {
; CHECK-LABEL: foo:
; CHECK: # %bb.0: # %bb
; CHECK-NEXT: movaps {{.*#+}} xmm1 = [1.00000005E-3,1.00000005E-3,1.00000005E-3,1.00000005E-3]
; CHECK-NEXT: cmpltps %xmm0, %xmm1
-; CHECK-NEXT: movmskps %xmm1, %ecx
+; CHECK-NEXT: pmovmskb %xmm1, %ecx
; CHECK-NEXT: xorl %eax, %eax
-; CHECK-NEXT: testl %ecx, %ecx
+; CHECK-NEXT: testb %cl, %cl
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
bb:
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -44004,7 +44004,11 @@
// signbits extend down to all the sub-elements as well.
// Calling MOVMSK with the wider type, avoiding the bitcast, helps expose
// potential SimplifyDemandedBits/Elts cases.
- if (Vec.getOpcode() == ISD::BITCAST) {
+ // If we looked through a truncate that discard bits, we can't do this
+ // transform.
+ // FIXME: We could do this transform for truncates that discarded bits by
+ // inserting an AND mask between the new MOVMSK and the CMP.
+ if (Vec.getOpcode() == ISD::BITCAST && NumElts <= CmpBits) {
SDValue BC = peekThroughBitcasts(Vec);
MVT BCVT = BC.getSimpleValueType();
unsigned BCNumElts = BCVT.getVectorNumElements();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114306.388677.patch
Type: text/x-patch
Size: 1865 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211120/11d1f262/attachment.bin>
More information about the llvm-commits
mailing list