[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