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-exception
6 //
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
19 using namespace llvm;
20
21 namespace {
22
23 class InstrAnalysisTest : public testing::TestWithParam<const char *> {
24 protected:
25 std::unique_ptr<const MCInstrInfo> Info;
26 std::unique_ptr<const MCInstrAnalysis> Analysis;
27
SetUpTestSuite()28 static void SetUpTestSuite() {
29 LLVMInitializeRISCVTargetInfo();
30 LLVMInitializeRISCVTarget();
31 LLVMInitializeRISCVTargetMC();
32 }
33
InstrAnalysisTest()34 InstrAnalysisTest() {
35 std::string Error;
36 const Target *TheTarget =
37 TargetRegistry::lookupTarget(Triple::normalize(GetParam()), 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 } // namespace
45
jal(unsigned RD)46 static MCInst jal(unsigned RD) {
47 return MCInstBuilder(RISCV::JAL).addReg(RD).addImm(16);
48 }
49
jalr(unsigned RD,unsigned RS1=RISCV::X10)50 static MCInst jalr(unsigned RD, unsigned RS1 = RISCV::X10) {
51 return MCInstBuilder(RISCV::JALR).addReg(RD).addReg(RS1).addImm(16);
52 }
53
cjr(unsigned RS1)54 static MCInst cjr(unsigned RS1) {
55 return MCInstBuilder(RISCV::C_JR).addReg(RS1);
56 }
57
cj()58 static MCInst cj() { return MCInstBuilder(RISCV::C_J).addImm(16); }
cjal()59 static MCInst cjal() { return MCInstBuilder(RISCV::C_JAL).addImm(16); }
60
cjalr(unsigned RS1)61 static MCInst cjalr(unsigned RS1) {
62 return MCInstBuilder(RISCV::C_JALR).addReg(RS1);
63 }
64
beq()65 static MCInst beq() {
66 return MCInstBuilder(RISCV::BEQ)
67 .addReg(RISCV::X0)
68 .addReg(RISCV::X1)
69 .addImm(32);
70 }
71
cbeqz()72 static MCInst cbeqz() {
73 return MCInstBuilder(RISCV::C_BEQZ).addReg(RISCV::X1).addImm(32);
74 }
75
TEST_P(InstrAnalysisTest,IsTerminator)76 TEST_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
TEST_P(InstrAnalysisTest,IsCall)87 TEST_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
TEST_P(InstrAnalysisTest,IsReturn)100 TEST_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
TEST_P(InstrAnalysisTest,IsBranch)116 TEST_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
TEST_P(InstrAnalysisTest,IsUnconditionalBranch)137 TEST_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
TEST_P(InstrAnalysisTest,IsIndirectBranch)158 TEST_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
173 INSTANTIATE_TEST_SUITE_P(RV32And64, InstrAnalysisTest,
174 testing::Values("riscv32", "riscv64"));
175