//===-------- llvm/unittest/CodeGen/ScalableVectorMVTsTest.cpp ------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGenTypes/MachineValueType.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Support/TypeSize.h"
#include "gtest/gtest.h"

using namespace llvm;

namespace {

TEST(ScalableVectorMVTsTest, IntegerMVTs) {
  for (MVT VecTy : MVT::integer_scalable_vector_valuetypes()) {
    ASSERT_TRUE(VecTy.isValid());
    ASSERT_TRUE(VecTy.isInteger());
    ASSERT_TRUE(VecTy.isVector());
    ASSERT_TRUE(VecTy.isScalableVector());
    ASSERT_TRUE(VecTy.getScalarType().isValid());

    ASSERT_FALSE(VecTy.isFloatingPoint());
  }
}

TEST(ScalableVectorMVTsTest, FloatMVTs) {
  for (MVT VecTy : MVT::fp_scalable_vector_valuetypes()) {
    ASSERT_TRUE(VecTy.isValid());
    ASSERT_TRUE(VecTy.isFloatingPoint());
    ASSERT_TRUE(VecTy.isVector());
    ASSERT_TRUE(VecTy.isScalableVector());
    ASSERT_TRUE(VecTy.getScalarType().isValid());

    ASSERT_FALSE(VecTy.isInteger());
  }
}

TEST(ScalableVectorMVTsTest, HelperFuncs) {
  LLVMContext Ctx;

  // Create with scalable flag
  EVT Vnx4i32 = EVT::getVectorVT(Ctx, MVT::i32, 4, /*Scalable=*/true);
  ASSERT_TRUE(Vnx4i32.isScalableVector());

  // Create with separate llvm::ElementCount
  auto EltCnt = ElementCount::getScalable(2);
  EVT Vnx2i32 = EVT::getVectorVT(Ctx, MVT::i32, EltCnt);
  ASSERT_TRUE(Vnx2i32.isScalableVector());

  // Create with inline llvm::ElementCount
  EVT Vnx2i64 = EVT::getVectorVT(Ctx, MVT::i64, ElementCount::getScalable(2));
  ASSERT_TRUE(Vnx2i64.isScalableVector());

  // Check that changing scalar types/element count works
  EXPECT_EQ(Vnx2i32.widenIntegerVectorElementType(Ctx), Vnx2i64);
  EXPECT_EQ(Vnx4i32.getHalfNumVectorElementsVT(Ctx), Vnx2i32);

  // Check that operators work
  EXPECT_EQ(EVT::getVectorVT(Ctx, MVT::i64, EltCnt * 2), MVT::nxv4i64);
  EXPECT_EQ(EVT::getVectorVT(Ctx, MVT::i64, EltCnt.divideCoefficientBy(2)),
            MVT::nxv1i64);

  // Check that float->int conversion works
  EVT Vnx2f64 = EVT::getVectorVT(Ctx, MVT::f64, ElementCount::getScalable(2));
  EXPECT_EQ(Vnx2f64.changeTypeToInteger(), Vnx2i64);

  // Check fields inside llvm::ElementCount
  EltCnt = Vnx4i32.getVectorElementCount();
  EXPECT_EQ(EltCnt.getKnownMinValue(), 4U);
  ASSERT_TRUE(EltCnt.isScalable());

  // Check that fixed-length vector types aren't scalable.
  EVT V8i32 = EVT::getVectorVT(Ctx, MVT::i32, 8);
  ASSERT_FALSE(V8i32.isScalableVector());
  EVT V4f64 = EVT::getVectorVT(Ctx, MVT::f64, ElementCount::getFixed(4));
  ASSERT_FALSE(V4f64.isScalableVector());

  // Check that llvm::ElementCount works for fixed-length types.
  EltCnt = V8i32.getVectorElementCount();
  EXPECT_EQ(EltCnt.getKnownMinValue(), 8U);
  ASSERT_FALSE(EltCnt.isScalable());
}

TEST(ScalableVectorMVTsTest, IRToVTTranslation) {
  LLVMContext Ctx;

  Type *Int64Ty = Type::getInt64Ty(Ctx);
  VectorType *ScV8Int64Ty =
      VectorType::get(Int64Ty, ElementCount::getScalable(8));

  // Check that we can map a scalable IR type to an MVT 
  MVT Mnxv8i64 = MVT::getVT(ScV8Int64Ty);
  ASSERT_TRUE(Mnxv8i64.isScalableVector());
  ASSERT_EQ(ScV8Int64Ty->getElementCount(), Mnxv8i64.getVectorElementCount());
  ASSERT_EQ(MVT::getVT(ScV8Int64Ty->getElementType()),
            Mnxv8i64.getScalarType());

  // Check that we can map a scalable IR type to an EVT
  EVT Enxv8i64 = EVT::getEVT(ScV8Int64Ty);
  ASSERT_TRUE(Enxv8i64.isScalableVector());
  ASSERT_EQ(ScV8Int64Ty->getElementCount(), Enxv8i64.getVectorElementCount());
  ASSERT_EQ(EVT::getEVT(ScV8Int64Ty->getElementType()),
            Enxv8i64.getScalarType());
}

TEST(ScalableVectorMVTsTest, VTToIRTranslation) {
  LLVMContext Ctx;

  EVT Enxv4f64 = EVT::getVectorVT(Ctx, MVT::f64, ElementCount::getScalable(4));

  Type *Ty = Enxv4f64.getTypeForEVT(Ctx);
  VectorType *ScV4Float64Ty = cast<VectorType>(Ty);
  ASSERT_TRUE(isa<ScalableVectorType>(ScV4Float64Ty));
  ASSERT_EQ(Enxv4f64.getVectorElementCount(), ScV4Float64Ty->getElementCount());
  ASSERT_EQ(Enxv4f64.getScalarType().getTypeForEVT(Ctx),
            ScV4Float64Ty->getElementType());
}

TEST(ScalableVectorMVTsTest, SizeQueries) {
  LLVMContext Ctx;

  EVT nxv4i32 = EVT::getVectorVT(Ctx, MVT::i32, 4, /*Scalable=*/ true);
  EVT nxv2i32 = EVT::getVectorVT(Ctx, MVT::i32, 2, /*Scalable=*/ true);
  EVT nxv2i64 = EVT::getVectorVT(Ctx, MVT::i64, 2, /*Scalable=*/ true);
  EVT nxv2f64 = EVT::getVectorVT(Ctx, MVT::f64, 2, /*Scalable=*/ true);

  EVT v4i32 = EVT::getVectorVT(Ctx, MVT::i32, 4);
  EVT v2i32 = EVT::getVectorVT(Ctx, MVT::i32, 2);
  EVT v2i64 = EVT::getVectorVT(Ctx, MVT::i64, 2);
  EVT v2f64 = EVT::getVectorVT(Ctx, MVT::f64, 2);

  EVT nxv5i32 = EVT::getVectorVT(Ctx, MVT::i32, 5, /*Scalable=*/true);
  ASSERT_FALSE(nxv5i32.is16BitVector());
  ASSERT_FALSE(nxv5i32.is32BitVector());
  ASSERT_FALSE(nxv5i32.is64BitVector());
  ASSERT_FALSE(nxv5i32.is128BitVector());
  ASSERT_FALSE(nxv5i32.is256BitVector());
  ASSERT_FALSE(nxv5i32.is512BitVector());
  ASSERT_FALSE(nxv5i32.is1024BitVector());
  ASSERT_FALSE(nxv5i32.is2048BitVector());

  // Check equivalence and ordering on scalable types.
  EXPECT_EQ(nxv4i32.getSizeInBits(), nxv2i64.getSizeInBits());
  EXPECT_EQ(nxv2f64.getSizeInBits(), nxv2i64.getSizeInBits());
  EXPECT_NE(nxv2i32.getSizeInBits(), nxv4i32.getSizeInBits());
  EXPECT_LT(nxv2i32.getSizeInBits().getKnownMinValue(),
            nxv2i64.getSizeInBits().getKnownMinValue());
  EXPECT_LE(nxv4i32.getSizeInBits().getKnownMinValue(),
            nxv2i64.getSizeInBits().getKnownMinValue());
  EXPECT_GT(nxv4i32.getSizeInBits().getKnownMinValue(),
            nxv2i32.getSizeInBits().getKnownMinValue());
  EXPECT_GE(nxv2i64.getSizeInBits().getKnownMinValue(),
            nxv4i32.getSizeInBits().getKnownMinValue());

  // Check equivalence and ordering on fixed types.
  EXPECT_EQ(v4i32.getSizeInBits(), v2i64.getSizeInBits());
  EXPECT_EQ(v2f64.getSizeInBits(), v2i64.getSizeInBits());
  EXPECT_NE(v2i32.getSizeInBits(), v4i32.getSizeInBits());
  EXPECT_LT(v2i32.getFixedSizeInBits(), v2i64.getFixedSizeInBits());
  EXPECT_LE(v4i32.getFixedSizeInBits(), v2i64.getFixedSizeInBits());
  EXPECT_GT(v4i32.getFixedSizeInBits(), v2i32.getFixedSizeInBits());
  EXPECT_GE(v2i64.getFixedSizeInBits(), v4i32.getFixedSizeInBits());

  // Check that scalable and non-scalable types with the same minimum size
  // are not considered equal.
  ASSERT_TRUE(v4i32.getSizeInBits() != nxv4i32.getSizeInBits());
  ASSERT_FALSE(v2i64.getSizeInBits() == nxv2f64.getSizeInBits());

  // Check that we can obtain a known-exact size from a non-scalable type.
  EXPECT_EQ(v4i32.getFixedSizeInBits(), 128U);
  EXPECT_EQ(v2i64.getFixedSizeInBits(), 128U);

  // Check that we can query the known minimum size for both scalable and
  // fixed length types.
  EXPECT_EQ(nxv2i32.getSizeInBits().getKnownMinValue(), 64U);
  EXPECT_EQ(nxv2f64.getSizeInBits().getKnownMinValue(), 128U);
  EXPECT_EQ(v2i32.getSizeInBits().getKnownMinValue(),
            nxv2i32.getSizeInBits().getKnownMinValue());

  // Check scalable property.
  ASSERT_FALSE(v4i32.getSizeInBits().isScalable());
  ASSERT_TRUE(nxv4i32.getSizeInBits().isScalable());

  // Check convenience size scaling methods.
  EXPECT_EQ(v2i32.getSizeInBits() * 2, v4i32.getSizeInBits());
  EXPECT_EQ(2 * nxv2i32.getSizeInBits(), nxv4i32.getSizeInBits());
  EXPECT_EQ(nxv2f64.getSizeInBits().divideCoefficientBy(2),
            nxv2i32.getSizeInBits());
}

} // end anonymous namespace
