forked from OSchip/llvm-project
				
			[X86][SSE] Constant fold PEXTRB/PEXTRW/EXTRACT_VECTOR_ELT nodes.
Replaces existing i1-only fold. llvm-svn: 356325
This commit is contained in:
		
							parent
							
								
									0f472e1d01
								
							
						
					
					
						commit
						f2c53b5d6c
					
				| 
						 | 
				
			
			@ -34552,22 +34552,40 @@ static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG,
 | 
			
		|||
  if (SDValue NewOp = combineExtractWithShuffle(N, DAG, DCI, Subtarget))
 | 
			
		||||
    return NewOp;
 | 
			
		||||
 | 
			
		||||
  // TODO - Remove this once we can handle the implicit zero-extension of
 | 
			
		||||
  // X86ISD::PEXTRW/X86ISD::PEXTRB in:
 | 
			
		||||
  // XFormVExtractWithShuffleIntoLoad, combineHorizontalPredicateResult and
 | 
			
		||||
  // combineBasicSADPattern.
 | 
			
		||||
  if (N->getOpcode() != ISD::EXTRACT_VECTOR_ELT)
 | 
			
		||||
    return SDValue();
 | 
			
		||||
 | 
			
		||||
  if (SDValue NewOp = XFormVExtractWithShuffleIntoLoad(N, DAG, DCI))
 | 
			
		||||
    return NewOp;
 | 
			
		||||
 | 
			
		||||
  SDValue InputVector = N->getOperand(0);
 | 
			
		||||
  SDValue EltIdx = N->getOperand(1);
 | 
			
		||||
  auto *CIdx = dyn_cast<ConstantSDNode>(EltIdx);
 | 
			
		||||
 | 
			
		||||
  EVT SrcVT = InputVector.getValueType();
 | 
			
		||||
  EVT VT = N->getValueType(0);
 | 
			
		||||
  SDLoc dl(InputVector);
 | 
			
		||||
  bool IsPextr = N->getOpcode() != ISD::EXTRACT_VECTOR_ELT;
 | 
			
		||||
 | 
			
		||||
  // Integer Constant Folding.
 | 
			
		||||
  if (VT.isInteger() && CIdx &&
 | 
			
		||||
      CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
 | 
			
		||||
    APInt UndefVecElts;
 | 
			
		||||
    SmallVector<APInt, 16> EltBits;
 | 
			
		||||
    unsigned VecEltBitWidth = SrcVT.getScalarSizeInBits();
 | 
			
		||||
    if (getTargetConstantBitsFromNode(InputVector, VecEltBitWidth, UndefVecElts,
 | 
			
		||||
                                      EltBits, true, false)) {
 | 
			
		||||
      uint64_t Idx = CIdx->getZExtValue();
 | 
			
		||||
      if (UndefVecElts[Idx])
 | 
			
		||||
        return IsPextr ? DAG.getConstant(0, dl, VT) : DAG.getUNDEF(VT);
 | 
			
		||||
      return DAG.getConstant(EltBits[Idx].zextOrSelf(VT.getScalarSizeInBits()),
 | 
			
		||||
                             dl, VT);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // TODO - Remove this once we can handle the implicit zero-extension of
 | 
			
		||||
  // X86ISD::PEXTRW/X86ISD::PEXTRB in:
 | 
			
		||||
  // XFormVExtractWithShuffleIntoLoad, combineHorizontalPredicateResult and
 | 
			
		||||
  // combineBasicSADPattern.
 | 
			
		||||
  if (IsPextr)
 | 
			
		||||
    return SDValue();
 | 
			
		||||
 | 
			
		||||
  if (SDValue NewOp = XFormVExtractWithShuffleIntoLoad(N, DAG, DCI))
 | 
			
		||||
    return NewOp;
 | 
			
		||||
 | 
			
		||||
  // Detect mmx extraction of all bits as a i64. It works better as a bitcast.
 | 
			
		||||
  if (InputVector.getOpcode() == ISD::BITCAST && InputVector.hasOneUse() &&
 | 
			
		||||
| 
						 | 
				
			
			@ -34589,15 +34607,6 @@ static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG,
 | 
			
		|||
      return DAG.getNode(X86ISD::MMX_MOVD2W, dl, MVT::i32, MMXSrc);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (VT == MVT::i1 && InputVector.getOpcode() == ISD::BITCAST &&
 | 
			
		||||
      isa<ConstantSDNode>(EltIdx) &&
 | 
			
		||||
      isa<ConstantSDNode>(InputVector.getOperand(0))) {
 | 
			
		||||
    uint64_t ExtractedElt = N->getConstantOperandVal(1);
 | 
			
		||||
    const APInt &InputValue = InputVector.getConstantOperandAPInt(0);
 | 
			
		||||
    uint64_t Res = InputValue[ExtractedElt];
 | 
			
		||||
    return DAG.getConstant(Res, dl, MVT::i1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Check whether this extract is the root of a sum of absolute differences
 | 
			
		||||
  // pattern. This has to be done here because we really want it to happen
 | 
			
		||||
  // pre-legalization,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,29 +8,23 @@ target triple = "x86_64-unknown-linux-gnu"
 | 
			
		|||
define void @test(<4 x i64> %a, <4 x x86_fp80> %b, <8 x x86_fp80>* %c) local_unnamed_addr {
 | 
			
		||||
; CHECK-LABEL: test:
 | 
			
		||||
; CHECK:       # %bb.0:
 | 
			
		||||
; CHECK-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
 | 
			
		||||
; CHECK-NEXT:    vmovq %xmm1, %r8
 | 
			
		||||
; CHECK-NEXT:    vmovq %xmm0, %r9
 | 
			
		||||
; CHECK-NEXT:    vpextrq $1, %xmm1, %r10
 | 
			
		||||
; CHECK-NEXT:    vpextrq $1, %xmm0, %r11
 | 
			
		||||
; CHECK-NEXT:    vmovdqa {{.*#+}} xmm1 = [2,3]
 | 
			
		||||
; CHECK-NEXT:    vmovq %xmm1, %rax
 | 
			
		||||
; CHECK-NEXT:    vmovq %xmm0, %rax
 | 
			
		||||
; CHECK-NEXT:    vpextrq $1, %xmm0, %rcx
 | 
			
		||||
; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
 | 
			
		||||
; CHECK-NEXT:    vmovq %xmm0, %rcx
 | 
			
		||||
; CHECK-NEXT:    vpextrq $1, %xmm1, %rdx
 | 
			
		||||
; CHECK-NEXT:    vmovq %xmm0, %rdx
 | 
			
		||||
; CHECK-NEXT:    vpextrq $1, %xmm0, %rsi
 | 
			
		||||
; CHECK-NEXT:    cmpq %rsi, %rdx
 | 
			
		||||
; CHECK-NEXT:    cmpq $3, %rsi
 | 
			
		||||
; CHECK-NEXT:    fld1
 | 
			
		||||
; CHECK-NEXT:    fldz
 | 
			
		||||
; CHECK-NEXT:    fld %st(0)
 | 
			
		||||
; CHECK-NEXT:    fcmove %st(2), %st
 | 
			
		||||
; CHECK-NEXT:    cmpq %rcx, %rax
 | 
			
		||||
; CHECK-NEXT:    cmpq $2, %rdx
 | 
			
		||||
; CHECK-NEXT:    fld %st(1)
 | 
			
		||||
; CHECK-NEXT:    fcmove %st(3), %st
 | 
			
		||||
; CHECK-NEXT:    cmpq %r11, %r10
 | 
			
		||||
; CHECK-NEXT:    cmpq $1, %rcx
 | 
			
		||||
; CHECK-NEXT:    fld %st(2)
 | 
			
		||||
; CHECK-NEXT:    fcmove %st(4), %st
 | 
			
		||||
; CHECK-NEXT:    cmpq %r9, %r8
 | 
			
		||||
; CHECK-NEXT:    testq %rax, %rax
 | 
			
		||||
; CHECK-NEXT:    fxch %st(3)
 | 
			
		||||
; CHECK-NEXT:    fcmove %st(4), %st
 | 
			
		||||
; CHECK-NEXT:    fstp %st(4)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -368,12 +368,10 @@ define void @rot(%i8vec3pack* nocapture sret %result, %i8vec3pack* %X, %i8vec3pa
 | 
			
		|||
; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
 | 
			
		||||
; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 | 
			
		||||
; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
 | 
			
		||||
; X86-NEXT:    movdqa {{.*#+}} xmm0 = [10395294,10395294,10395294,10395294]
 | 
			
		||||
; X86-NEXT:    pextrw $0, %xmm0, (%edx)
 | 
			
		||||
; X86-NEXT:    movb $-98, 2(%edx)
 | 
			
		||||
; X86-NEXT:    movdqa {{.*#+}} xmm0 = [65793,65793,65793,65793]
 | 
			
		||||
; X86-NEXT:    pextrw $0, %xmm0, (%ecx)
 | 
			
		||||
; X86-NEXT:    movw $-24930, (%edx) # imm = 0x9E9E
 | 
			
		||||
; X86-NEXT:    movb $1, 2(%ecx)
 | 
			
		||||
; X86-NEXT:    movw $257, (%ecx) # imm = 0x101
 | 
			
		||||
; X86-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
 | 
			
		||||
; X86-NEXT:    movdqa %xmm0, %xmm1
 | 
			
		||||
; X86-NEXT:    psrld $1, %xmm1
 | 
			
		||||
| 
						 | 
				
			
			@ -387,12 +385,10 @@ define void @rot(%i8vec3pack* nocapture sret %result, %i8vec3pack* %X, %i8vec3pa
 | 
			
		|||
; X64-LABEL: rot:
 | 
			
		||||
; X64:       # %bb.0: # %entry
 | 
			
		||||
; X64-NEXT:    movq %rdi, %rax
 | 
			
		||||
; X64-NEXT:    movdqa {{.*#+}} xmm0 = [10395294,10395294,10395294,10395294]
 | 
			
		||||
; X64-NEXT:    pextrw $0, %xmm0, (%rsi)
 | 
			
		||||
; X64-NEXT:    movb $-98, 2(%rsi)
 | 
			
		||||
; X64-NEXT:    movdqa {{.*#+}} xmm0 = [65793,65793,65793,65793]
 | 
			
		||||
; X64-NEXT:    pextrw $0, %xmm0, (%rdx)
 | 
			
		||||
; X64-NEXT:    movw $-24930, (%rsi) # imm = 0x9E9E
 | 
			
		||||
; X64-NEXT:    movb $1, 2(%rdx)
 | 
			
		||||
; X64-NEXT:    movw $257, (%rdx) # imm = 0x101
 | 
			
		||||
; X64-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
 | 
			
		||||
; X64-NEXT:    movdqa %xmm0, %xmm1
 | 
			
		||||
; X64-NEXT:    psrld $1, %xmm1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue