mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
[CodeGen] Let computeKnownBits do something sensible for scalable vectors
Until we have a real need for computing known bits for scalable vectors I have simply changed the code to bail out for now and pretend we know nothing. I've also fixed up some simple callers of computeKnownBits too. Differential Revision: https://reviews.llvm.org/D80437
This commit is contained in:
@@ -2275,11 +2275,7 @@ bool SelectionDAG::SignBitIsZero(SDValue Op, unsigned Depth) const {
|
||||
/// for bits that V cannot have.
|
||||
bool SelectionDAG::MaskedValueIsZero(SDValue V, const APInt &Mask,
|
||||
unsigned Depth) const {
|
||||
EVT VT = V.getValueType();
|
||||
APInt DemandedElts = VT.isVector()
|
||||
? APInt::getAllOnesValue(VT.getVectorNumElements())
|
||||
: APInt(1, 1);
|
||||
return MaskedValueIsZero(V, Mask, DemandedElts, Depth);
|
||||
return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
|
||||
}
|
||||
|
||||
/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
|
||||
@@ -2548,6 +2544,14 @@ const APInt *SelectionDAG::getValidMaximumShiftAmountConstant(
|
||||
/// every vector element.
|
||||
KnownBits SelectionDAG::computeKnownBits(SDValue Op, unsigned Depth) const {
|
||||
EVT VT = Op.getValueType();
|
||||
|
||||
// TOOD: Until we have a plan for how to represent demanded elements for
|
||||
// scalable vectors, we can just bail out for now.
|
||||
if (Op.getValueType().isScalableVector()) {
|
||||
unsigned BitWidth = Op.getScalarValueSizeInBits();
|
||||
return KnownBits(BitWidth);
|
||||
}
|
||||
|
||||
APInt DemandedElts = VT.isVector()
|
||||
? APInt::getAllOnesValue(VT.getVectorNumElements())
|
||||
: APInt(1, 1);
|
||||
@@ -2563,6 +2567,11 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
|
||||
KnownBits Known(BitWidth); // Don't know anything.
|
||||
|
||||
// TOOD: Until we have a plan for how to represent demanded elements for
|
||||
// scalable vectors, we can just bail out for now.
|
||||
if (Op.getValueType().isScalableVector())
|
||||
return Known;
|
||||
|
||||
if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
// We know all of the bits for a constant!
|
||||
Known.One = C->getAPIntValue();
|
||||
|
||||
+4
-1
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
; PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>] -> 32-bit indexes
|
||||
define void @llvm_aarch64_sve_prfb_gather_uxtw_index_nx4vi32(<vscale x 4 x i1> %Pg, i8* %base, <vscale x 4 x i32> %indexes) nounwind {
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+f64mm -asm-verbose=0 < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+f64mm -asm-verbose=0 < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; LD1ROB
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; ST1H, ST1W, ST1D: base + 32-bit scaled offset, sign (sxtw) or zero
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; ST1B, ST1W, ST1H, ST1D: base + 32-bit unscaled offset, sign (sxtw) or zero
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -asm-verbose=0 < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -asm-verbose=0 < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; Masked Loads
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; Masked Loads
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -asm-verbose=0 < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -asm-verbose=0 < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; Masked Stores
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
;
|
||||
; Masked Loads
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
; Range checks: for all the instruction tested in this file, the
|
||||
; immediate must be within the range [-8, 7] (4-bit immediate). Out of
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
; 2-lane contiguous load/stores
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s
|
||||
; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
|
||||
|
||||
; WARN-NOT: warning
|
||||
|
||||
; Ensure we use the inverted CC result of SVE compare instructions when branching.
|
||||
define void @sve_cmplt_setcc_inverted(<vscale x 8 x i16>* %out, <vscale x 8 x i16> %in, <vscale x 8 x i1> %pg) {
|
||||
|
||||
@@ -98,6 +98,25 @@ TEST_F(AArch64SelectionDAGTest, computeKnownBits_ZERO_EXTEND_VECTOR_INREG) {
|
||||
EXPECT_TRUE(Known.isZero());
|
||||
}
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, computeKnownBitsSVE_ZERO_EXTEND_VECTOR_INREG) {
|
||||
if (!TM)
|
||||
return;
|
||||
SDLoc Loc;
|
||||
auto Int8VT = EVT::getIntegerVT(Context, 8);
|
||||
auto Int16VT = EVT::getIntegerVT(Context, 16);
|
||||
auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
|
||||
auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2, true);
|
||||
auto InVec = DAG->getConstant(0, Loc, InVecVT);
|
||||
auto Op = DAG->getNode(ISD::ZERO_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec);
|
||||
auto DemandedElts = APInt(2, 3);
|
||||
KnownBits Known = DAG->computeKnownBits(Op, DemandedElts);
|
||||
|
||||
// We don't know anything for SVE at the moment.
|
||||
EXPECT_EQ(Known.Zero, APInt(16, 0u));
|
||||
EXPECT_EQ(Known.One, APInt(16, 0u));
|
||||
EXPECT_FALSE(Known.isZero());
|
||||
}
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, computeKnownBits_EXTRACT_SUBVECTOR) {
|
||||
if (!TM)
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user