1 | //===- DataLayoutUpgradeTest.cpp - Tests for DataLayout upgrades ----------===// |
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/IR/AutoUpgrade.h" |
10 | #include "gtest/gtest.h" |
11 | |
12 | using namespace llvm; |
13 | |
14 | namespace { |
15 | |
16 | TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) { |
17 | std::string DL1 = |
18 | UpgradeDataLayoutString(DL: "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128" , |
19 | Triple: "x86_64-unknown-linux-gnu" ); |
20 | std::string DL2 = UpgradeDataLayoutString( |
21 | DL: "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32" , Triple: "i686-pc-windows-msvc" ); |
22 | std::string DL3 = UpgradeDataLayoutString( |
23 | DL: "e-m:o-i64:64-f80:128-n8:16:32:64-S128" , Triple: "x86_64-apple-macosx" ); |
24 | EXPECT_EQ(DL1, |
25 | "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128" |
26 | "-f80:128-n8:16:32:64-S128" ); |
27 | EXPECT_EQ(DL2, |
28 | "e-m:w-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128" |
29 | "-f80:128-n8:16:32-S32" ); |
30 | EXPECT_EQ(DL3, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:" |
31 | "128-n8:16:32:64-S128" ); |
32 | |
33 | // Check that AMDGPU targets add -G1 if it's not present. |
34 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32" , "r600" ), "e-p:32:32-G1" ); |
35 | // and that ANDGCN adds p7 and p8 as well. |
36 | EXPECT_EQ( |
37 | UpgradeDataLayoutString("e-p:64:64" , "amdgcn" ), |
38 | "e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32" ); |
39 | EXPECT_EQ( |
40 | UpgradeDataLayoutString("e-p:64:64-G1" , "amdgcn" ), |
41 | "e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32" ); |
42 | // but that r600 does not. |
43 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G1" , "r600" ), "e-p:32:32-G1" ); |
44 | |
45 | // Ensure that the non-integral direction for address space 8 doesn't get |
46 | // added in to pointer declarations. |
47 | EXPECT_EQ( |
48 | UpgradeDataLayoutString( |
49 | "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:" |
50 | "64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-" |
51 | "v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7" , |
52 | "amdgcn" ), |
53 | "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-" |
54 | "v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:" |
55 | "1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-" |
56 | "p9:192:256:256:32" ); |
57 | |
58 | // Check that RISCV64 upgrades -n64 to -n32:64. |
59 | EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128" , |
60 | "riscv64" ), |
61 | "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128" ); |
62 | |
63 | // Check that SPIR && SPIRV targets add -G1 if it's not present. |
64 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32" , "spir" ), "e-p:32:32-G1" ); |
65 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32" , "spir64" ), "e-p:32:32-G1" ); |
66 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32" , "spirv32" ), "e-p:32:32-G1" ); |
67 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32" , "spirv64" ), "e-p:32:32-G1" ); |
68 | // but that SPIRV Logical does not. |
69 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32" , "spirv" ), "e-p:32:32" ); |
70 | } |
71 | |
72 | TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) { |
73 | std::string DL1 = UpgradeDataLayoutString( |
74 | DL: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-" |
75 | "f32:32:32" |
76 | "-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" |
77 | "-n8:16:32:64-S128" , |
78 | Triple: "x86_64-unknown-linux-gnu" ); |
79 | std::string DL2 = UpgradeDataLayoutString(DL: "e-m:e-i64:64-n32:64" , |
80 | Triple: "powerpc64le-unknown-linux-gnu" ); |
81 | std::string DL3 = |
82 | UpgradeDataLayoutString(DL: "e-m:o-i64:64-i128:128-n32:64-S128" , Triple: "aarch64--" ); |
83 | EXPECT_EQ( |
84 | DL1, |
85 | "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128" |
86 | "-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64" |
87 | "-f80:128:128-n8:16:32:64-S128" ); |
88 | EXPECT_EQ(DL2, "e-m:e-i64:64-n32:64" ); |
89 | EXPECT_EQ(DL3, "e-m:o-i64:64-i128:128-n32:64-S128" ); |
90 | |
91 | // Check that AMDGPU targets don't add -G1 if there is already a -G flag. |
92 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2" , "r600" ), "e-p:32:32-G2" ); |
93 | EXPECT_EQ(UpgradeDataLayoutString("G2" , "r600" ), "G2" ); |
94 | EXPECT_EQ( |
95 | UpgradeDataLayoutString("e-p:64:64-G2" , "amdgcn" ), |
96 | "e-p:64:64-G2-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32" ); |
97 | EXPECT_EQ( |
98 | UpgradeDataLayoutString("G2-e-p:64:64" , "amdgcn" ), |
99 | "G2-e-p:64:64-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32" ); |
100 | EXPECT_EQ( |
101 | UpgradeDataLayoutString("e-p:64:64-G0" , "amdgcn" ), |
102 | "e-p:64:64-G0-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32" ); |
103 | |
104 | // Check that AMDGCN targets don't add already declared address space 7. |
105 | EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p7:64:64" , "amdgcn" ), |
106 | "e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128-p9:192:256:256:32" ); |
107 | EXPECT_EQ(UpgradeDataLayoutString("p7:64:64-G2-e-p:64:64" , "amdgcn" ), |
108 | "p7:64:64-G2-e-p:64:64-ni:7:8:9-p8:128:128-p9:192:256:256:32" ); |
109 | EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p7:64:64-G1" , "amdgcn" ), |
110 | "e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128-p9:192:256:256:32" ); |
111 | |
112 | // Check that SPIR & SPIRV targets don't add -G1 if there is already a -G |
113 | // flag. |
114 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2" , "spir" ), "e-p:32:32-G2" ); |
115 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2" , "spir64" ), "e-p:32:32-G2" ); |
116 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2" , "spirv32" ), "e-p:32:32-G2" ); |
117 | EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2" , "spirv64" ), "e-p:32:32-G2" ); |
118 | EXPECT_EQ(UpgradeDataLayoutString("G2" , "spir" ), "G2" ); |
119 | EXPECT_EQ(UpgradeDataLayoutString("G2" , "spir64" ), "G2" ); |
120 | EXPECT_EQ(UpgradeDataLayoutString("G2" , "spirv32" ), "G2" ); |
121 | EXPECT_EQ(UpgradeDataLayoutString("G2" , "spirv64" ), "G2" ); |
122 | } |
123 | |
124 | TEST(DataLayoutUpgradeTest, EmptyDataLayout) { |
125 | std::string DL1 = UpgradeDataLayoutString(DL: "" , Triple: "x86_64-unknown-linux-gnu" ); |
126 | std::string DL2 = UpgradeDataLayoutString( |
127 | DL: "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128" , Triple: "" ); |
128 | EXPECT_EQ(DL1, "" ); |
129 | EXPECT_EQ(DL2, "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128" ); |
130 | |
131 | // Check that AMDGPU targets add G1 if it's not present. |
132 | EXPECT_EQ(UpgradeDataLayoutString("" , "r600" ), "G1" ); |
133 | EXPECT_EQ(UpgradeDataLayoutString("" , "amdgcn" ), |
134 | "G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32" ); |
135 | |
136 | // Check that SPIR & SPIRV targets add G1 if it's not present. |
137 | EXPECT_EQ(UpgradeDataLayoutString("" , "spir" ), "G1" ); |
138 | EXPECT_EQ(UpgradeDataLayoutString("" , "spir64" ), "G1" ); |
139 | EXPECT_EQ(UpgradeDataLayoutString("" , "spirv32" ), "G1" ); |
140 | EXPECT_EQ(UpgradeDataLayoutString("" , "spirv64" ), "G1" ); |
141 | // but SPIRV Logical does not. |
142 | EXPECT_EQ(UpgradeDataLayoutString("" , "spirv" ), "" ); |
143 | } |
144 | |
145 | } // end namespace |
146 | |