Skip to content

Commit fa883e1

Browse files
authored
[AArch64][NFC] Add MCInstrAnalysis unittests (#155609)
Increasing the AArch64 backend testing with MCInstAnalysis test. Also added the isBarrier() function in MCInstAnalysis: since [isBarrier exists in MCInstDesc.h](https://github.com/llvm/llvm-project/blob/d94846a9adfd6c89699228f8538a832554c59df7/llvm/include/llvm/MC/MCInstrDesc.h#L291-L294), it makes sense to be available in the MCInstAnalysis as well.
1 parent bcb9634 commit fa883e1

File tree

3 files changed

+196
-0
lines changed

3 files changed

+196
-0
lines changed

llvm/include/llvm/MC/MCInstrAnalysis.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ class LLVM_ABI MCInstrAnalysis {
8181
return Info->get(Inst.getOpcode()).isTerminator();
8282
}
8383

84+
virtual bool isBarrier(const MCInst &Inst) const {
85+
return Info->get(Inst.getOpcode()).isBarrier();
86+
}
87+
8488
virtual bool mayAffectControlFlow(const MCInst &Inst,
8589
const MCRegisterInfo &MCRI) const {
8690
if (isBranch(Inst) || isCall(Inst) || isReturn(Inst) ||

llvm/unittests/Target/AArch64/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ add_llvm_target_unittest(AArch64Tests
3434
AArch64SVESchedPseudoTest.cpp
3535
AArch64SelectionDAGTest.cpp
3636
Immediates.cpp
37+
MCInstrAnalysisTest.cpp
3738
)
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
//===- MCInstrAnalysisTest.cpp - AArch64MCInstrAnalysis 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/AArch64MCTargetDesc.h"
11+
#include "Utils/AArch64BaseInfo.h"
12+
#include "llvm/MC/MCInstBuilder.h"
13+
#include "llvm/MC/TargetRegistry.h"
14+
#include "llvm/Support/TargetSelect.h"
15+
16+
#include "gtest/gtest.h"
17+
18+
#include <memory>
19+
20+
using namespace llvm;
21+
22+
namespace {
23+
24+
class InstrAnalysisTest : public testing::TestWithParam<const char *> {
25+
protected:
26+
std::unique_ptr<const MCInstrInfo> Info;
27+
std::unique_ptr<const MCInstrAnalysis> Analysis;
28+
29+
static void SetUpTestSuite() {
30+
LLVMInitializeAArch64TargetInfo();
31+
LLVMInitializeAArch64Target();
32+
LLVMInitializeAArch64TargetMC();
33+
}
34+
35+
InstrAnalysisTest() {
36+
std::string Error;
37+
const Target *TheTarget =
38+
TargetRegistry::lookupTarget(Triple::normalize(GetParam()), Error);
39+
Info = std::unique_ptr<const MCInstrInfo>(TheTarget->createMCInstrInfo());
40+
Analysis = std::unique_ptr<const MCInstrAnalysis>(
41+
TheTarget->createMCInstrAnalysis(Info.get()));
42+
}
43+
};
44+
45+
} // namespace
46+
47+
static MCInst beq() {
48+
return MCInstBuilder(AArch64::Bcc).addImm(AArch64CC::EQ).addReg(AArch64::X0);
49+
}
50+
static MCInst tbz(unsigned Rt = AArch64::X0, unsigned Imm = 0,
51+
unsigned Label = 32) {
52+
return MCInstBuilder(AArch64::TBZX).addReg(Rt).addImm(Imm).addImm(Label);
53+
}
54+
static MCInst cbz(unsigned Rt = AArch64::X0, unsigned Label = 32) {
55+
return MCInstBuilder(AArch64::CBZX).addReg(Rt).addImm(Label);
56+
}
57+
static MCInst b() { return MCInstBuilder(AArch64::B).addImm(32); }
58+
static MCInst bl() { return MCInstBuilder(AArch64::BL).addImm(32); }
59+
static MCInst br(unsigned Rn = AArch64::X0) {
60+
return MCInstBuilder(AArch64::BR).addReg(Rn);
61+
}
62+
static MCInst blr(unsigned Rn = AArch64::X0) {
63+
return MCInstBuilder(AArch64::BLR).addReg(Rn);
64+
}
65+
static MCInst ret(unsigned Rn = AArch64::LR) {
66+
return MCInstBuilder(AArch64::RET).addReg(Rn);
67+
}
68+
static MCInst retaa() { return MCInstBuilder(AArch64::RETAA); }
69+
static MCInst eret() { return MCInstBuilder(AArch64::ERET); }
70+
static MCInst hlt() { return MCInstBuilder(AArch64::HLT); }
71+
static MCInst brk() { return MCInstBuilder(AArch64::BRK); }
72+
static MCInst svc() { return MCInstBuilder(AArch64::SVC); }
73+
static MCInst hvc() { return MCInstBuilder(AArch64::HVC); }
74+
static MCInst smc() { return MCInstBuilder(AArch64::SMC); }
75+
76+
TEST_P(InstrAnalysisTest, IsTerminator) {
77+
EXPECT_TRUE(Analysis->isTerminator(beq()));
78+
EXPECT_TRUE(Analysis->isTerminator(tbz()));
79+
EXPECT_TRUE(Analysis->isTerminator(cbz()));
80+
EXPECT_TRUE(Analysis->isTerminator(b()));
81+
EXPECT_FALSE(Analysis->isTerminator(bl()));
82+
EXPECT_FALSE(Analysis->isTerminator(blr()));
83+
EXPECT_TRUE(Analysis->isTerminator(br()));
84+
EXPECT_TRUE(Analysis->isTerminator(ret()));
85+
EXPECT_TRUE(Analysis->isTerminator(retaa()));
86+
EXPECT_TRUE(Analysis->isTerminator(eret()));
87+
EXPECT_FALSE(Analysis->isTerminator(hlt()));
88+
EXPECT_FALSE(Analysis->isTerminator(brk()));
89+
EXPECT_FALSE(Analysis->isTerminator(svc()));
90+
EXPECT_FALSE(Analysis->isTerminator(hvc()));
91+
EXPECT_FALSE(Analysis->isTerminator(smc()));
92+
}
93+
94+
TEST_P(InstrAnalysisTest, IsBarrier) {
95+
EXPECT_FALSE(Analysis->isBarrier(beq()));
96+
EXPECT_FALSE(Analysis->isBarrier(tbz()));
97+
EXPECT_FALSE(Analysis->isBarrier(cbz()));
98+
EXPECT_TRUE(Analysis->isBarrier(b()));
99+
EXPECT_FALSE(Analysis->isBarrier(bl()));
100+
EXPECT_FALSE(Analysis->isBarrier(blr()));
101+
EXPECT_TRUE(Analysis->isBarrier(br()));
102+
EXPECT_TRUE(Analysis->isBarrier(ret()));
103+
EXPECT_TRUE(Analysis->isBarrier(retaa()));
104+
EXPECT_TRUE(Analysis->isBarrier(eret()));
105+
EXPECT_FALSE(Analysis->isBarrier(hlt()));
106+
EXPECT_FALSE(Analysis->isBarrier(brk()));
107+
EXPECT_FALSE(Analysis->isBarrier(svc()));
108+
EXPECT_FALSE(Analysis->isBarrier(hvc()));
109+
EXPECT_FALSE(Analysis->isBarrier(smc()));
110+
}
111+
112+
TEST_P(InstrAnalysisTest, IsCall) {
113+
EXPECT_FALSE(Analysis->isCall(beq()));
114+
EXPECT_FALSE(Analysis->isCall(tbz()));
115+
EXPECT_FALSE(Analysis->isCall(cbz()));
116+
EXPECT_FALSE(Analysis->isCall(b()));
117+
EXPECT_TRUE(Analysis->isCall(bl()));
118+
EXPECT_TRUE(Analysis->isCall(blr()));
119+
EXPECT_FALSE(Analysis->isCall(br()));
120+
EXPECT_FALSE(Analysis->isCall(ret()));
121+
EXPECT_FALSE(Analysis->isCall(retaa()));
122+
EXPECT_FALSE(Analysis->isCall(eret()));
123+
}
124+
125+
TEST_P(InstrAnalysisTest, IsReturn) {
126+
EXPECT_FALSE(Analysis->isReturn(beq()));
127+
EXPECT_FALSE(Analysis->isReturn(tbz()));
128+
EXPECT_FALSE(Analysis->isReturn(cbz()));
129+
EXPECT_FALSE(Analysis->isReturn(b()));
130+
EXPECT_FALSE(Analysis->isReturn(bl()));
131+
EXPECT_FALSE(Analysis->isReturn(br()));
132+
EXPECT_FALSE(Analysis->isReturn(blr()));
133+
EXPECT_FALSE(Analysis->isReturn(br(AArch64::LR)));
134+
EXPECT_TRUE(Analysis->isReturn(ret()));
135+
EXPECT_TRUE(Analysis->isReturn(retaa()));
136+
EXPECT_TRUE(Analysis->isReturn(eret()));
137+
}
138+
139+
TEST_P(InstrAnalysisTest, IsBranch) {
140+
EXPECT_TRUE(Analysis->isBranch(beq()));
141+
EXPECT_TRUE(Analysis->isBranch(tbz()));
142+
EXPECT_TRUE(Analysis->isBranch(cbz()));
143+
EXPECT_TRUE(Analysis->isBranch(b()));
144+
EXPECT_FALSE(Analysis->isBranch(bl()));
145+
EXPECT_FALSE(Analysis->isBranch(blr()));
146+
EXPECT_TRUE(Analysis->isBranch(br()));
147+
EXPECT_FALSE(Analysis->isBranch(ret()));
148+
EXPECT_FALSE(Analysis->isBranch(retaa()));
149+
EXPECT_FALSE(Analysis->isBranch(eret()));
150+
}
151+
152+
TEST_P(InstrAnalysisTest, IsConditionalBranch) {
153+
EXPECT_TRUE(Analysis->isConditionalBranch(beq()));
154+
EXPECT_TRUE(Analysis->isConditionalBranch(tbz()));
155+
EXPECT_TRUE(Analysis->isConditionalBranch(cbz()));
156+
EXPECT_FALSE(Analysis->isConditionalBranch(b()));
157+
EXPECT_FALSE(Analysis->isConditionalBranch(bl()));
158+
EXPECT_FALSE(Analysis->isConditionalBranch(blr()));
159+
EXPECT_FALSE(Analysis->isConditionalBranch(ret()));
160+
EXPECT_FALSE(Analysis->isConditionalBranch(retaa()));
161+
EXPECT_FALSE(Analysis->isConditionalBranch(eret()));
162+
}
163+
164+
TEST_P(InstrAnalysisTest, IsUnconditionalBranch) {
165+
EXPECT_FALSE(Analysis->isUnconditionalBranch(beq()));
166+
EXPECT_FALSE(Analysis->isUnconditionalBranch(tbz()));
167+
EXPECT_FALSE(Analysis->isUnconditionalBranch(cbz()));
168+
EXPECT_TRUE(Analysis->isUnconditionalBranch(b()));
169+
EXPECT_FALSE(Analysis->isUnconditionalBranch(bl()));
170+
EXPECT_FALSE(Analysis->isUnconditionalBranch(blr()));
171+
EXPECT_FALSE(Analysis->isUnconditionalBranch(br()));
172+
EXPECT_FALSE(Analysis->isUnconditionalBranch(ret()));
173+
EXPECT_FALSE(Analysis->isUnconditionalBranch(retaa()));
174+
EXPECT_FALSE(Analysis->isUnconditionalBranch(eret()));
175+
}
176+
177+
TEST_P(InstrAnalysisTest, IsIndirectBranch) {
178+
EXPECT_FALSE(Analysis->isIndirectBranch(beq()));
179+
EXPECT_FALSE(Analysis->isIndirectBranch(tbz()));
180+
EXPECT_FALSE(Analysis->isIndirectBranch(cbz()));
181+
EXPECT_FALSE(Analysis->isIndirectBranch(b()));
182+
EXPECT_FALSE(Analysis->isIndirectBranch(bl()));
183+
EXPECT_FALSE(Analysis->isIndirectBranch(blr()));
184+
EXPECT_TRUE(Analysis->isIndirectBranch(br()));
185+
EXPECT_FALSE(Analysis->isIndirectBranch(ret()));
186+
EXPECT_FALSE(Analysis->isIndirectBranch(retaa()));
187+
EXPECT_FALSE(Analysis->isIndirectBranch(eret()));
188+
}
189+
190+
INSTANTIATE_TEST_SUITE_P(AArch64, InstrAnalysisTest,
191+
testing::Values("aarch64"));

0 commit comments

Comments
 (0)