From: Craig Topper Date: Sat, 1 Apr 2017 04:26:20 +0000 (+0000) Subject: [DAGCombiner] Fix fold (or (shuf A, V_0, MA), (shuf B, V_0, MB)) -> (shuf A, B, Mask... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0c554b7eb16059f55e8d921f0f321a5ffa5af26f;p=llvm [DAGCombiner] Fix fold (or (shuf A, V_0, MA), (shuf B, V_0, MB)) -> (shuf A, B, Mask) to explicitly ensure that only one of the inputs of each shuffle is a zero vector. This can only happen when we have a mix of zero and undef elements and the two vectors have a different arrangement of zeros/undefs. The shuffle should eventually be constant folded to all zeros. Fixes PR32484. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299291 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 9fbd40978c8..d21dde0711f 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4082,7 +4082,7 @@ SDValue DAGCombiner::visitOR(SDNode *N) { bool ZeroN10 = ISD::isBuildVectorAllZeros(N1.getOperand(0).getNode()); bool ZeroN11 = ISD::isBuildVectorAllZeros(N1.getOperand(1).getNode()); // Ensure both shuffles have a zero input. - if ((ZeroN00 || ZeroN01) && (ZeroN10 || ZeroN11)) { + if ((ZeroN00 != ZeroN01) && (ZeroN10 != ZeroN11)) { assert((!ZeroN00 || !ZeroN01) && "Both inputs zero!"); assert((!ZeroN10 || !ZeroN11) && "Both inputs zero!"); const ShuffleVectorSDNode *SV0 = cast(N0); diff --git a/test/CodeGen/X86/pr32484.ll b/test/CodeGen/X86/pr32484.ll new file mode 100644 index 00000000000..74857f8d006 --- /dev/null +++ b/test/CodeGen/X86/pr32484.ll @@ -0,0 +1,32 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +define void @foo() { +; CHECK-LABEL: foo: +; CHECK: # BB#0: +; CHECK-NEXT: # implicit-def: %RAX +; CHECK-NEXT: jmpq *%rax +; CHECK-NEXT: .LBB0_1: +; CHECK-NEXT: # implicit-def: %RAX +; CHECK-NEXT: xorps %xmm0, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: movdqu %xmm1, (%rax) +; CHECK-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) # 16-byte Spill +; CHECK-NEXT: .LBB0_2: +; CHECK-NEXT: retq + indirectbr i8* undef, [label %9, label %1] + +;