brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · 018b202 Raw
175 lines · cpp
1//===- MCInstrAnalysisTest.cpp - RISCVMCInstrAnalysis unit tests ----------===//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#include "llvm/MC/MCInstrAnalysis.h"10#include "MCTargetDesc/RISCVMCTargetDesc.h"11#include "llvm/MC/MCInstBuilder.h"12#include "llvm/MC/TargetRegistry.h"13#include "llvm/Support/TargetSelect.h"14 15#include "gtest/gtest.h"16 17#include <memory>18 19using namespace llvm;20 21namespace {22 23class InstrAnalysisTest : public testing::TestWithParam<const char *> {24protected:25  std::unique_ptr<const MCInstrInfo> Info;26  std::unique_ptr<const MCInstrAnalysis> Analysis;27 28  static void SetUpTestSuite() {29    LLVMInitializeRISCVTargetInfo();30    LLVMInitializeRISCVTarget();31    LLVMInitializeRISCVTargetMC();32  }33 34  InstrAnalysisTest() {35    std::string Error;36    Triple TT(Triple::normalize(GetParam()));37    const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);38    Info = std::unique_ptr<const MCInstrInfo>(TheTarget->createMCInstrInfo());39    Analysis = std::unique_ptr<const MCInstrAnalysis>(40        TheTarget->createMCInstrAnalysis(Info.get()));41  }42};43 44} // namespace45 46static MCInst jal(unsigned RD) {47  return MCInstBuilder(RISCV::JAL).addReg(RD).addImm(16);48}49 50static MCInst jalr(unsigned RD, unsigned RS1 = RISCV::X10) {51  return MCInstBuilder(RISCV::JALR).addReg(RD).addReg(RS1).addImm(16);52}53 54static MCInst cjr(unsigned RS1) {55  return MCInstBuilder(RISCV::C_JR).addReg(RS1);56}57 58static MCInst cj() { return MCInstBuilder(RISCV::C_J).addImm(16); }59static MCInst cjal() { return MCInstBuilder(RISCV::C_JAL).addImm(16); }60 61static MCInst cjalr(unsigned RS1) {62  return MCInstBuilder(RISCV::C_JALR).addReg(RS1);63}64 65static MCInst beq() {66  return MCInstBuilder(RISCV::BEQ)67      .addReg(RISCV::X0)68      .addReg(RISCV::X1)69      .addImm(32);70}71 72static MCInst cbeqz() {73  return MCInstBuilder(RISCV::C_BEQZ).addReg(RISCV::X1).addImm(32);74}75 76TEST_P(InstrAnalysisTest, IsTerminator) {77  EXPECT_TRUE(Analysis->isTerminator(beq()));78  EXPECT_TRUE(Analysis->isTerminator(cbeqz()));79  EXPECT_TRUE(Analysis->isTerminator(jal(RISCV::X0)));80  EXPECT_FALSE(Analysis->isTerminator(jal(RISCV::X5)));81  EXPECT_TRUE(Analysis->isTerminator(jalr(RISCV::X0)));82  EXPECT_FALSE(Analysis->isTerminator(jalr(RISCV::X5)));83  EXPECT_TRUE(Analysis->isTerminator(cj()));84  EXPECT_FALSE(Analysis->isTerminator(cjal()));85}86 87TEST_P(InstrAnalysisTest, IsCall) {88  EXPECT_FALSE(Analysis->isCall(beq()));89  EXPECT_FALSE(Analysis->isCall(cbeqz()));90  EXPECT_FALSE(Analysis->isCall(jal(RISCV::X0)));91  EXPECT_TRUE(Analysis->isCall(jal(RISCV::X1)));92  EXPECT_TRUE(Analysis->isCall(jalr(RISCV::X1, RISCV::X1)));93  EXPECT_FALSE(Analysis->isCall(jalr(RISCV::X0, RISCV::X5)));94  EXPECT_FALSE(Analysis->isCall(cj()));95  EXPECT_FALSE(Analysis->isCall(cjr(RISCV::X5)));96  EXPECT_TRUE(Analysis->isCall(cjal()));97  EXPECT_TRUE(Analysis->isCall(cjalr(RISCV::X5)));98}99 100TEST_P(InstrAnalysisTest, IsReturn) {101  EXPECT_FALSE(Analysis->isReturn(beq()));102  EXPECT_FALSE(Analysis->isReturn(cbeqz()));103  EXPECT_FALSE(Analysis->isReturn(jal(RISCV::X0)));104  EXPECT_TRUE(Analysis->isReturn(jalr(RISCV::X0, RISCV::X1)));105  EXPECT_FALSE(Analysis->isReturn(jalr(RISCV::X1, RISCV::X1)));106  EXPECT_TRUE(Analysis->isReturn(jalr(RISCV::X0, RISCV::X5)));107  EXPECT_FALSE(Analysis->isReturn(cj()));108  EXPECT_TRUE(Analysis->isReturn(cjr(RISCV::X1)));109  EXPECT_FALSE(Analysis->isReturn(cjr(RISCV::X2)));110  EXPECT_TRUE(Analysis->isReturn(cjr(RISCV::X5)));111  EXPECT_FALSE(Analysis->isReturn(cjal()));112  EXPECT_FALSE(Analysis->isReturn(cjalr(RISCV::X1)));113  EXPECT_FALSE(Analysis->isReturn(cjalr(RISCV::X5)));114}115 116TEST_P(InstrAnalysisTest, IsBranch) {117  EXPECT_TRUE(Analysis->isBranch(beq()));118  EXPECT_TRUE(Analysis->isBranch(cbeqz()));119  EXPECT_TRUE(Analysis->isBranch(jal(RISCV::X0)));120  EXPECT_FALSE(Analysis->isBranch(jal(RISCV::X1)));121  EXPECT_FALSE(Analysis->isBranch(jal(RISCV::X5)));122  EXPECT_TRUE(Analysis->isBranch(jalr(RISCV::X0)));123  EXPECT_FALSE(Analysis->isBranch(jalr(RISCV::X1)));124  EXPECT_FALSE(Analysis->isBranch(jalr(RISCV::X5)));125  EXPECT_FALSE(Analysis->isBranch(jalr(RISCV::X0, RISCV::X1)));126  EXPECT_FALSE(Analysis->isBranch(jalr(RISCV::X0, RISCV::X5)));127  EXPECT_TRUE(Analysis->isBranch(cj()));128  EXPECT_TRUE(Analysis->isBranch(cjr(RISCV::X2)));129  EXPECT_FALSE(Analysis->isBranch(cjr(RISCV::X1)));130  EXPECT_FALSE(Analysis->isBranch(cjr(RISCV::X5)));131  EXPECT_FALSE(Analysis->isBranch(cjal()));132  EXPECT_FALSE(Analysis->isBranch(cjalr(RISCV::X6)));133  EXPECT_FALSE(Analysis->isBranch(cjalr(RISCV::X1)));134  EXPECT_FALSE(Analysis->isBranch(cjalr(RISCV::X5)));135}136 137TEST_P(InstrAnalysisTest, IsUnconditionalBranch) {138  EXPECT_FALSE(Analysis->isUnconditionalBranch(beq()));139  EXPECT_FALSE(Analysis->isUnconditionalBranch(cbeqz()));140  EXPECT_TRUE(Analysis->isUnconditionalBranch(jal(RISCV::X0)));141  EXPECT_FALSE(Analysis->isUnconditionalBranch(jal(RISCV::X1)));142  EXPECT_FALSE(Analysis->isUnconditionalBranch(jal(RISCV::X5)));143  EXPECT_TRUE(Analysis->isUnconditionalBranch(jalr(RISCV::X0)));144  EXPECT_FALSE(Analysis->isUnconditionalBranch(jalr(RISCV::X1)));145  EXPECT_FALSE(Analysis->isUnconditionalBranch(jalr(RISCV::X5)));146  EXPECT_FALSE(Analysis->isUnconditionalBranch(jalr(RISCV::X0, RISCV::X1)));147  EXPECT_FALSE(Analysis->isUnconditionalBranch(jalr(RISCV::X0, RISCV::X5)));148  EXPECT_TRUE(Analysis->isUnconditionalBranch(cj()));149  EXPECT_TRUE(Analysis->isUnconditionalBranch(cjr(RISCV::X2)));150  EXPECT_FALSE(Analysis->isUnconditionalBranch(cjr(RISCV::X1)));151  EXPECT_FALSE(Analysis->isUnconditionalBranch(cjr(RISCV::X5)));152  EXPECT_FALSE(Analysis->isUnconditionalBranch(cjal()));153  EXPECT_FALSE(Analysis->isUnconditionalBranch(cjalr(RISCV::X6)));154  EXPECT_FALSE(Analysis->isUnconditionalBranch(cjalr(RISCV::X1)));155  EXPECT_FALSE(Analysis->isUnconditionalBranch(cjalr(RISCV::X5)));156}157 158TEST_P(InstrAnalysisTest, IsIndirectBranch) {159  EXPECT_FALSE(Analysis->isIndirectBranch(beq()));160  EXPECT_FALSE(Analysis->isIndirectBranch(cbeqz()));161  EXPECT_FALSE(Analysis->isIndirectBranch(jal(RISCV::X0)));162  EXPECT_FALSE(Analysis->isIndirectBranch(jal(RISCV::X1)));163  EXPECT_TRUE(Analysis->isIndirectBranch(jalr(RISCV::X0)));164  EXPECT_FALSE(Analysis->isIndirectBranch(jalr(RISCV::X1)));165  EXPECT_FALSE(Analysis->isIndirectBranch(cj()));166  EXPECT_TRUE(Analysis->isIndirectBranch(cjr(RISCV::X10)));167  EXPECT_FALSE(Analysis->isIndirectBranch(cjr(RISCV::X1)));168  EXPECT_FALSE(Analysis->isIndirectBranch(cjr(RISCV::X5)));169  EXPECT_FALSE(Analysis->isIndirectBranch(cjal()));170  EXPECT_FALSE(Analysis->isIndirectBranch(cjalr(RISCV::X5)));171}172 173INSTANTIATE_TEST_SUITE_P(RV32And64, InstrAnalysisTest,174                         testing::Values("riscv32", "riscv64"));175