1//===- InferIntRangeInterfaceTest.cpp - Unit Tests for InferIntRange... --===//
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
9#include "mlir/Interfaces/InferIntRangeInterface.h"
10#include "llvm/ADT/APInt.h"
11#include <limits>
12
13#include <gtest/gtest.h>
14
15using namespace mlir;
16
17TEST(IntRangeAttrs, BasicConstructors) {
18 APInt zero = APInt::getZero(numBits: 64);
19 APInt two(64, 2);
20 APInt three(64, 3);
21 ConstantIntRanges boundedAbove(zero, two, zero, three);
22 EXPECT_EQ(boundedAbove.umin(), zero);
23 EXPECT_EQ(boundedAbove.umax(), two);
24 EXPECT_EQ(boundedAbove.smin(), zero);
25 EXPECT_EQ(boundedAbove.smax(), three);
26}
27
28TEST(IntRangeAttrs, FromUnsigned) {
29 APInt zero = APInt::getZero(numBits: 64);
30 APInt maxInt = APInt::getSignedMaxValue(numBits: 64);
31 APInt minInt = APInt::getSignedMinValue(numBits: 64);
32 APInt minIntPlusOne = minInt + 1;
33
34 ConstantIntRanges canPortToSigned =
35 ConstantIntRanges::fromUnsigned(umin: zero, umax: maxInt);
36 EXPECT_EQ(canPortToSigned.smin(), zero);
37 EXPECT_EQ(canPortToSigned.smax(), maxInt);
38
39 ConstantIntRanges cantPortToSigned =
40 ConstantIntRanges::fromUnsigned(umin: zero, umax: minInt);
41 EXPECT_EQ(cantPortToSigned.smin(), minInt);
42 EXPECT_EQ(cantPortToSigned.smax(), maxInt);
43
44 ConstantIntRanges signedNegative =
45 ConstantIntRanges::fromUnsigned(umin: minInt, umax: minIntPlusOne);
46 EXPECT_EQ(signedNegative.smin(), minInt);
47 EXPECT_EQ(signedNegative.smax(), minIntPlusOne);
48}
49
50TEST(IntRangeAttrs, FromSigned) {
51 APInt zero = APInt::getZero(numBits: 64);
52 APInt one = zero + 1;
53 APInt negOne = zero - 1;
54 APInt intMax = APInt::getSignedMaxValue(numBits: 64);
55 APInt intMin = APInt::getSignedMinValue(numBits: 64);
56 APInt uintMax = APInt::getMaxValue(numBits: 64);
57
58 ConstantIntRanges noUnsignedBound =
59 ConstantIntRanges::fromSigned(smin: negOne, smax: one);
60 EXPECT_EQ(noUnsignedBound.umin(), zero);
61 EXPECT_EQ(noUnsignedBound.umax(), uintMax);
62
63 ConstantIntRanges positive = ConstantIntRanges::fromSigned(smin: one, smax: intMax);
64 EXPECT_EQ(positive.umin(), one);
65 EXPECT_EQ(positive.umax(), intMax);
66
67 ConstantIntRanges negative = ConstantIntRanges::fromSigned(smin: intMin, smax: negOne);
68 EXPECT_EQ(negative.umin(), intMin);
69 EXPECT_EQ(negative.umax(), negOne);
70
71 ConstantIntRanges preserved = ConstantIntRanges::fromSigned(smin: zero, smax: one);
72 EXPECT_EQ(preserved.umin(), zero);
73 EXPECT_EQ(preserved.umax(), one);
74}
75
76TEST(IntRangeAttrs, Join) {
77 APInt zero = APInt::getZero(numBits: 64);
78 APInt one = zero + 1;
79 APInt two = zero + 2;
80 APInt intMin = APInt::getSignedMinValue(numBits: 64);
81 APInt intMax = APInt::getSignedMaxValue(numBits: 64);
82 APInt uintMax = APInt::getMaxValue(numBits: 64);
83
84 ConstantIntRanges maximal(zero, uintMax, intMin, intMax);
85 ConstantIntRanges zeroOne(zero, one, zero, one);
86
87 EXPECT_EQ(zeroOne.rangeUnion(maximal), maximal);
88 EXPECT_EQ(maximal.rangeUnion(zeroOne), maximal);
89
90 EXPECT_EQ(zeroOne.rangeUnion(zeroOne), zeroOne);
91
92 ConstantIntRanges oneTwo(one, two, one, two);
93 ConstantIntRanges zeroTwo(zero, two, zero, two);
94 EXPECT_EQ(zeroOne.rangeUnion(oneTwo), zeroTwo);
95
96 ConstantIntRanges zeroOneUnsignedOnly(zero, one, intMin, intMax);
97 ConstantIntRanges zeroOneSignedOnly(zero, uintMax, zero, one);
98 EXPECT_EQ(zeroOneUnsignedOnly.rangeUnion(zeroOneSignedOnly), maximal);
99}
100

source code of mlir/unittests/Interfaces/InferIntRangeInterfaceTest.cpp