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