diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h index 2ddaa7431d0322..392e22b683666e 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h @@ -743,7 +743,9 @@ class AArch64TargetLowering : public TargetLowering { if (!VT.isVector()) return hasAndNotCompare(Y); - return VT.getSizeInBits() >= 64; // vector 'bic' + TypeSize TS = VT.getSizeInBits(); + // TODO: We should be able to use bic/bif too for SVE. + return !TS.isScalable() && TS.getFixedValue() >= 64; // vector 'bic' } bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd( diff --git a/llvm/test/CodeGen/AArch64/vselect-constants.ll b/llvm/test/CodeGen/AArch64/vselect-constants.ll index 332d11029c1608..a11662fea7a5de 100644 --- a/llvm/test/CodeGen/AArch64/vselect-constants.ll +++ b/llvm/test/CodeGen/AArch64/vselect-constants.ll @@ -363,3 +363,21 @@ define <2 x i64> @not_signbit_mask_v2i64(<2 x i64> %a, <2 x i64> %b) { %r = select <2 x i1> %cond, <2 x i64> %b, <2 x i64> zeroinitializer ret <2 x i64> %r } + +; SVE + +define @signbit_mask_xor_nxv16i8( %a, %b) #0 { +; CHECK-LABEL: signbit_mask_xor_nxv16i8: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: cmplt p0.b, p0/z, z0.b, #0 +; CHECK-NEXT: eor z0.d, z0.d, z1.d +; CHECK-NEXT: mov z0.b, p0/m, #0 // =0x0 +; CHECK-NEXT: ret + %cond = icmp slt %a, zeroinitializer + %xor = xor %a, %b + %r = select %cond, zeroinitializer, %xor + ret %r +} + +attributes #0 = { "target-features"="+sve" }