xref: /llvm-project/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp (revision c5ab70c508457eaece5d7ff4ab79a2f90bc67f06)
168eae498SAmy Huang //===- DataLayoutUpgradeTest.cpp - Tests for DataLayout upgrades ----------===//
268eae498SAmy Huang //
368eae498SAmy Huang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
468eae498SAmy Huang // See https://llvm.org/LICENSE.txt for license information.
568eae498SAmy Huang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
668eae498SAmy Huang //
768eae498SAmy Huang //===----------------------------------------------------------------------===//
868eae498SAmy Huang 
968eae498SAmy Huang #include "llvm/IR/AutoUpgrade.h"
1068eae498SAmy Huang #include "gtest/gtest.h"
1168eae498SAmy Huang 
1268eae498SAmy Huang using namespace llvm;
1368eae498SAmy Huang 
1468eae498SAmy Huang namespace {
1568eae498SAmy Huang 
1668eae498SAmy Huang TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
1768eae498SAmy Huang   std::string DL1 =
1868eae498SAmy Huang       UpgradeDataLayoutString("e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128",
1968eae498SAmy Huang                               "x86_64-unknown-linux-gnu");
2068eae498SAmy Huang   std::string DL2 = UpgradeDataLayoutString(
2168eae498SAmy Huang       "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32", "i686-pc-windows-msvc");
22a21abc78SHarald van Dijk   std::string DL3 = UpgradeDataLayoutString(
23a21abc78SHarald van Dijk       "e-m:o-i64:64-f80:128-n8:16:32:64-S128", "x86_64-apple-macosx");
24ddecadabSDoug Wyatt   std::string DL4 =
25ddecadabSDoug Wyatt       UpgradeDataLayoutString("e-m:o-i64:64-i128:128-n32:64-S128", "aarch64--");
26c9f27275SDaniel Paoliello   std::string DL5 = UpgradeDataLayoutString(
27c9f27275SDaniel Paoliello       "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "aarch64--");
28a21abc78SHarald van Dijk   EXPECT_EQ(DL1,
29a21abc78SHarald van Dijk             "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128"
3068eae498SAmy Huang             "-f80:128-n8:16:32:64-S128");
31a21abc78SHarald van Dijk   EXPECT_EQ(DL2,
32a21abc78SHarald van Dijk             "e-m:w-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128"
3337d1d022SPhoebe Wang             "-f80:128-n8:16:32-S32");
34a21abc78SHarald van Dijk   EXPECT_EQ(DL3, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:"
35a21abc78SHarald van Dijk                  "128-n8:16:32:64-S128");
36c9f27275SDaniel Paoliello   EXPECT_EQ(DL4, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:"
37c9f27275SDaniel Paoliello                  "64-S128-Fn32");
38c9f27275SDaniel Paoliello   EXPECT_EQ(DL5, "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:"
39c9f27275SDaniel Paoliello                  "64-i128:128-n32:64-S128-Fn32");
4051e09e1dSAlex Richardson 
4151e09e1dSAlex Richardson   // Check that AMDGPU targets add -G1 if it's not present.
4251e09e1dSAlex Richardson   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "r600"), "e-p:32:32-G1");
43f0415f2aSKrzysztof Drewniak   // and that ANDGCN adds p7 and p8 as well.
4432f9983cSJessica Del   EXPECT_EQ(
4532f9983cSJessica Del       UpgradeDataLayoutString("e-p:64:64", "amdgcn"),
4632f9983cSJessica Del       "e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
4732f9983cSJessica Del   EXPECT_EQ(
4832f9983cSJessica Del       UpgradeDataLayoutString("e-p:64:64-G1", "amdgcn"),
4932f9983cSJessica Del       "e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
50f0415f2aSKrzysztof Drewniak   // but that r600 does not.
51f0415f2aSKrzysztof Drewniak   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G1", "r600"), "e-p:32:32-G1");
52f0415f2aSKrzysztof Drewniak 
53f0415f2aSKrzysztof Drewniak   // Ensure that the non-integral direction for address space 8 doesn't get
54f0415f2aSKrzysztof Drewniak   // added in to pointer declarations.
55f0415f2aSKrzysztof Drewniak   EXPECT_EQ(
56f0415f2aSKrzysztof Drewniak       UpgradeDataLayoutString(
57f0415f2aSKrzysztof Drewniak           "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:"
58f0415f2aSKrzysztof Drewniak           "64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-"
59f0415f2aSKrzysztof Drewniak           "v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7",
60f0415f2aSKrzysztof Drewniak           "amdgcn"),
61f0415f2aSKrzysztof Drewniak       "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-"
62f0415f2aSKrzysztof Drewniak       "v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:"
6332f9983cSJessica Del       "1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-"
6432f9983cSJessica Del       "p9:192:256:256:32");
65974e2e69SCraig Topper 
66974e2e69SCraig Topper   // Check that RISCV64 upgrades -n64 to -n32:64.
67974e2e69SCraig Topper   EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",
68974e2e69SCraig Topper                                     "riscv64"),
69974e2e69SCraig Topper             "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
701120d8e6SAlex Voicu 
7146edc02eShev   // Check that LoongArch64 upgrades -n64 to -n32:64.
7246edc02eShev   EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",
7346edc02eShev                                     "loongarch64"),
7446edc02eShev             "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
7546edc02eShev 
76dbad963aSKoakuma   // Check that SPARC targets add -i128:128.
77dbad963aSKoakuma   EXPECT_EQ(
78dbad963aSKoakuma       UpgradeDataLayoutString("E-m:e-p:32:32-i64:64-f128:64-n32-S64", "sparc"),
79dbad963aSKoakuma       "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64");
80dbad963aSKoakuma   EXPECT_EQ(UpgradeDataLayoutString("E-m:e-i64:64-n32:64-S128", "sparcv9"),
81dbad963aSKoakuma             "E-m:e-i64:64-i128:128-n32:64-S128");
82dbad963aSKoakuma 
8386e4beb7Syingopq   // Check that MIPS64 targets add -i128:128.
8486e4beb7Syingopq   EXPECT_EQ(UpgradeDataLayoutString(
8586e4beb7Syingopq                 "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128", "mips64"),
8686e4beb7Syingopq             "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
8786e4beb7Syingopq   EXPECT_EQ(UpgradeDataLayoutString(
8886e4beb7Syingopq                 "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128", "mips64el"),
8986e4beb7Syingopq             "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
9086e4beb7Syingopq   // but that MIPS64 with o32 does not.
9186e4beb7Syingopq   EXPECT_EQ(UpgradeDataLayoutString(
9286e4beb7Syingopq                 "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64", "mips64el"),
9386e4beb7Syingopq             "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
9486e4beb7Syingopq 
95a13ec9cdSLei Huang   // Check that PowerPC64 targets add -i128:128.
96a13ec9cdSLei Huang   EXPECT_EQ(UpgradeDataLayoutString("e-m:e-i64:64-n32:64", "powerpc64le-linux"),
97a13ec9cdSLei Huang             "e-m:e-i64:64-i128:128-n32:64");
98a13ec9cdSLei Huang   EXPECT_EQ(
99a13ec9cdSLei Huang       UpgradeDataLayoutString("E-m:e-Fn32-i64:64-n32:64", "powerpc64-linux"),
100a13ec9cdSLei Huang       "E-m:e-Fn32-i64:64-i128:128-n32:64");
101a13ec9cdSLei Huang   EXPECT_EQ(
102a13ec9cdSLei Huang       UpgradeDataLayoutString("E-m:a-Fi64-i64:64-n32:64", "powerpc64-ibm-aix"),
103a13ec9cdSLei Huang       "E-m:a-Fi64-i64:64-i128:128-n32:64");
104a13ec9cdSLei Huang 
105*c5ab70c5SDan Gohman   // Check that WebAssembly targets add -i128:128.
106*c5ab70c5SDan Gohman   EXPECT_EQ(
107*c5ab70c5SDan Gohman       UpgradeDataLayoutString(
108*c5ab70c5SDan Gohman           "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20",
109*c5ab70c5SDan Gohman           "wasm32"),
110*c5ab70c5SDan Gohman       "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20");
111*c5ab70c5SDan Gohman   EXPECT_EQ(
112*c5ab70c5SDan Gohman       UpgradeDataLayoutString(
113*c5ab70c5SDan Gohman           "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20",
114*c5ab70c5SDan Gohman           "wasm64"),
115*c5ab70c5SDan Gohman       "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20");
116*c5ab70c5SDan Gohman 
1171120d8e6SAlex Voicu   // Check that SPIR && SPIRV targets add -G1 if it's not present.
1181120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir"), "e-p:32:32-G1");
1191120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir64"), "e-p:32:32-G1");
1201120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv32"), "e-p:32:32-G1");
1211120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv64"), "e-p:32:32-G1");
1221120d8e6SAlex Voicu   // but that SPIRV Logical does not.
1231120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv"), "e-p:32:32");
12468eae498SAmy Huang }
12568eae498SAmy Huang 
12668eae498SAmy Huang TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
12768eae498SAmy Huang   std::string DL1 = UpgradeDataLayoutString(
128a21abc78SHarald van Dijk       "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-"
129a21abc78SHarald van Dijk       "f32:32:32"
13068eae498SAmy Huang       "-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
13168eae498SAmy Huang       "-n8:16:32:64-S128",
13268eae498SAmy Huang       "x86_64-unknown-linux-gnu");
133ddecadabSDoug Wyatt   std::string DL3 = UpgradeDataLayoutString(
134c9f27275SDaniel Paoliello       "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32",
135c9f27275SDaniel Paoliello       "aarch64--");
136a21abc78SHarald van Dijk   EXPECT_EQ(
137a21abc78SHarald van Dijk       DL1,
138a21abc78SHarald van Dijk       "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128"
13968eae498SAmy Huang       "-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64"
14068eae498SAmy Huang       "-f80:128:128-n8:16:32:64-S128");
141c9f27275SDaniel Paoliello   EXPECT_EQ(DL3, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:"
142c9f27275SDaniel Paoliello                  "64-S128-Fn32");
14351e09e1dSAlex Richardson 
14451e09e1dSAlex Richardson   // Check that AMDGPU targets don't add -G1 if there is already a -G flag.
14551e09e1dSAlex Richardson   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "r600"), "e-p:32:32-G2");
14651e09e1dSAlex Richardson   EXPECT_EQ(UpgradeDataLayoutString("G2", "r600"), "G2");
14732f9983cSJessica Del   EXPECT_EQ(
14832f9983cSJessica Del       UpgradeDataLayoutString("e-p:64:64-G2", "amdgcn"),
14932f9983cSJessica Del       "e-p:64:64-G2-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
15032f9983cSJessica Del   EXPECT_EQ(
15132f9983cSJessica Del       UpgradeDataLayoutString("G2-e-p:64:64", "amdgcn"),
15232f9983cSJessica Del       "G2-e-p:64:64-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
15332f9983cSJessica Del   EXPECT_EQ(
15432f9983cSJessica Del       UpgradeDataLayoutString("e-p:64:64-G0", "amdgcn"),
15532f9983cSJessica Del       "e-p:64:64-G0-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
156f0415f2aSKrzysztof Drewniak 
157f0415f2aSKrzysztof Drewniak   // Check that AMDGCN targets don't add already declared address space 7.
158f0415f2aSKrzysztof Drewniak   EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p7:64:64", "amdgcn"),
15932f9983cSJessica Del             "e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128-p9:192:256:256:32");
160f0415f2aSKrzysztof Drewniak   EXPECT_EQ(UpgradeDataLayoutString("p7:64:64-G2-e-p:64:64", "amdgcn"),
16132f9983cSJessica Del             "p7:64:64-G2-e-p:64:64-ni:7:8:9-p8:128:128-p9:192:256:256:32");
162f0415f2aSKrzysztof Drewniak   EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p7:64:64-G1", "amdgcn"),
16332f9983cSJessica Del             "e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128-p9:192:256:256:32");
1641120d8e6SAlex Voicu 
1651120d8e6SAlex Voicu   // Check that SPIR & SPIRV targets don't add -G1 if there is already a -G
1661120d8e6SAlex Voicu   // flag.
1671120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spir"), "e-p:32:32-G2");
1681120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spir64"), "e-p:32:32-G2");
1691120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spirv32"), "e-p:32:32-G2");
1701120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spirv64"), "e-p:32:32-G2");
1711120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("G2", "spir"), "G2");
1721120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("G2", "spir64"), "G2");
1731120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("G2", "spirv32"), "G2");
1741120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("G2", "spirv64"), "G2");
175a13ec9cdSLei Huang 
176a13ec9cdSLei Huang   // Check that PowerPC32 targets don't add -i128:128.
177a13ec9cdSLei Huang   EXPECT_EQ(UpgradeDataLayoutString("e-m:e-i64:64-n32", "powerpcle-linux"),
178a13ec9cdSLei Huang             "e-m:e-i64:64-n32");
179a13ec9cdSLei Huang   EXPECT_EQ(UpgradeDataLayoutString("E-m:e-Fn32-i64:64-n32", "powerpc-linux"),
180a13ec9cdSLei Huang             "E-m:e-Fn32-i64:64-n32");
181a13ec9cdSLei Huang   EXPECT_EQ(UpgradeDataLayoutString("E-m:a-Fi64-i64:64-n32", "powerpc-aix"),
182a13ec9cdSLei Huang             "E-m:a-Fi64-i64:64-n32");
18368eae498SAmy Huang }
18468eae498SAmy Huang 
18568eae498SAmy Huang TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
18668eae498SAmy Huang   std::string DL1 = UpgradeDataLayoutString("", "x86_64-unknown-linux-gnu");
18768eae498SAmy Huang   std::string DL2 = UpgradeDataLayoutString(
18868eae498SAmy Huang       "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128", "");
18968eae498SAmy Huang   EXPECT_EQ(DL1, "");
19068eae498SAmy Huang   EXPECT_EQ(DL2, "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128");
19151e09e1dSAlex Richardson 
19251e09e1dSAlex Richardson   // Check that AMDGPU targets add G1 if it's not present.
19351e09e1dSAlex Richardson   EXPECT_EQ(UpgradeDataLayoutString("", "r600"), "G1");
194f0415f2aSKrzysztof Drewniak   EXPECT_EQ(UpgradeDataLayoutString("", "amdgcn"),
19532f9983cSJessica Del             "G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
1961120d8e6SAlex Voicu 
1971120d8e6SAlex Voicu   // Check that SPIR & SPIRV targets add G1 if it's not present.
1981120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("", "spir"), "G1");
1991120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("", "spir64"), "G1");
2001120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("", "spirv32"), "G1");
2011120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("", "spirv64"), "G1");
2021120d8e6SAlex Voicu   // but SPIRV Logical does not.
2031120d8e6SAlex Voicu   EXPECT_EQ(UpgradeDataLayoutString("", "spirv"), "");
20468eae498SAmy Huang }
20568eae498SAmy Huang 
20668eae498SAmy Huang } // end namespace
207