16b357866SMiloš Stojanović //===-- RegisterAliasingTest.cpp --------------------------------*- C++ -*-===//
26b357866SMiloš Stojanović //
36b357866SMiloš Stojanović // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46b357866SMiloš Stojanović // See https://llvm.org/LICENSE.txt for license information.
56b357866SMiloš Stojanović // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66b357866SMiloš Stojanović //
76b357866SMiloš Stojanović //===----------------------------------------------------------------------===//
86b357866SMiloš Stojanović
96b357866SMiloš Stojanović #include "RegisterAliasing.h"
106b357866SMiloš Stojanović
116b357866SMiloš Stojanović #include <cassert>
126b357866SMiloš Stojanović #include <memory>
136b357866SMiloš Stojanović
146b357866SMiloš Stojanović #include "MipsInstrInfo.h"
156b357866SMiloš Stojanović #include "TestBase.h"
16*89b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
176b357866SMiloš Stojanović #include "llvm/Support/TargetSelect.h"
186b357866SMiloš Stojanović #include "gmock/gmock.h"
196b357866SMiloš Stojanović #include "gtest/gtest.h"
206b357866SMiloš Stojanović
216b357866SMiloš Stojanović namespace llvm {
226b357866SMiloš Stojanović namespace exegesis {
236b357866SMiloš Stojanović namespace {
246b357866SMiloš Stojanović
25dbefcde6STom Stellard class MipsRegisterAliasingTest : public MipsTestBase {};
266b357866SMiloš Stojanović
TEST_F(MipsRegisterAliasingTest,TrackSimpleRegister)27dbefcde6STom Stellard TEST_F(MipsRegisterAliasingTest, TrackSimpleRegister) {
286b357866SMiloš Stojanović const auto &RegInfo = State.getRegInfo();
296b357866SMiloš Stojanović const RegisterAliasingTracker tracker(RegInfo, Mips::T0_64);
306b357866SMiloš Stojanović std::set<MCPhysReg> ActualAliasedRegisters;
316b357866SMiloš Stojanović for (unsigned I : tracker.aliasedBits().set_bits())
326b357866SMiloš Stojanović ActualAliasedRegisters.insert(static_cast<MCPhysReg>(I));
336b357866SMiloš Stojanović const std::set<MCPhysReg> ExpectedAliasedRegisters = {Mips::T0, Mips::T0_64};
346b357866SMiloš Stojanović ASSERT_THAT(ActualAliasedRegisters, ExpectedAliasedRegisters);
356b357866SMiloš Stojanović for (MCPhysReg aliased : ExpectedAliasedRegisters) {
366b357866SMiloš Stojanović ASSERT_THAT(tracker.getOrigin(aliased), Mips::T0_64);
376b357866SMiloš Stojanović }
386b357866SMiloš Stojanović }
396b357866SMiloš Stojanović
TEST_F(MipsRegisterAliasingTest,TrackRegisterClass)40dbefcde6STom Stellard TEST_F(MipsRegisterAliasingTest, TrackRegisterClass) {
416b357866SMiloš Stojanović // The alias bits for
426b357866SMiloš Stojanović // GPR64_with_sub_32_in_GPRMM16MoveP_and_GPRMM16ZeroRegClassID
436b357866SMiloš Stojanović // are the union of the alias bits for ZERO_64, V0_64, V1_64 and S1_64.
446b357866SMiloš Stojanović const auto &RegInfo = State.getRegInfo();
456b357866SMiloš Stojanović const BitVector NoReservedReg(RegInfo.getNumRegs());
466b357866SMiloš Stojanović
476b357866SMiloš Stojanović const RegisterAliasingTracker RegClassTracker(
486b357866SMiloš Stojanović RegInfo, NoReservedReg,
496b357866SMiloš Stojanović RegInfo.getRegClass(
506b357866SMiloš Stojanović Mips::GPR64_with_sub_32_in_GPRMM16MoveP_and_GPRMM16ZeroRegClassID));
516b357866SMiloš Stojanović
526b357866SMiloš Stojanović BitVector sum(RegInfo.getNumRegs());
536b357866SMiloš Stojanović sum |= RegisterAliasingTracker(RegInfo, Mips::ZERO_64).aliasedBits();
546b357866SMiloš Stojanović sum |= RegisterAliasingTracker(RegInfo, Mips::V0_64).aliasedBits();
556b357866SMiloš Stojanović sum |= RegisterAliasingTracker(RegInfo, Mips::V1_64).aliasedBits();
566b357866SMiloš Stojanović sum |= RegisterAliasingTracker(RegInfo, Mips::S1_64).aliasedBits();
576b357866SMiloš Stojanović
586b357866SMiloš Stojanović ASSERT_THAT(RegClassTracker.aliasedBits(), sum);
596b357866SMiloš Stojanović }
606b357866SMiloš Stojanović
TEST_F(MipsRegisterAliasingTest,TrackRegisterClassCache)61dbefcde6STom Stellard TEST_F(MipsRegisterAliasingTest, TrackRegisterClassCache) {
626b357866SMiloš Stojanović // Fetching the same tracker twice yields the same pointers.
636b357866SMiloš Stojanović const auto &RegInfo = State.getRegInfo();
646b357866SMiloš Stojanović const BitVector NoReservedReg(RegInfo.getNumRegs());
656b357866SMiloš Stojanović RegisterAliasingTrackerCache Cache(RegInfo, NoReservedReg);
666b357866SMiloš Stojanović ASSERT_THAT(&Cache.getRegister(Mips::T0), &Cache.getRegister(Mips::T0));
676b357866SMiloš Stojanović
686b357866SMiloš Stojanović ASSERT_THAT(&Cache.getRegisterClass(Mips::ACC64RegClassID),
696b357866SMiloš Stojanović &Cache.getRegisterClass(Mips::ACC64RegClassID));
706b357866SMiloš Stojanović }
716b357866SMiloš Stojanović
726b357866SMiloš Stojanović } // namespace
736b357866SMiloš Stojanović } // namespace exegesis
746b357866SMiloš Stojanović } // namespace llvm
75