xref: /llvm-project/mlir/unittests/Interfaces/InferIntRangeInterfaceTest.cpp (revision 95aff23e29214543360d893f9a61df0ebd1b65d2)
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 
15 using namespace mlir;
16 
TEST(IntRangeAttrs,BasicConstructors)17 TEST(IntRangeAttrs, BasicConstructors) {
18   APInt zero = APInt::getZero(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 
TEST(IntRangeAttrs,FromUnsigned)28 TEST(IntRangeAttrs, FromUnsigned) {
29   APInt zero = APInt::getZero(64);
30   APInt maxInt = APInt::getSignedMaxValue(64);
31   APInt minInt = APInt::getSignedMinValue(64);
32   APInt minIntPlusOne = minInt + 1;
33 
34   ConstantIntRanges canPortToSigned =
35       ConstantIntRanges::fromUnsigned(zero, maxInt);
36   EXPECT_EQ(canPortToSigned.smin(), zero);
37   EXPECT_EQ(canPortToSigned.smax(), maxInt);
38 
39   ConstantIntRanges cantPortToSigned =
40       ConstantIntRanges::fromUnsigned(zero, minInt);
41   EXPECT_EQ(cantPortToSigned.smin(), minInt);
42   EXPECT_EQ(cantPortToSigned.smax(), maxInt);
43 
44   ConstantIntRanges signedNegative =
45       ConstantIntRanges::fromUnsigned(minInt, minIntPlusOne);
46   EXPECT_EQ(signedNegative.smin(), minInt);
47   EXPECT_EQ(signedNegative.smax(), minIntPlusOne);
48 }
49 
TEST(IntRangeAttrs,FromSigned)50 TEST(IntRangeAttrs, FromSigned) {
51   APInt zero = APInt::getZero(64);
52   APInt one = zero + 1;
53   APInt negOne = zero - 1;
54   APInt intMax = APInt::getSignedMaxValue(64);
55   APInt intMin = APInt::getSignedMinValue(64);
56   APInt uintMax = APInt::getMaxValue(64);
57 
58   ConstantIntRanges noUnsignedBound =
59       ConstantIntRanges::fromSigned(negOne, one);
60   EXPECT_EQ(noUnsignedBound.umin(), zero);
61   EXPECT_EQ(noUnsignedBound.umax(), uintMax);
62 
63   ConstantIntRanges positive = ConstantIntRanges::fromSigned(one, intMax);
64   EXPECT_EQ(positive.umin(), one);
65   EXPECT_EQ(positive.umax(), intMax);
66 
67   ConstantIntRanges negative = ConstantIntRanges::fromSigned(intMin, negOne);
68   EXPECT_EQ(negative.umin(), intMin);
69   EXPECT_EQ(negative.umax(), negOne);
70 
71   ConstantIntRanges preserved = ConstantIntRanges::fromSigned(zero, one);
72   EXPECT_EQ(preserved.umin(), zero);
73   EXPECT_EQ(preserved.umax(), one);
74 }
75 
TEST(IntRangeAttrs,Join)76 TEST(IntRangeAttrs, Join) {
77   APInt zero = APInt::getZero(64);
78   APInt one = zero + 1;
79   APInt two = zero + 2;
80   APInt intMin = APInt::getSignedMinValue(64);
81   APInt intMax = APInt::getSignedMaxValue(64);
82   APInt uintMax = APInt::getMaxValue(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