Skip to content

Commit 94f625e

Browse files
darkbuckAlexisPerry
authored andcommitted
[GlobalISel] Add unit tests for call lowering on byref support
Reviewers: tschuett, spaits, aemerson, arsenm Reviewed By: spaits, arsenm Pull Request: llvm#96805
1 parent 9c19349 commit 94f625e

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

llvm/unittests/CodeGen/GlobalISel/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
set(LLVM_LINK_COMPONENTS
22
${LLVM_TARGETS_TO_BUILD}
3+
AsmParser
34
CodeGen
45
CodeGenTypes
56
Core
@@ -26,4 +27,5 @@ add_llvm_unittest(GlobalISelTests
2627
KnownBitsVectorTest.cpp
2728
GISelUtilsTest.cpp
2829
GISelAliasTest.cpp
30+
CallLowering.cpp
2931
)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//===- CallLowering.cpp - CallLowering 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/CodeGen/GlobalISel/CallLowering.h"
10+
#include "llvm/ADT/StringRef.h"
11+
#include "llvm/AsmParser/Parser.h"
12+
#include "llvm/IR/LLVMContext.h"
13+
#include "llvm/IR/Module.h"
14+
#include "llvm/Support/SourceMgr.h"
15+
#include "gtest/gtest.h"
16+
17+
using namespace llvm;
18+
19+
namespace {
20+
struct TargetCallLoweringTest : public CallLowering, testing::Test {
21+
LLVMContext C;
22+
23+
public:
24+
TargetCallLoweringTest() : CallLowering(nullptr) {}
25+
26+
std::unique_ptr<Module> parseIR(const char *IR) {
27+
SMDiagnostic Err;
28+
std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
29+
if (!Mod)
30+
Err.print("TestTargetCallLoweringTest", errs());
31+
return Mod;
32+
}
33+
};
34+
} // namespace
35+
36+
TEST_F(TargetCallLoweringTest, ArgByRef) {
37+
std::unique_ptr<Module> M = parseIR(R"(
38+
define void @foo(ptr %p0, ptr byref(i32) align(4) %p1) {
39+
ret void
40+
}
41+
)");
42+
const DataLayout &DL = M->getDataLayout();
43+
Function *F = M->getFunction("foo");
44+
// Dummy vregs.
45+
SmallVector<Register, 4> VRegs(1, 1);
46+
47+
CallLowering::ArgInfo Arg0(VRegs, F->getArg(0)->getType(), 0);
48+
setArgFlags(Arg0, AttributeList::FirstArgIndex + 0, DL, *F);
49+
EXPECT_TRUE(Arg0.Flags[0].isPointer());
50+
EXPECT_FALSE(Arg0.Flags[0].isByRef());
51+
52+
CallLowering::ArgInfo Arg1(VRegs, F->getArg(1)->getType(), 1);
53+
setArgFlags(Arg1, AttributeList::FirstArgIndex + 1, DL, *F);
54+
EXPECT_TRUE(Arg1.Flags[0].isPointer());
55+
EXPECT_TRUE(Arg1.Flags[0].isByRef());
56+
EXPECT_EQ(Arg1.Flags[0].getByRefSize(), 4U);
57+
}

0 commit comments

Comments
 (0)