xref: /llvm-project/llvm/unittests/CodeGen/CCStateTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
1da42b284SSergei Barannikov //===- CCStateTest.cpp ----------------------------------------------------===//
2da42b284SSergei Barannikov //
3da42b284SSergei Barannikov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4da42b284SSergei Barannikov // See https://llvm.org/LICENSE.txt for license information.
5da42b284SSergei Barannikov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6da42b284SSergei Barannikov //
7da42b284SSergei Barannikov //===----------------------------------------------------------------------===//
8da42b284SSergei Barannikov 
9da42b284SSergei Barannikov #include "llvm/CodeGen/CallingConvLower.h"
10*bb3f5e1fSMatin Raayai #include "llvm/CodeGen/CodeGenTargetMachineImpl.h"
11da42b284SSergei Barannikov #include "llvm/CodeGen/MachineFunction.h"
12da42b284SSergei Barannikov #include "llvm/CodeGen/MachineModuleInfo.h"
13da42b284SSergei Barannikov #include "llvm/CodeGen/TargetFrameLowering.h"
14da42b284SSergei Barannikov #include "llvm/CodeGen/TargetInstrInfo.h"
15da42b284SSergei Barannikov #include "llvm/CodeGen/TargetLowering.h"
16da42b284SSergei Barannikov #include "llvm/CodeGen/TargetRegisterInfo.h"
17da42b284SSergei Barannikov #include "llvm/CodeGen/TargetSubtargetInfo.h"
18da42b284SSergei Barannikov #include "llvm/IR/Module.h"
19da42b284SSergei Barannikov #include "llvm/MC/TargetRegistry.h"
20da42b284SSergei Barannikov #include "gtest/gtest.h"
21da42b284SSergei Barannikov 
22da42b284SSergei Barannikov using namespace llvm;
23da42b284SSergei Barannikov 
24da42b284SSergei Barannikov namespace {
25da42b284SSergei Barannikov 
26da42b284SSergei Barannikov #include "MFCommon.inc"
27da42b284SSergei Barannikov 
28da42b284SSergei Barannikov TEST(CCStateTest, NegativeOffsets) {
29da42b284SSergei Barannikov   LLVMContext Ctx;
30da42b284SSergei Barannikov   Module Mod("Module", Ctx);
31da42b284SSergei Barannikov   auto MF = createMachineFunction(Ctx, Mod);
32da42b284SSergei Barannikov 
33da42b284SSergei Barannikov   SmallVector<CCValAssign, 8> Locs;
34da42b284SSergei Barannikov   CCState Info(CallingConv::C, /*IsVarArg=*/false, *MF, Locs, Ctx,
35da42b284SSergei Barannikov                /*NegativeOffsets=*/true);
36da42b284SSergei Barannikov 
37da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(1, Align(1)), -1);
38da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(1, Align(2)), -2);
39da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(1, Align(2)), -4);
40da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(1, Align(1)), -5);
41da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(2, Align(2)), -8);
42da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(2, Align(2)), -10);
43da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(2, Align(1)), -12);
44da42b284SSergei Barannikov   ASSERT_EQ(Info.AllocateStack(1, Align(1)), -13);
45da42b284SSergei Barannikov   ASSERT_EQ(Info.getStackSize(), 13u);
46da42b284SSergei Barannikov   ASSERT_EQ(Info.getAlignedCallFrameSize(), 14u);
47da42b284SSergei Barannikov }
48da42b284SSergei Barannikov 
49da42b284SSergei Barannikov } // namespace
50