xref: /llvm-project/llvm/unittests/tools/llvm-exegesis/X86/RegisterAliasingTest.cpp (revision 89b57061f7b769e9ea9bf6ed686e284f3e55affe)
1dbefcde6STom Stellard //===-- X86RegisterAliasingTest.cpp --------------------------------*- C++ -*-===//
256c74cffSJinsong Ji //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
656c74cffSJinsong Ji //
756c74cffSJinsong Ji //===----------------------------------------------------------------------===//
856c74cffSJinsong Ji 
956c74cffSJinsong Ji 
100e69e2d7SClement Courbet #include "RegisterAliasing.h"
110e69e2d7SClement Courbet 
120e69e2d7SClement Courbet #include <cassert>
130e69e2d7SClement Courbet #include <memory>
140e69e2d7SClement Courbet 
158109901bSClement Courbet #include "TestBase.h"
160e69e2d7SClement Courbet #include "X86InstrInfo.h"
17*89b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
180e69e2d7SClement Courbet #include "llvm/Support/TargetSelect.h"
190e69e2d7SClement Courbet #include "gmock/gmock.h"
200e69e2d7SClement Courbet #include "gtest/gtest.h"
210e69e2d7SClement Courbet 
2232401afdSFangrui Song namespace llvm {
230e69e2d7SClement Courbet namespace exegesis {
240e69e2d7SClement Courbet namespace {
250e69e2d7SClement Courbet 
26dbefcde6STom Stellard class X86RegisterAliasingTest : public X86TestBase {};
270e69e2d7SClement Courbet 
TEST_F(X86RegisterAliasingTest,TrackSimpleRegister)28dbefcde6STom Stellard TEST_F(X86RegisterAliasingTest, TrackSimpleRegister) {
298109901bSClement Courbet   const auto &RegInfo = State.getRegInfo();
30d422d3a7SClement Courbet   const RegisterAliasingTracker tracker(RegInfo, X86::EAX);
31d422d3a7SClement Courbet   std::set<MCPhysReg> ActualAliasedRegisters;
32da3f49a4SClement Courbet   for (unsigned I : tracker.aliasedBits().set_bits())
33d422d3a7SClement Courbet     ActualAliasedRegisters.insert(static_cast<MCPhysReg>(I));
34d422d3a7SClement Courbet   const std::set<MCPhysReg> ExpectedAliasedRegisters = {
35d422d3a7SClement Courbet       X86::AL, X86::AH, X86::AX, X86::EAX, X86::HAX, X86::RAX};
360e69e2d7SClement Courbet   ASSERT_THAT(ActualAliasedRegisters, ExpectedAliasedRegisters);
37d422d3a7SClement Courbet   for (MCPhysReg aliased : ExpectedAliasedRegisters) {
38d422d3a7SClement Courbet     ASSERT_THAT(tracker.getOrigin(aliased), X86::EAX);
390e69e2d7SClement Courbet   }
400e69e2d7SClement Courbet }
410e69e2d7SClement Courbet 
TEST_F(X86RegisterAliasingTest,TrackRegisterClass)42dbefcde6STom Stellard TEST_F(X86RegisterAliasingTest, TrackRegisterClass) {
430e69e2d7SClement Courbet   // The alias bits for GR8_ABCD_LRegClassID are the union of the alias bits for
440e69e2d7SClement Courbet   // AL, BL, CL and DL.
458109901bSClement Courbet   const auto &RegInfo = State.getRegInfo();
46d422d3a7SClement Courbet   const BitVector NoReservedReg(RegInfo.getNumRegs());
470e69e2d7SClement Courbet 
480e69e2d7SClement Courbet   const RegisterAliasingTracker RegClassTracker(
49d422d3a7SClement Courbet       RegInfo, NoReservedReg, RegInfo.getRegClass(X86::GR8_ABCD_LRegClassID));
500e69e2d7SClement Courbet 
51d422d3a7SClement Courbet   BitVector sum(RegInfo.getNumRegs());
52d422d3a7SClement Courbet   sum |= RegisterAliasingTracker(RegInfo, X86::AL).aliasedBits();
53d422d3a7SClement Courbet   sum |= RegisterAliasingTracker(RegInfo, X86::BL).aliasedBits();
54d422d3a7SClement Courbet   sum |= RegisterAliasingTracker(RegInfo, X86::CL).aliasedBits();
55d422d3a7SClement Courbet   sum |= RegisterAliasingTracker(RegInfo, X86::DL).aliasedBits();
560e69e2d7SClement Courbet 
570e69e2d7SClement Courbet   ASSERT_THAT(RegClassTracker.aliasedBits(), sum);
580e69e2d7SClement Courbet }
590e69e2d7SClement Courbet 
TEST_F(X86RegisterAliasingTest,TrackRegisterClassCache)60dbefcde6STom Stellard TEST_F(X86RegisterAliasingTest, TrackRegisterClassCache) {
610e69e2d7SClement Courbet   // Fetching twice the same tracker yields the same pointers.
628109901bSClement Courbet   const auto &RegInfo = State.getRegInfo();
63d422d3a7SClement Courbet   const BitVector NoReservedReg(RegInfo.getNumRegs());
640e69e2d7SClement Courbet   RegisterAliasingTrackerCache Cache(RegInfo, NoReservedReg);
65d422d3a7SClement Courbet   ASSERT_THAT(&Cache.getRegister(X86::AX), &Cache.getRegister(X86::AX));
660e69e2d7SClement Courbet 
67d422d3a7SClement Courbet   ASSERT_THAT(&Cache.getRegisterClass(X86::GR8_ABCD_LRegClassID),
68d422d3a7SClement Courbet               &Cache.getRegisterClass(X86::GR8_ABCD_LRegClassID));
690e69e2d7SClement Courbet }
700e69e2d7SClement Courbet 
710e69e2d7SClement Courbet } // namespace
720e69e2d7SClement Courbet } // namespace exegesis
7332401afdSFangrui Song } // namespace llvm
74