diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp @@ -183,12 +183,10 @@ case AArch64ISD::DUP: case ISD::SPLAT_VECTOR: { auto Opnd0 = N->getOperand(0); - if (auto CN = dyn_cast(Opnd0)) - if (CN->isZero()) - return true; - if (auto CN = dyn_cast(Opnd0)) - if (CN->isZero()) - return true; + if (isNullConstant(Opnd0)) + return true; + if (isNullFPConstant(Opnd0)) + return true; break; } default: @@ -203,12 +201,10 @@ case AArch64ISD::DUP: case ISD::SPLAT_VECTOR: { auto Opnd0 = N->getOperand(0); - if (auto CN = dyn_cast(Opnd0)) - if (CN->isZero()) - return true; - if (auto CN = dyn_cast(Opnd0)) - if (CN->isZero()) - return true; + if (isNullConstant(Opnd0)) + return true; + if (isNullFPConstant(Opnd0)) + return true; break; } } diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -2693,9 +2693,7 @@ return false; auto Opnd0 = N->getOperand(0); - auto *CINT = dyn_cast(Opnd0); - auto *CFP = dyn_cast(Opnd0); - return (CINT && CINT->isZero()) || (CFP && CFP->isZero()); + return isNullConstant(Opnd0) || isNullFPConstant(Opnd0); } /// changeIntCCToAArch64CC - Convert a DAG integer condition code to an AArch64 diff --git a/llvm/test/CodeGen/AArch64/sve-vselect-imm.ll b/llvm/test/CodeGen/AArch64/sve-vselect-imm.ll --- a/llvm/test/CodeGen/AArch64/sve-vselect-imm.ll +++ b/llvm/test/CodeGen/AArch64/sve-vselect-imm.ll @@ -360,6 +360,78 @@ ret %sel } +define @sel_merge_nxv8f16_negative_zero( %p, %in) { +; CHECK-LABEL: sel_merge_nxv8f16_negative_zero: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #32768 +; CHECK-NEXT: mov z1.h, w8 +; CHECK-NEXT: mov z0.h, p0/m, z1.h +; CHECK-NEXT: ret +%vec = shufflevector insertelement ( undef, half -0.0, i32 0), zeroinitializer, zeroinitializer +%sel = select %p, %vec, %in +ret %sel +} + +define @sel_merge_nx4f16_negative_zero( %p, %in) { +; CHECK-LABEL: sel_merge_nx4f16_negative_zero: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #32768 +; CHECK-NEXT: mov z1.h, w8 +; CHECK-NEXT: mov z0.s, p0/m, z1.s +; CHECK-NEXT: ret +%vec = shufflevector insertelement ( undef, half -0.0, i32 0), zeroinitializer, zeroinitializer +%sel = select %p, %vec, %in +ret %sel +} + +define @sel_merge_nx2f16_negative_zero( %p, %in) { +; CHECK-LABEL: sel_merge_nx2f16_negative_zero: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #32768 +; CHECK-NEXT: mov z1.h, w8 +; CHECK-NEXT: mov z0.d, p0/m, z1.d +; CHECK-NEXT: ret +%vec = shufflevector insertelement ( undef, half -0.0, i32 0), zeroinitializer, zeroinitializer +%sel = select %p, %vec, %in +ret %sel +} + +define @sel_merge_nx4f32_negative_zero( %p, %in) { +; CHECK-LABEL: sel_merge_nx4f32_negative_zero: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #-2147483648 +; CHECK-NEXT: mov z1.s, w8 +; CHECK-NEXT: mov z0.s, p0/m, z1.s +; CHECK-NEXT: ret +%vec = shufflevector insertelement ( undef, float -0.0, i32 0), zeroinitializer, zeroinitializer +%sel = select %p, %vec, %in +ret %sel +} + +define @sel_merge_nx2f32_negative_zero( %p, %in) { +; CHECK-LABEL: sel_merge_nx2f32_negative_zero: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #-2147483648 +; CHECK-NEXT: mov z1.s, w8 +; CHECK-NEXT: mov z0.d, p0/m, z1.d +; CHECK-NEXT: ret +%vec = shufflevector insertelement ( undef, float -0.0, i32 0), zeroinitializer, zeroinitializer +%sel = select %p, %vec, %in +ret %sel +} + +define @sel_merge_nx2f64_negative_zero( %p, %in) { +; CHECK-LABEL: sel_merge_nx2f64_negative_zero: +; CHECK: // %bb.0: +; CHECK-NEXT: mov x8, #-9223372036854775808 +; CHECK-NEXT: mov z1.d, x8 +; CHECK-NEXT: mov z0.d, p0/m, z1.d +; CHECK-NEXT: ret +%vec = shufflevector insertelement ( undef, double -0.0, i32 0), zeroinitializer, zeroinitializer +%sel = select %p, %vec, %in +ret %sel +} + define @sel_merge_16_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_16_shifted: ; CHECK: // %bb.0: