1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8#include "llvm/Support/TypeSize.h"
9#include "gtest/gtest.h"
10
11using namespace llvm;
12
13namespace {
14
15constexpr ElementCount CEElementCount = ElementCount();
16
17static_assert(!CEElementCount.isScalar());
18static_assert(!CEElementCount.isVector());
19
20constexpr ElementCount CEElementCountFixed1 = ElementCount::getFixed(MinVal: 1);
21static_assert(CEElementCountFixed1.isScalar());
22static_assert(!CEElementCountFixed1.isVector());
23static_assert(!CEElementCountFixed1.isScalable());
24
25constexpr ElementCount CEElementCountFixed3 = ElementCount::getFixed(MinVal: 3);
26constexpr ElementCount CEElementCountFixed4 = ElementCount::getFixed(MinVal: 4);
27
28static_assert(!CEElementCountFixed4.isScalar());
29static_assert(CEElementCountFixed4.isVector());
30static_assert(CEElementCountFixed4.isKnownEven());
31static_assert(!CEElementCountFixed3.isKnownEven());
32static_assert(!CEElementCountFixed4.isScalable());
33static_assert(!CEElementCountFixed3.isScalable());
34
35constexpr ElementCount CEElementCountScalable4 = ElementCount::getScalable(MinVal: 4);
36
37static_assert(CEElementCountScalable4.isScalable());
38static_assert(!ElementCount().isScalable());
39static_assert(
40 CEElementCountScalable4.hasKnownScalarFactor(RHS: ElementCount::getScalable(MinVal: 2)));
41static_assert(ElementCount::getScalable(MinVal: 8).getKnownScalarFactor(
42 RHS: ElementCount::getScalable(MinVal: 2)) == 4);
43
44static_assert(CEElementCountScalable4 == ElementCount::get(MinVal: 4, Scalable: true));
45static_assert(CEElementCountFixed4 == ElementCount::get(MinVal: 4, Scalable: false));
46static_assert(ElementCount::isKnownLT(LHS: CEElementCountFixed3,
47 RHS: CEElementCountFixed4));
48static_assert(ElementCount::isKnownLE(LHS: CEElementCountFixed3,
49 RHS: CEElementCountFixed4));
50static_assert(ElementCount::isKnownGT(LHS: CEElementCountFixed4,
51 RHS: CEElementCountFixed3));
52static_assert(ElementCount::isKnownGE(LHS: CEElementCountFixed4,
53 RHS: CEElementCountFixed3));
54static_assert(CEElementCountFixed3.coefficientNextPowerOf2() ==
55 CEElementCountFixed4);
56static_assert(ElementCount::getFixed(MinVal: 8).divideCoefficientBy(RHS: 2) ==
57 ElementCount::getFixed(MinVal: 4));
58static_assert(ElementCount::getFixed(MinVal: 8).multiplyCoefficientBy(RHS: 3) ==
59 ElementCount::getFixed(MinVal: 24));
60static_assert(ElementCount::getFixed(MinVal: 8).isKnownMultipleOf(RHS: 2));
61
62constexpr TypeSize TSFixed0 = TypeSize::getFixed(ExactSize: 0);
63constexpr TypeSize TSFixed1 = TypeSize::getFixed(ExactSize: 1);
64constexpr TypeSize TSFixed32 = TypeSize::getFixed(ExactSize: 32);
65
66static_assert(TSFixed0.getFixedValue() == 0);
67static_assert(TSFixed1.getFixedValue() == 1);
68static_assert(TSFixed32.getFixedValue() == 32);
69static_assert(TSFixed32.getKnownMinValue() == 32);
70
71static_assert(TypeSize::getScalable(MinimumSize: 32).getKnownMinValue() == 32);
72
73static_assert(TSFixed32 * 2 == TypeSize::getFixed(ExactSize: 64));
74static_assert(TSFixed32 * 2u == TypeSize::getFixed(ExactSize: 64));
75static_assert(TSFixed32 * INT64_C(2) == TypeSize::getFixed(ExactSize: 64));
76static_assert(TSFixed32 * UINT64_C(2) == TypeSize::getFixed(ExactSize: 64));
77
78static_assert(2 * TSFixed32 == TypeSize::getFixed(ExactSize: 64));
79static_assert(2u * TSFixed32 == TypeSize::getFixed(ExactSize: 64));
80static_assert(INT64_C(2) * TSFixed32 == TypeSize::getFixed(ExactSize: 64));
81static_assert(UINT64_C(2) * TSFixed32 == TypeSize::getFixed(ExactSize: 64));
82static_assert(alignTo(Size: TypeSize::getFixed(ExactSize: 7), Align: 8) == TypeSize::getFixed(ExactSize: 8));
83
84static_assert(TypeSize::getZero() == TypeSize::getFixed(ExactSize: 0));
85static_assert(TypeSize::getZero() != TypeSize::getScalable(MinimumSize: 0));
86static_assert(TypeSize::getFixed(ExactSize: 0) != TypeSize::getScalable(MinimumSize: 0));
87static_assert(TypeSize::getFixed(ExactSize: 0).isZero());
88static_assert(TypeSize::getScalable(MinimumSize: 0).isZero());
89static_assert(TypeSize::getZero().isZero());
90static_assert(TypeSize::getFixed(ExactSize: 0) ==
91 (TypeSize::getFixed(ExactSize: 4) - TypeSize::getFixed(ExactSize: 4)));
92static_assert(TypeSize::getScalable(MinimumSize: 0) ==
93 (TypeSize::getScalable(MinimumSize: 4) - TypeSize::getScalable(MinimumSize: 4)));
94static_assert(TypeSize::getFixed(ExactSize: 0) + TypeSize::getScalable(MinimumSize: 8) ==
95 TypeSize::getScalable(MinimumSize: 8));
96static_assert(TypeSize::getScalable(MinimumSize: 8) + TypeSize::getFixed(ExactSize: 0) ==
97 TypeSize::getScalable(MinimumSize: 8));
98static_assert(TypeSize::getFixed(ExactSize: 8) + TypeSize::getScalable(MinimumSize: 0) ==
99 TypeSize::getFixed(ExactSize: 8));
100static_assert(TypeSize::getScalable(MinimumSize: 0) + TypeSize::getFixed(ExactSize: 8) ==
101 TypeSize::getFixed(ExactSize: 8));
102static_assert(TypeSize::getScalable(MinimumSize: 8) - TypeSize::getFixed(ExactSize: 0) ==
103 TypeSize::getScalable(MinimumSize: 8));
104static_assert(TypeSize::getFixed(ExactSize: 8) - TypeSize::getScalable(MinimumSize: 0) ==
105 TypeSize::getFixed(ExactSize: 8));
106
107TEST(TypeSize, FailIncompatibleTypes) {
108 EXPECT_DEBUG_DEATH(TypeSize::getFixed(8) + TypeSize::getScalable(8),
109 "Incompatible types");
110}
111
112} // namespace
113

source code of llvm/unittests/Support/TypeSizeTest.cpp