| //===- InstructionCostTest.cpp - InstructionCost tests --------------------===// |
| // |
| // 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/Support/InstructionCost.h" |
| #include "gtest/gtest.h" |
| #include <limits> |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| struct CostTest : public testing::Test { |
| CostTest() {} |
| }; |
| |
| } // namespace |
| |
| TEST_F(CostTest, DefaultCtor) { |
| InstructionCost DefaultCost; |
| |
| ASSERT_TRUE(DefaultCost.isValid()); |
| EXPECT_EQ(*(DefaultCost.getValue()), 0); |
| } |
| |
| TEST_F(CostTest, Operators) { |
| |
| InstructionCost VThree = 3; |
| InstructionCost VNegTwo = -2; |
| InstructionCost VSix = 6; |
| InstructionCost IThreeA = InstructionCost::getInvalid(3); |
| InstructionCost IThreeB = InstructionCost::getInvalid(3); |
| InstructionCost ITwo = InstructionCost::getInvalid(2); |
| InstructionCost TmpCost; |
| |
| EXPECT_NE(VThree, VNegTwo); |
| EXPECT_GT(VThree, VNegTwo); |
| EXPECT_NE(VThree, IThreeA); |
| EXPECT_EQ(IThreeA, IThreeB); |
| EXPECT_GE(IThreeA, VNegTwo); |
| EXPECT_LT(VSix, IThreeA); |
| EXPECT_LT(VThree, ITwo); |
| EXPECT_GE(ITwo, VThree); |
| EXPECT_EQ(VSix - IThreeA, IThreeB); |
| EXPECT_EQ(VThree - VNegTwo, 5); |
| EXPECT_EQ(VThree * VNegTwo, -6); |
| EXPECT_EQ(VSix / VThree, 2); |
| EXPECT_NE(IThreeA, ITwo); |
| EXPECT_LT(ITwo, IThreeA); |
| EXPECT_GT(IThreeA, ITwo); |
| |
| EXPECT_FALSE(IThreeA.isValid()); |
| EXPECT_EQ(IThreeA.getState(), InstructionCost::Invalid); |
| |
| TmpCost = VThree + IThreeA; |
| EXPECT_FALSE(TmpCost.isValid()); |
| |
| // Test increments, decrements |
| EXPECT_EQ(++VThree, 4); |
| EXPECT_EQ(VThree++, 4); |
| EXPECT_EQ(VThree, 5); |
| EXPECT_EQ(--VThree, 4); |
| EXPECT_EQ(VThree--, 4); |
| EXPECT_EQ(VThree, 3); |
| |
| TmpCost = VThree * IThreeA; |
| EXPECT_FALSE(TmpCost.isValid()); |
| |
| // Test value extraction |
| EXPECT_EQ(*(VThree.getValue()), 3); |
| EXPECT_EQ(IThreeA.getValue(), std::nullopt); |
| |
| EXPECT_EQ(std::min(VThree, VNegTwo), -2); |
| EXPECT_EQ(std::max(VThree, VSix), 6); |
| |
| // Test saturation |
| auto Max = InstructionCost::getMax(); |
| auto Min = InstructionCost::getMin(); |
| auto MinusOne = InstructionCost(-1); |
| auto MinusTwo = InstructionCost(-2); |
| auto One = InstructionCost(1); |
| auto Two = InstructionCost(2); |
| EXPECT_EQ(Max + One, Max); |
| EXPECT_EQ(Min + MinusOne, Min); |
| EXPECT_EQ(Min - One, Min); |
| EXPECT_EQ(Max - MinusOne, Max); |
| EXPECT_EQ(Max * Two, Max); |
| EXPECT_EQ(Min * Two, Min); |
| EXPECT_EQ(Max * MinusTwo, Min); |
| EXPECT_EQ(Min * MinusTwo, Max); |
| } |