diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 29 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/pr37879.ll | 4 |
2 files changed, 6 insertions, 27 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 27a0c51e3fd..dcf25c629d5 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -39226,32 +39226,9 @@ static SDValue combineScalarToVector(SDNode *N, SelectionDAG &DAG) { // TODO: SimplifyDemandedBits instead? if (VT == MVT::v1i1 && Src.getOpcode() == ISD::AND && Src.hasOneUse()) if (auto *C = dyn_cast<ConstantSDNode>(Src.getOperand(1))) - if (C->getAPIntValue().isOneValue()) { - SDValue Mask = Src.getOperand(0); - if (Mask.getOpcode() == ISD::TRUNCATE && - (Mask.getOperand(0).getValueType() == MVT::i8 || - Mask.getOperand(0).getValueType() == MVT::i32)) - Mask = Mask.getOperand(0); - return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), MVT::v1i1, Mask); - } - - // The result of AND may also be truncated. This occurs in code for lowered - // masked scalar intrinsics. - if (VT == MVT::v1i1 && Src.getOpcode() == ISD::TRUNCATE && Src.hasOneUse() && - Src.getOperand(0).getOpcode() == ISD::AND && - Src.getOperand(0).hasOneUse()) - if (auto *C = dyn_cast<ConstantSDNode>(Src.getOperand(0).getOperand(1))) - if (C->getAPIntValue().isOneValue()) { - SDValue Mask = Src.getOperand(0).getOperand(0); - if (Mask.getOpcode() == ISD::TRUNCATE && - (Mask.getOperand(0).getValueType() == MVT::i8 || - Mask.getOperand(0).getValueType() == MVT::i32)) - Mask = Mask.getOperand(0); - // Check if the initial value is of a legal type for scalar_to_vector. - if (Mask.getValueType() != MVT::i8 && Mask.getValueType() != MVT::i32) - return SDValue(); - return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), MVT::v1i1, Mask); - } + if (C->getAPIntValue().isOneValue()) + return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), MVT::v1i1, + Src.getOperand(0)); return SDValue(); } diff --git a/llvm/test/CodeGen/X86/pr37879.ll b/llvm/test/CodeGen/X86/pr37879.ll index 033cad8ea0c..1dc5e325066 100644 --- a/llvm/test/CodeGen/X86/pr37879.ll +++ b/llvm/test/CodeGen/X86/pr37879.ll @@ -6,8 +6,10 @@ define double @foo(i32** nocapture readonly) #0 { ; CHECK: ## %bb.0: ; CHECK-NEXT: movq (%rax), %rax ; CHECK-NEXT: vcvtsi2sdq %rax, %xmm0, %xmm1 -; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; CHECK-NEXT: ## kill: def $eax killed $eax killed $rax +; CHECK-NEXT: andl $1, %eax ; CHECK-NEXT: kmovd %eax, %k1 +; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero ; CHECK-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} ; CHECK-NEXT: retq %2 = load i64, i64* undef, align 8 |