//===-- RegisterAliasingTest.cpp --------------------------------*- C++ -*-===// // // 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 "RegisterAliasing.h" #include #include #include "MipsInstrInfo.h" #include "TestBase.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace llvm { namespace exegesis { namespace { class MipsRegisterAliasingTest : public MipsTestBase {}; TEST_F(MipsRegisterAliasingTest, TrackSimpleRegister) { const auto &RegInfo = State.getRegInfo(); const RegisterAliasingTracker tracker(RegInfo, Mips::T0_64); std::set ActualAliasedRegisters; for (unsigned I : tracker.aliasedBits().set_bits()) ActualAliasedRegisters.insert(static_cast(I)); const std::set ExpectedAliasedRegisters = {Mips::T0, Mips::T0_64}; ASSERT_THAT(ActualAliasedRegisters, ExpectedAliasedRegisters); for (MCPhysReg aliased : ExpectedAliasedRegisters) { ASSERT_THAT(tracker.getOrigin(aliased), Mips::T0_64); } } TEST_F(MipsRegisterAliasingTest, TrackRegisterClass) { // The alias bits for // GPR64_with_sub_32_in_GPRMM16MoveP_and_GPRMM16ZeroRegClassID // are the union of the alias bits for ZERO_64, V0_64, V1_64 and S1_64. const auto &RegInfo = State.getRegInfo(); const BitVector NoReservedReg(RegInfo.getNumRegs()); const RegisterAliasingTracker RegClassTracker( RegInfo, NoReservedReg, RegInfo.getRegClass( Mips::GPR64_with_sub_32_in_GPRMM16MoveP_and_GPRMM16ZeroRegClassID)); BitVector sum(RegInfo.getNumRegs()); sum |= RegisterAliasingTracker(RegInfo, Mips::ZERO_64).aliasedBits(); sum |= RegisterAliasingTracker(RegInfo, Mips::V0_64).aliasedBits(); sum |= RegisterAliasingTracker(RegInfo, Mips::V1_64).aliasedBits(); sum |= RegisterAliasingTracker(RegInfo, Mips::S1_64).aliasedBits(); ASSERT_THAT(RegClassTracker.aliasedBits(), sum); } TEST_F(MipsRegisterAliasingTest, TrackRegisterClassCache) { // Fetching the same tracker twice yields the same pointers. const auto &RegInfo = State.getRegInfo(); const BitVector NoReservedReg(RegInfo.getNumRegs()); RegisterAliasingTrackerCache Cache(RegInfo, NoReservedReg); ASSERT_THAT(&Cache.getRegister(Mips::T0), &Cache.getRegister(Mips::T0)); ASSERT_THAT(&Cache.getRegisterClass(Mips::ACC64RegClassID), &Cache.getRegisterClass(Mips::ACC64RegClassID)); } } // namespace } // namespace exegesis } // namespace llvm