73 lines · cpp
1//===-- X86RegisterAliasingTest.cpp --------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9 10#include "RegisterAliasing.h"11 12#include <cassert>13 14#include "TestBase.h"15#include "X86InstrInfo.h"16#include "llvm/MC/TargetRegistry.h"17#include "llvm/Support/TargetSelect.h"18#include "gmock/gmock.h"19#include "gtest/gtest.h"20 21namespace llvm {22namespace exegesis {23namespace {24 25class X86RegisterAliasingTest : public X86TestBase {};26 27TEST_F(X86RegisterAliasingTest, TrackSimpleRegister) {28 const auto &RegInfo = State.getRegInfo();29 const RegisterAliasingTracker tracker(RegInfo, X86::EAX);30 std::set<MCPhysReg> ActualAliasedRegisters;31 for (unsigned I : tracker.aliasedBits().set_bits())32 ActualAliasedRegisters.insert(static_cast<MCPhysReg>(I));33 const std::set<MCPhysReg> ExpectedAliasedRegisters = {34 X86::AL, X86::AH, X86::AX, X86::EAX, X86::HAX, X86::RAX};35 ASSERT_THAT(ActualAliasedRegisters, ExpectedAliasedRegisters);36 for (MCPhysReg aliased : ExpectedAliasedRegisters) {37 ASSERT_THAT(tracker.getOrigin(aliased), X86::EAX);38 }39}40 41TEST_F(X86RegisterAliasingTest, TrackRegisterClass) {42 // The alias bits for GR8_ABCD_LRegClassID are the union of the alias bits for43 // AL, BL, CL and DL.44 const auto &RegInfo = State.getRegInfo();45 const BitVector NoReservedReg(RegInfo.getNumRegs());46 47 const RegisterAliasingTracker RegClassTracker(48 RegInfo, NoReservedReg, RegInfo.getRegClass(X86::GR8_ABCD_LRegClassID));49 50 BitVector sum(RegInfo.getNumRegs());51 sum |= RegisterAliasingTracker(RegInfo, X86::AL).aliasedBits();52 sum |= RegisterAliasingTracker(RegInfo, X86::BL).aliasedBits();53 sum |= RegisterAliasingTracker(RegInfo, X86::CL).aliasedBits();54 sum |= RegisterAliasingTracker(RegInfo, X86::DL).aliasedBits();55 56 ASSERT_THAT(RegClassTracker.aliasedBits(), sum);57}58 59TEST_F(X86RegisterAliasingTest, TrackRegisterClassCache) {60 // Fetching twice the same tracker yields the same pointers.61 const auto &RegInfo = State.getRegInfo();62 const BitVector NoReservedReg(RegInfo.getNumRegs());63 RegisterAliasingTrackerCache Cache(RegInfo, NoReservedReg);64 ASSERT_THAT(&Cache.getRegister(X86::AX), &Cache.getRegister(X86::AX));65 66 ASSERT_THAT(&Cache.getRegisterClass(X86::GR8_ABCD_LRegClassID),67 &Cache.getRegisterClass(X86::GR8_ABCD_LRegClassID));68}69 70} // namespace71} // namespace exegesis72} // namespace llvm73