Skip to content

Commit 9bcec7c

Browse files
committed
[AArch64][NFC] Add MCInstrAnalysis unittests
1 parent 0cbb6e7 commit 9bcec7c

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-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: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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 b() { return MCInstBuilder(AArch64::B).addImm(32); }
55+
static MCInst bl() { return MCInstBuilder(AArch64::BL).addImm(32); }
56+
static MCInst br(unsigned Rn = AArch64::X0) {
57+
return MCInstBuilder(AArch64::BR).addReg(Rn);
58+
}
59+
static MCInst ret(unsigned Rn = AArch64::LR) {
60+
return MCInstBuilder(AArch64::RET).addReg(Rn);
61+
}
62+
static MCInst hlt() { return MCInstBuilder(AArch64::HLT); }
63+
static MCInst brk() { return MCInstBuilder(AArch64::BRK); }
64+
65+
TEST_P(InstrAnalysisTest, IsTerminator) {
66+
EXPECT_TRUE(Analysis->isTerminator(beq()));
67+
EXPECT_TRUE(Analysis->isTerminator(tbz()));
68+
EXPECT_TRUE(Analysis->isTerminator(b()));
69+
EXPECT_FALSE(Analysis->isTerminator(bl()));
70+
EXPECT_TRUE(Analysis->isTerminator(br()));
71+
EXPECT_TRUE(Analysis->isTerminator(ret()));
72+
EXPECT_FALSE(Analysis->isTerminator(hlt()));
73+
EXPECT_FALSE(Analysis->isTerminator(brk()));
74+
}
75+
76+
TEST_P(InstrAnalysisTest, IsBarrier) {
77+
EXPECT_FALSE(Analysis->isBarrier(beq()));
78+
EXPECT_FALSE(Analysis->isBarrier(tbz()));
79+
EXPECT_TRUE(Analysis->isBarrier(b()));
80+
EXPECT_FALSE(Analysis->isBarrier(bl()));
81+
EXPECT_TRUE(Analysis->isBarrier(br()));
82+
EXPECT_TRUE(Analysis->isBarrier(ret()));
83+
EXPECT_FALSE(Analysis->isBarrier(hlt()));
84+
EXPECT_FALSE(Analysis->isBarrier(brk()));
85+
}
86+
87+
TEST_P(InstrAnalysisTest, IsCall) {
88+
EXPECT_FALSE(Analysis->isCall(beq()));
89+
EXPECT_FALSE(Analysis->isCall(tbz()));
90+
EXPECT_FALSE(Analysis->isCall(b()));
91+
EXPECT_TRUE(Analysis->isCall(bl()));
92+
EXPECT_FALSE(Analysis->isCall(br()));
93+
EXPECT_FALSE(Analysis->isCall(ret()));
94+
}
95+
96+
TEST_P(InstrAnalysisTest, IsReturn) {
97+
EXPECT_FALSE(Analysis->isReturn(beq()));
98+
EXPECT_FALSE(Analysis->isReturn(tbz()));
99+
EXPECT_FALSE(Analysis->isReturn(b()));
100+
EXPECT_FALSE(Analysis->isReturn(bl()));
101+
EXPECT_FALSE(Analysis->isReturn(br()));
102+
EXPECT_FALSE(Analysis->isReturn(br(AArch64::LR)));
103+
EXPECT_TRUE(Analysis->isReturn(ret()));
104+
}
105+
106+
TEST_P(InstrAnalysisTest, IsBranch) {
107+
EXPECT_TRUE(Analysis->isBranch(beq()));
108+
EXPECT_TRUE(Analysis->isBranch(tbz()));
109+
EXPECT_TRUE(Analysis->isBranch(b()));
110+
EXPECT_FALSE(Analysis->isBranch(bl()));
111+
EXPECT_TRUE(Analysis->isBranch(br()));
112+
EXPECT_FALSE(Analysis->isBranch(ret()));
113+
}
114+
115+
TEST_P(InstrAnalysisTest, IsConditionalBranch) {
116+
EXPECT_TRUE(Analysis->isConditionalBranch(beq()));
117+
EXPECT_TRUE(Analysis->isConditionalBranch(tbz()));
118+
EXPECT_FALSE(Analysis->isConditionalBranch(b()));
119+
EXPECT_FALSE(Analysis->isConditionalBranch(bl()));
120+
EXPECT_FALSE(Analysis->isConditionalBranch(ret()));
121+
}
122+
123+
TEST_P(InstrAnalysisTest, IsUnconditionalBranch) {
124+
EXPECT_FALSE(Analysis->isUnconditionalBranch(beq()));
125+
EXPECT_FALSE(Analysis->isUnconditionalBranch(tbz()));
126+
EXPECT_TRUE(Analysis->isUnconditionalBranch(b()));
127+
EXPECT_FALSE(Analysis->isUnconditionalBranch(bl()));
128+
EXPECT_FALSE(Analysis->isUnconditionalBranch(br()));
129+
EXPECT_FALSE(Analysis->isUnconditionalBranch(ret()));
130+
}
131+
132+
TEST_P(InstrAnalysisTest, IsIndirectBranch) {
133+
EXPECT_FALSE(Analysis->isIndirectBranch(beq()));
134+
EXPECT_FALSE(Analysis->isIndirectBranch(tbz()));
135+
EXPECT_FALSE(Analysis->isIndirectBranch(b()));
136+
EXPECT_FALSE(Analysis->isIndirectBranch(bl()));
137+
EXPECT_TRUE(Analysis->isIndirectBranch(br()));
138+
EXPECT_FALSE(Analysis->isIndirectBranch(ret()));
139+
}
140+
141+
INSTANTIATE_TEST_SUITE_P(AArch64, InstrAnalysisTest,
142+
testing::Values("aarch64"));

0 commit comments

Comments
 (0)