llvm-project/llvm/unittests/Support/InstructionCostTest.cpp
David Green 98b6f8dc69
[CostModel] Remove optional from InstructionCost::getValue() (#135596)
InstructionCost is already an optional value, containing an Invalid
state that can be checked with isValid(). There is little point in
returning another optional from getValue(). Most uses do not make use of
it being a std::optional, dereferencing the value directly (either
isValid has been checked previously or the Cost is assumed to be valid).
The one case that does in AMDGPU used value_or which has been replaced
by a isValid() check.
2025-04-23 07:46:27 +01:00

94 lines
2.5 KiB
C++

//===- 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"
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(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);
}