xref: /llvm-project/llvm/unittests/Target/DirectX/CBufferDataLayoutTests.cpp (revision 7c3ea2db37dce5e7b06dc9c8a3e0731d34b4e8bd)
1944f4b28SXiang Li //===- llvm/unittests/Target/DirectX/CBufferDataLayoutTests.cpp -----------===//
2944f4b28SXiang Li //
3944f4b28SXiang Li // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4944f4b28SXiang Li // See https://llvm.org/LICENSE.txt for license information.
5944f4b28SXiang Li // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6944f4b28SXiang Li //
7944f4b28SXiang Li //===----------------------------------------------------------------------===//
8944f4b28SXiang Li 
9944f4b28SXiang Li #include "CBufferDataLayout.h"
10944f4b28SXiang Li #include "llvm/IR/DataLayout.h"
11944f4b28SXiang Li #include "llvm/IR/Instructions.h"
12944f4b28SXiang Li #include "llvm/IR/LLVMContext.h"
13944f4b28SXiang Li #include "llvm/IR/Type.h"
14944f4b28SXiang Li 
15944f4b28SXiang Li #include "gmock/gmock.h"
16944f4b28SXiang Li #include "gtest/gtest.h"
17944f4b28SXiang Li 
18944f4b28SXiang Li using ::testing::Contains;
19944f4b28SXiang Li using ::testing::Pair;
20944f4b28SXiang Li 
21944f4b28SXiang Li using namespace llvm;
22944f4b28SXiang Li using namespace llvm::dxil;
23944f4b28SXiang Li 
checkLegacyLayout(CBufferDataLayout & CBDL,Type * T16,Type * T32,Type * T64)24944f4b28SXiang Li void checkLegacyLayout(CBufferDataLayout &CBDL, Type *T16, Type *T32,
25944f4b28SXiang Li                        Type *T64) {
26944f4b28SXiang Li   // Basic types.
27*7c3ea2dbSFangrui Song   EXPECT_EQ(2ULL, CBDL.getTypeAllocSizeInBytes(T16).getFixedValue());
28*7c3ea2dbSFangrui Song   EXPECT_EQ(4ULL, CBDL.getTypeAllocSizeInBytes(T32).getFixedValue());
29*7c3ea2dbSFangrui Song   EXPECT_EQ(8ULL, CBDL.getTypeAllocSizeInBytes(T64).getFixedValue());
30944f4b28SXiang Li   // Vector types.
31944f4b28SXiang Li   Type *T16V2 = FixedVectorType::get(T16, 2);
32944f4b28SXiang Li   Type *T32V2 = FixedVectorType::get(T32, 2);
33944f4b28SXiang Li   Type *T64V2 = FixedVectorType::get(T64, 2);
34944f4b28SXiang Li   Type *T16V3 = FixedVectorType::get(T16, 3);
35944f4b28SXiang Li   Type *T32V3 = FixedVectorType::get(T32, 3);
36944f4b28SXiang Li   Type *T64V3 = FixedVectorType::get(T64, 3);
37944f4b28SXiang Li   Type *T16V4 = FixedVectorType::get(T16, 4);
38944f4b28SXiang Li   Type *T32V4 = FixedVectorType::get(T32, 4);
39944f4b28SXiang Li   Type *T64V4 = FixedVectorType::get(T64, 4);
40*7c3ea2dbSFangrui Song   EXPECT_EQ(4ULL, CBDL.getTypeAllocSizeInBytes(T16V2).getFixedValue());
41*7c3ea2dbSFangrui Song   EXPECT_EQ(8ULL, CBDL.getTypeAllocSizeInBytes(T32V2).getFixedValue());
42*7c3ea2dbSFangrui Song   EXPECT_EQ(16ULL, CBDL.getTypeAllocSizeInBytes(T64V2).getFixedValue());
43*7c3ea2dbSFangrui Song   EXPECT_EQ(6ULL, CBDL.getTypeAllocSizeInBytes(T16V3).getFixedValue());
44*7c3ea2dbSFangrui Song   EXPECT_EQ(12ULL, CBDL.getTypeAllocSizeInBytes(T32V3).getFixedValue());
45*7c3ea2dbSFangrui Song   EXPECT_EQ(24ULL, CBDL.getTypeAllocSizeInBytes(T64V3).getFixedValue());
46*7c3ea2dbSFangrui Song   EXPECT_EQ(8ULL, CBDL.getTypeAllocSizeInBytes(T16V4).getFixedValue());
47*7c3ea2dbSFangrui Song   EXPECT_EQ(16ULL, CBDL.getTypeAllocSizeInBytes(T32V4).getFixedValue());
48*7c3ea2dbSFangrui Song   EXPECT_EQ(32ULL, CBDL.getTypeAllocSizeInBytes(T64V4).getFixedValue());
49944f4b28SXiang Li 
50944f4b28SXiang Li   // Array types.
51944f4b28SXiang Li 
52944f4b28SXiang Li   ArrayType *T16A3 = ArrayType::get(T16, 3);
53944f4b28SXiang Li   ArrayType *T32A3 = ArrayType::get(T32, 3);
54944f4b28SXiang Li   ArrayType *T64A3 = ArrayType::get(T64, 3);
55944f4b28SXiang Li 
56*7c3ea2dbSFangrui Song   EXPECT_EQ(34ULL, CBDL.getTypeAllocSizeInBytes(T16A3).getFixedValue());
57*7c3ea2dbSFangrui Song   EXPECT_EQ(36ULL, CBDL.getTypeAllocSizeInBytes(T32A3).getFixedValue());
58*7c3ea2dbSFangrui Song   EXPECT_EQ(40ULL, CBDL.getTypeAllocSizeInBytes(T64A3).getFixedValue());
59944f4b28SXiang Li 
60944f4b28SXiang Li   ArrayType *T16V3A3 = ArrayType::get(T16V3, 3);
61944f4b28SXiang Li   ArrayType *T32V3A3 = ArrayType::get(T32V3, 3);
62944f4b28SXiang Li   ArrayType *T64V3A3 = ArrayType::get(T64V3, 3);
63944f4b28SXiang Li 
64*7c3ea2dbSFangrui Song   EXPECT_EQ(38ULL, CBDL.getTypeAllocSizeInBytes(T16V3A3).getFixedValue());
65*7c3ea2dbSFangrui Song   EXPECT_EQ(44ULL, CBDL.getTypeAllocSizeInBytes(T32V3A3).getFixedValue());
66*7c3ea2dbSFangrui Song   EXPECT_EQ(88ULL, CBDL.getTypeAllocSizeInBytes(T64V3A3).getFixedValue());
67944f4b28SXiang Li 
68944f4b28SXiang Li   ArrayType *T16V3A3A3 = ArrayType::get(T16V3A3, 3);
69944f4b28SXiang Li   ArrayType *T32V3A3A3 = ArrayType::get(T32V3A3, 3);
70944f4b28SXiang Li   ArrayType *T64V3A3A3 = ArrayType::get(T64V3A3, 3);
71944f4b28SXiang Li 
72944f4b28SXiang Li   EXPECT_EQ((48 * 2 + 38ULL),
73*7c3ea2dbSFangrui Song             CBDL.getTypeAllocSizeInBytes(T16V3A3A3).getFixedValue());
74944f4b28SXiang Li   EXPECT_EQ((48 * 2 + 44ULL),
75*7c3ea2dbSFangrui Song             CBDL.getTypeAllocSizeInBytes(T32V3A3A3).getFixedValue());
76944f4b28SXiang Li   EXPECT_EQ((96 * 2 + 88ULL),
77*7c3ea2dbSFangrui Song             CBDL.getTypeAllocSizeInBytes(T64V3A3A3).getFixedValue());
78944f4b28SXiang Li 
79944f4b28SXiang Li   // Struct types.
80944f4b28SXiang Li   StructType *BasicMix0 = StructType::get(T16, T32, T64);
81944f4b28SXiang Li   StructType *BasicMix1 = StructType::get(T16, T64, T32);
82944f4b28SXiang Li   StructType *BasicMix2 = StructType::get(T32, T64, T16);
83944f4b28SXiang Li   StructType *BasicMix3 = StructType::get(T32, T16, T64);
84944f4b28SXiang Li   StructType *BasicMix4 = StructType::get(T64, T16, T32);
85944f4b28SXiang Li   StructType *BasicMix5 = StructType::get(T64, T32, T16);
86944f4b28SXiang Li 
87*7c3ea2dbSFangrui Song   EXPECT_EQ(16ULL, CBDL.getTypeAllocSizeInBytes(BasicMix0).getFixedValue());
88*7c3ea2dbSFangrui Song   EXPECT_EQ(20ULL, CBDL.getTypeAllocSizeInBytes(BasicMix1).getFixedValue());
89*7c3ea2dbSFangrui Song   EXPECT_EQ(18ULL, CBDL.getTypeAllocSizeInBytes(BasicMix2).getFixedValue());
90*7c3ea2dbSFangrui Song   EXPECT_EQ(16ULL, CBDL.getTypeAllocSizeInBytes(BasicMix3).getFixedValue());
91*7c3ea2dbSFangrui Song   EXPECT_EQ(16ULL, CBDL.getTypeAllocSizeInBytes(BasicMix4).getFixedValue());
92*7c3ea2dbSFangrui Song   EXPECT_EQ(14ULL, CBDL.getTypeAllocSizeInBytes(BasicMix5).getFixedValue());
93944f4b28SXiang Li 
94944f4b28SXiang Li   StructType *VecMix0 = StructType::get(T16V3, T16, T32, T64V2);
95944f4b28SXiang Li   StructType *VecMix1 = StructType::get(T16V3, T32, T64V2, T16);
96944f4b28SXiang Li   StructType *VecMix2 = StructType::get(T16V3, T64, T32V2, T16);
97944f4b28SXiang Li   StructType *VecMix3 = StructType::get(T32V3, T64, T16V2, T32);
98944f4b28SXiang Li   StructType *VecMix4 = StructType::get(T32V3, T16, T16V2, T64);
99944f4b28SXiang Li   StructType *VecMix5 = StructType::get(T32V3, T64V3, T16V2, T64);
100944f4b28SXiang Li 
101*7c3ea2dbSFangrui Song   EXPECT_EQ(32ULL, CBDL.getTypeAllocSizeInBytes(VecMix0).getFixedValue());
102*7c3ea2dbSFangrui Song   EXPECT_EQ(34ULL, CBDL.getTypeAllocSizeInBytes(VecMix1).getFixedValue());
103*7c3ea2dbSFangrui Song   EXPECT_EQ(26ULL, CBDL.getTypeAllocSizeInBytes(VecMix2).getFixedValue());
104*7c3ea2dbSFangrui Song   EXPECT_EQ(32ULL, CBDL.getTypeAllocSizeInBytes(VecMix3).getFixedValue());
105*7c3ea2dbSFangrui Song   EXPECT_EQ(32ULL, CBDL.getTypeAllocSizeInBytes(VecMix4).getFixedValue());
106*7c3ea2dbSFangrui Song   EXPECT_EQ(56ULL, CBDL.getTypeAllocSizeInBytes(VecMix5).getFixedValue());
107944f4b28SXiang Li 
108944f4b28SXiang Li   StructType *ArrayMix0 = StructType::get(T16A3, T16, T32, T64A3);
109944f4b28SXiang Li   StructType *ArrayMix1 = StructType::get(T32A3, T16, T32, T16A3);
110944f4b28SXiang Li   StructType *ArrayMix2 = StructType::get(T16A3, T32, T64, T32A3);
111944f4b28SXiang Li   StructType *ArrayMix3 = StructType::get(T32A3, T32, T64, T16A3);
112944f4b28SXiang Li   StructType *ArrayMix4 = StructType::get(T16A3, T64, T16, T64A3);
113944f4b28SXiang Li   StructType *ArrayMix5 = StructType::get(T32A3, T64, T16, T32A3);
114944f4b28SXiang Li 
115*7c3ea2dbSFangrui Song   EXPECT_EQ(88ULL, CBDL.getTypeAllocSizeInBytes(ArrayMix0).getFixedValue());
116*7c3ea2dbSFangrui Song   EXPECT_EQ(82ULL, CBDL.getTypeAllocSizeInBytes(ArrayMix1).getFixedValue());
117*7c3ea2dbSFangrui Song   EXPECT_EQ(84ULL, CBDL.getTypeAllocSizeInBytes(ArrayMix2).getFixedValue());
118*7c3ea2dbSFangrui Song   EXPECT_EQ(82ULL, CBDL.getTypeAllocSizeInBytes(ArrayMix3).getFixedValue());
119*7c3ea2dbSFangrui Song   EXPECT_EQ(104ULL, CBDL.getTypeAllocSizeInBytes(ArrayMix4).getFixedValue());
120*7c3ea2dbSFangrui Song   EXPECT_EQ(100ULL, CBDL.getTypeAllocSizeInBytes(ArrayMix5).getFixedValue());
121944f4b28SXiang Li 
122944f4b28SXiang Li   StructType *StructMix0 = StructType::get(T16A3, T16, T32, ArrayMix0);
123944f4b28SXiang Li   StructType *StructMix1 = StructType::get(StructMix0, T16, T32, ArrayMix1);
124944f4b28SXiang Li   ArrayType *StructArray0 = ArrayType::get(StructMix1, 3);
125944f4b28SXiang Li   StructType *StructMix2 = StructType::get(StructArray0, T64);
126944f4b28SXiang Li   ArrayType *StructArray1 = ArrayType::get(StructMix2, 3);
127944f4b28SXiang Li   StructType *StructMix3 = StructType::get(StructArray1, T32);
128*7c3ea2dbSFangrui Song   EXPECT_EQ(136ULL, CBDL.getTypeAllocSizeInBytes(StructMix0).getFixedValue());
129*7c3ea2dbSFangrui Song   EXPECT_EQ(226ULL, CBDL.getTypeAllocSizeInBytes(StructMix1).getFixedValue());
130*7c3ea2dbSFangrui Song   EXPECT_EQ(706ULL, CBDL.getTypeAllocSizeInBytes(StructArray0).getFixedValue());
131*7c3ea2dbSFangrui Song   EXPECT_EQ(720ULL, CBDL.getTypeAllocSizeInBytes(StructMix2).getFixedValue());
132*7c3ea2dbSFangrui Song   EXPECT_EQ(2160ULL,
133*7c3ea2dbSFangrui Song             CBDL.getTypeAllocSizeInBytes(StructArray1).getFixedValue());
134*7c3ea2dbSFangrui Song   EXPECT_EQ(2164ULL, CBDL.getTypeAllocSizeInBytes(StructMix3).getFixedValue());
135944f4b28SXiang Li }
136944f4b28SXiang Li 
TEST(CBufferDataLayout,LegacyLayout)137944f4b28SXiang Li TEST(CBufferDataLayout, LegacyLayout) {
138944f4b28SXiang Li   LLVMContext Context;
139944f4b28SXiang Li   llvm::DataLayout DL("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-"
140944f4b28SXiang Li                       "f32:32-f64:64-n8:16:32:64");
141944f4b28SXiang Li 
142944f4b28SXiang Li   CBufferDataLayout CBDL(DL, true);
143944f4b28SXiang Li 
144944f4b28SXiang Li   Type *F16 = Type::getHalfTy(Context);
145944f4b28SXiang Li   Type *F32 = Type::getFloatTy(Context);
146944f4b28SXiang Li   Type *F64 = Type::getDoubleTy(Context);
147944f4b28SXiang Li 
148944f4b28SXiang Li   Type *I16 = Type::getInt16Ty(Context);
149944f4b28SXiang Li   Type *I32 = Type::getInt32Ty(Context);
150944f4b28SXiang Li   Type *I64 = Type::getInt64Ty(Context);
151944f4b28SXiang Li 
152944f4b28SXiang Li   checkLegacyLayout(CBDL, F16, F32, F64);
153944f4b28SXiang Li   checkLegacyLayout(CBDL, I16, I32, I64);
154944f4b28SXiang Li }
155