forked from OSchip/llvm-project
[AArch64] Block tryCombineToBSL combines for vectors wider than NEON
There are no patterns for the AArch64ISD::BSP ISD node for anything other than NEON vectors at the moment. As a result, if we hit these combines for vectors wider than a NEON vector (such as what we might get with fixed length SVE) we will fail to lower. This patch simply prevents us from attempting the combines if the input vector type is too wide. Reviewed By: peterwaller-arm Differential Revision: https://reviews.llvm.org/D100961
This commit is contained in:
parent
ca70512099
commit
528ee161c9
|
@ -12592,6 +12592,11 @@ static SDValue tryCombineToBSL(SDNode *N,
|
||||||
if (!VT.isVector())
|
if (!VT.isVector())
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
||||||
|
// The combining code currently only works for NEON vectors. In particular,
|
||||||
|
// it does not work for SVE when dealing with vectors wider than 128 bits.
|
||||||
|
if (!VT.is64BitVector() && !VT.is128BitVector())
|
||||||
|
return SDValue();
|
||||||
|
|
||||||
SDValue N0 = N->getOperand(0);
|
SDValue N0 = N->getOperand(0);
|
||||||
if (N0.getOpcode() != ISD::AND)
|
if (N0.getOpcode() != ISD::AND)
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
; RUN: llc -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s
|
||||||
|
|
||||||
|
target triple = "aarch64"
|
||||||
|
|
||||||
|
;
|
||||||
|
; NOTE: SVE lowering for the BSP pseudoinst is not currently implemented, so we
|
||||||
|
; don't currently expect the code below to lower to BSL/BIT/BIF. Once
|
||||||
|
; this is implemented, this test will be fleshed out.
|
||||||
|
;
|
||||||
|
|
||||||
|
define <8 x i32> @fixed_bitselect_v8i32(<8 x i32>* %pre_cond_ptr, <8 x i32>* %left_ptr, <8 x i32>* %right_ptr) #0 {
|
||||||
|
; CHECK-LABEL: fixed_bitselect_v8i32:
|
||||||
|
; CHECK-NOT: bsl {{.*}}, {{.*}}, {{.*}}
|
||||||
|
; CHECK-NOT: bit {{.*}}, {{.*}}, {{.*}}
|
||||||
|
; CHECK-NOT: bif {{.*}}, {{.*}}, {{.*}}
|
||||||
|
; CHECK: ret
|
||||||
|
%pre_cond = load <8 x i32>, <8 x i32>* %pre_cond_ptr
|
||||||
|
%left = load <8 x i32>, <8 x i32>* %left_ptr
|
||||||
|
%right = load <8 x i32>, <8 x i32>* %right_ptr
|
||||||
|
|
||||||
|
%neg_cond = sub <8 x i32> zeroinitializer, %pre_cond
|
||||||
|
%min_cond = add <8 x i32> %pre_cond, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
|
||||||
|
%left_bits_0 = and <8 x i32> %neg_cond, %left
|
||||||
|
%right_bits_0 = and <8 x i32> %min_cond, %right
|
||||||
|
%bsl0000 = or <8 x i32> %right_bits_0, %left_bits_0
|
||||||
|
ret <8 x i32> %bsl0000
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes #0 = { "target-features"="+sve" }
|
Loading…
Reference in New Issue