Skip to content

Commit f5ee2b5

Browse files
committed
[AArch64] Unit test for scalable isLegalAddImmediate
1 parent dd3e5f3 commit f5ee2b5

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

llvm/unittests/Target/AArch64/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ add_llvm_target_unittest(AArch64Tests
2929
MatrixRegisterAliasing.cpp
3030
SMEAttributesTest.cpp
3131
AArch64SVESchedPseudoTest.cpp
32+
Immediates.cpp
3233
)
3334

3435
set_property(TARGET AArch64Tests PROPERTY FOLDER "Tests/UnitTests/TargetTests")
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include "AArch64Subtarget.h"
2+
#include "AArch64TargetMachine.h"
3+
#include "llvm/IR/DataLayout.h"
4+
#include "llvm/MC/TargetRegistry.h"
5+
#include "llvm/Support/TargetSelect.h"
6+
7+
#include "gtest/gtest.h"
8+
#include <initializer_list>
9+
#include <memory>
10+
11+
using namespace llvm;
12+
13+
namespace {
14+
15+
struct TestCase {
16+
int64_t FixedImm;
17+
int64_t ScalableImm;
18+
bool Result;
19+
};
20+
21+
const std::initializer_list<TestCase> Tests = {
22+
// FixedImm, ScalableImm, Result
23+
// No change, easily 'supported'
24+
{0, 0, true},
25+
26+
// Simple fixed immediate cases
27+
// +8
28+
{8, 0, true},
29+
// -16
30+
{-16, 0, true},
31+
32+
// Scalable; addvl increments by whole registers, range [-32,31]
33+
// +(16 * vscale), one register's worth
34+
{0, 16, false},
35+
// +(8 * vscale), half a register's worth
36+
{0, 8, false},
37+
// -(32 * 16 * vscale)
38+
{0, -512, false},
39+
// -(33 * 16 * vscale)
40+
{0, -528, false},
41+
// +(31 * 16 * vscale)
42+
{0, 496, false},
43+
// +(32 * 16 * vscale)
44+
{0, 512, false},
45+
46+
// Mixed; not supported.
47+
// +(16 + (16 * vscale)) -- one register's worth + 16
48+
{16, 16, false},
49+
};
50+
} // namespace
51+
52+
TEST(Immediates, Immediates) {
53+
LLVMInitializeAArch64TargetInfo();
54+
LLVMInitializeAArch64Target();
55+
LLVMInitializeAArch64TargetMC();
56+
57+
std::string Error;
58+
auto TT = Triple::normalize("aarch64");
59+
const Target *T = TargetRegistry::lookupTarget(TT, Error);
60+
61+
std::unique_ptr<TargetMachine> TM(
62+
T->createTargetMachine(TT, "generic", "+sve", TargetOptions(),
63+
std::nullopt, std::nullopt,
64+
CodeGenOptLevel::Default));
65+
AArch64Subtarget ST(TM->getTargetTriple(), TM->getTargetCPU(),
66+
TM->getTargetCPU(), TM->getTargetFeatureString(), *TM,
67+
true);
68+
69+
auto *TLI = ST.getTargetLowering();
70+
71+
for (const auto &Test : Tests) {
72+
ASSERT_EQ(TLI->isLegalAddImmediate(Test.FixedImm, Test.ScalableImm),
73+
Test.Result);
74+
}
75+
}

0 commit comments

Comments
 (0)