diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -9413,9 +9413,9 @@ bool refineIndexType(MaskedScatterSDNode *MSC, SDValue &Index, bool Scaled, SelectionDAG &DAG) { const TargetLowering &TLI = DAG.getTargetLoweringInfo(); - SDValue Op = Index.getOperand(0); if (Index.getOpcode() == ISD::ZERO_EXTEND) { + SDValue Op = Index.getOperand(0); MSC->setIndexType(Scaled ? ISD::UNSIGNED_SCALED : ISD::UNSIGNED_UNSCALED); if (TLI.shouldRemoveExtendFromGSIndex(Op.getValueType())) { Index = Op; @@ -9424,6 +9424,7 @@ } if (Index.getOpcode() == ISD::SIGN_EXTEND) { + SDValue Op = Index.getOperand(0); MSC->setIndexType(Scaled ? ISD::SIGNED_SCALED : ISD::SIGNED_UNSCALED); if (TLI.shouldRemoveExtendFromGSIndex(Op.getValueType())) { Index = Op; diff --git a/llvm/test/CodeGen/X86/combine-undef-index-mscatter.ll b/llvm/test/CodeGen/X86/combine-undef-index-mscatter.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/combine-undef-index-mscatter.ll @@ -0,0 +1,37 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s + +define void @main(<24 x float*> %x) +; CHECK-LABEL: main: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vmovq %rcx, %xmm0 +; CHECK-NEXT: vmovq %rdx, %xmm1 +; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] +; CHECK-NEXT: vmovq %rsi, %xmm1 +; CHECK-NEXT: vmovq %rdi, %xmm2 +; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] +; CHECK-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 +; CHECK-NEXT: vmovq %r9, %xmm1 +; CHECK-NEXT: vmovq %r8, %xmm2 +; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] +; CHECK-NEXT: vinserti128 $1, {{[0-9]+}}(%rsp), %ymm1, %ymm1 +; CHECK-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 +; CHECK-NEXT: vmovups {{[0-9]+}}(%rsp), %zmm1 +; CHECK-NEXT: vmovups {{[0-9]+}}(%rsp), %zmm2 +; CHECK-NEXT: kxnorw %k0, %k0, %k1 +; CHECK-NEXT: vbroadcastf128 {{.*#+}} ymm3 = [8.33005607E-1,8.435871E-1,1.69435993E-1,8.33005607E-1,8.33005607E-1,8.435871E-1,1.69435993E-1,8.33005607E-1] +; CHECK-NEXT: # ymm3 = mem[0,1,0,1] +; CHECK-NEXT: kxnorw %k0, %k0, %k2 +; CHECK-NEXT: vscatterqps %ymm3, (,%zmm0) {%k2} +; CHECK-NEXT: kxnorw %k0, %k0, %k2 +; CHECK-NEXT: vscatterqps %ymm3, (,%zmm2) {%k2} +; CHECK-NEXT: vscatterqps %ymm3, (,%zmm1) {%k1} +; CHECK-NEXT: vzeroupper +; CHECK-NEXT: retq +{ +entry: + call void @llvm.masked.scatter.v24f32.v24p0f32(<24 x float> , <24 x float*> %x, i32 4, <24 x i1> ) + ret void +} + +declare void @llvm.masked.scatter.v24f32.v24p0f32(<24 x float>, <24 x float*>, i32 immarg, <24 x i1>)