From 4a83ce1e3c75903c84b941a633739850cc6f87be Mon Sep 17 00:00:00 2001 From: David Sherwood Date: Fri, 21 Aug 2020 10:59:29 +0100 Subject: [PATCH] [SVE][CodeGen] Fix up warnings in sve-split-insert/extract tests I have fixed up some more ElementCount/TypeSize related warnings in the following tests: CodeGen/AArch64/sve-split-extract-elt.ll CodeGen/AArch64/sve-split-insert-elt.ll In SelectionDAG::CreateStackTemporary we were relying upon the implicit cast from TypeSize -> uint64_t when calling MachineFrameInfo::CreateStackObject. I've fixed this by passing in the known minimum size instead, which I believe is fine because the associated stack id indicates whether this is a scalable object or not. I've also fixed up a case in TargetLowering::SimplifyDemandedBits when extracting a vector element from a scalable vector. The result is a scalar, hence it wasn't caught at the start of the function. If the vector is scalable we just bail out for now. Differential Revision: https://reviews.llvm.org/D86431 --- include/llvm/Support/TypeSize.h | 9 +++++++++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 4 +++- lib/CodeGen/SelectionDAG/TargetLowering.cpp | 6 +++++- test/CodeGen/AArch64/sve-split-extract-elt.ll | 6 +++++- test/CodeGen/AArch64/sve-split-insert-elt.ll | 6 +++++- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/llvm/Support/TypeSize.h b/include/llvm/Support/TypeSize.h index b6392e61db4..a0b8fbde25a 100644 --- a/include/llvm/Support/TypeSize.h +++ b/include/llvm/Support/TypeSize.h @@ -116,6 +116,15 @@ public: unsigned getKnownMinValue() const { return Min; } + // Return the minimum value with the assumption that the count is exact. + // Use in places where a scalable count doesn't make sense (e.g. non-vector + // types, or vectors in backends which don't support scalable vectors). + unsigned getFixedValue() const { + assert(!Scalable && + "Request for a fixed element count on a scalable object"); + return Min; + } + bool isScalable() const { return Scalable; } }; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index ff6c642e3d4..73e042c4754 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2030,7 +2030,9 @@ SDValue SelectionDAG::CreateStackTemporary(TypeSize Bytes, Align Alignment) { int StackID = 0; if (Bytes.isScalable()) StackID = TFI->getStackIDForScalableVectors(); - int FrameIdx = MFI.CreateStackObject(Bytes, Alignment, + // The stack id gives an indication of whether the object is scalable or + // not, so it's safe to pass in the minimum size here. + int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinSize(), Alignment, false, nullptr, StackID); return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout())); } diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index a7816b8616e..ae98edb7446 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -2022,10 +2022,14 @@ bool TargetLowering::SimplifyDemandedBits( case ISD::EXTRACT_VECTOR_ELT: { SDValue Src = Op.getOperand(0); SDValue Idx = Op.getOperand(1); - unsigned NumSrcElts = Src.getValueType().getVectorNumElements(); + ElementCount SrcEltCnt = Src.getValueType().getVectorElementCount(); unsigned EltBitWidth = Src.getScalarValueSizeInBits(); + if (SrcEltCnt.isScalable()) + return false; + // Demand the bits from every vector element without a constant index. + unsigned NumSrcElts = SrcEltCnt.getFixedValue(); APInt DemandedSrcElts = APInt::getAllOnesValue(NumSrcElts); if (auto *CIdx = dyn_cast(Idx)) if (CIdx->getAPIntValue().ult(NumSrcElts)) diff --git a/test/CodeGen/AArch64/sve-split-extract-elt.ll b/test/CodeGen/AArch64/sve-split-extract-elt.ll index e0d99d57d8e..aa01dae0551 100644 --- a/test/CodeGen/AArch64/sve-split-extract-elt.ll +++ b/test/CodeGen/AArch64/sve-split-extract-elt.ll @@ -1,5 +1,9 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; 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 + +; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. +; WARN-NOT: warning ; EXTRACT VECTOR ELT diff --git a/test/CodeGen/AArch64/sve-split-insert-elt.ll b/test/CodeGen/AArch64/sve-split-insert-elt.ll index 5e6dedf4a4c..cb998730d2b 100644 --- a/test/CodeGen/AArch64/sve-split-insert-elt.ll +++ b/test/CodeGen/AArch64/sve-split-insert-elt.ll @@ -1,5 +1,9 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; 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 + +; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. +; WARN-NOT: warning ; INSERT VECTOR ELT