brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 418c97f Raw
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