diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -27038,7 +27038,7 @@ // Avoid false dependency. if (PassThru.isUndef()) - PassThru = DAG.getConstant(0, dl, VT); + PassThru = getZeroVector(VT, Subtarget, DAG, dl); return DAG.getNode(IntrData->Opc0, dl, VT, DataToCompress, PassThru, Mask); diff --git a/llvm/test/CodeGen/X86/compress-undef-float-passthrough.ll b/llvm/test/CodeGen/X86/compress-undef-float-passthrough.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/compress-undef-float-passthrough.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-- -mattr=avx512f,avx512vl | FileCheck %s --check-prefix=CHECK + +define void @test_compress_undef_float_passthrough() { +; CHECK-LABEL: test_compress_undef_float_passthrough: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: movb $5, %al +; CHECK-NEXT: kmovw %eax, %k1 +; CHECK-NEXT: vcompresspd %ymm0, %ymm0 {%k1} {z} +; CHECK-NEXT: vscatterqpd %ymm0, (,%ymm0) {%k1} +; CHECK-NEXT: vzeroupper +; CHECK-NEXT: retq +entry: ; preds = %loop.50 + %0 = bitcast i4 undef to <4 x i1> + %1 = call <4 x double> @llvm.x86.avx512.mask.compress.v4f64(<4 x double> undef, <4 x double> undef, <4 x i1> ) + call void @llvm.masked.scatter.v4f64.v4p0f64(<4 x double> %1, <4 x double*> undef, i32 0, <4 x i1> %0) + ret void +} + +; Function Attrs: nounwind readnone +declare <4 x double> @llvm.x86.avx512.mask.compress.v4f64(<4 x double>, <4 x double>, <4 x i1>) + +; Function Attrs: nocallback nofree nosync nounwind willreturn writeonly +declare void @llvm.masked.scatter.v4f64.v4p0f64(<4 x double>, <4 x double*>, i32 immarg, <4 x i1>) +