217 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/IR/AutoUpgrade.h"10#include "gtest/gtest.h"11 12using namespace llvm;13 14namespace {15 16TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {17 std::string DL1 =18 UpgradeDataLayoutString("e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128",19 "x86_64-unknown-linux-gnu");20 std::string DL2 = UpgradeDataLayoutString(21 "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32", "i686-pc-windows-msvc");22 std::string DL3 = UpgradeDataLayoutString(23 "e-m:o-i64:64-f80:128-n8:16:32:64-S128", "x86_64-apple-macosx");24 std::string DL4 =25 UpgradeDataLayoutString("e-m:o-i64:64-i128:128-n32:64-S128", "aarch64--");26 std::string DL5 = UpgradeDataLayoutString(27 "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "aarch64--");28 EXPECT_EQ(DL1,29 "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128"30 "-f80:128-n8:16:32:64-S128");31 EXPECT_EQ(DL2,32 "e-m:w-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128"33 "-f80:128-n8:16:32-S32");34 EXPECT_EQ(DL3, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:"35 "128-n8:16:32:64-S128");36 EXPECT_EQ(DL4, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:"37 "64-S128-Fn32");38 EXPECT_EQ(DL5, "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:"39 "64-i128:128-n32:64-S128-Fn32");40 41 // Check that AMDGPU targets add -G1 if it's not present.42 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "r600"), "m:e-e-p:32:32-G1");43 // and that ANDGCN adds p7 and p8 as well.44 EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64", "amdgcn"),45 "m:e-e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"46 "192:256:256:32");47 EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-G1", "amdgcn"),48 "m:e-e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"49 "192:256:256:32");50 // Check that the old AMDGCN p8:128:128 definition is upgraded51 EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p8:128:128-G1", "amdgcn"),52 "m:e-e-p:64:64-p8:128:128:128:48-G1-ni:7:8:9-p7:160:256:256:32-p9:"53 "192:256:256:32");54 // but that r600 does not.55 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G1", "r600"),56 "m:e-e-p:32:32-G1");57 58 // Ensure that the non-integral direction for address space 8 doesn't get59 // added in to pointer declarations.60 EXPECT_EQ(61 UpgradeDataLayoutString(62 "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:"63 "64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-"64 "v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7",65 "amdgcn"),66 "m:e-e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:"67 "64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:"68 "1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:"69 "128:48-p9:192:256:256:32");70 71 // Check that RISCV64 upgrades -n64 to -n32:64.72 EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",73 "riscv64"),74 "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");75 76 // Check that LoongArch64 upgrades -n64 to -n32:64.77 EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",78 "loongarch64"),79 "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");80 81 // Check that SPARC targets add -i128:128.82 EXPECT_EQ(83 UpgradeDataLayoutString("E-m:e-p:32:32-i64:64-f128:64-n32-S64", "sparc"),84 "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64");85 EXPECT_EQ(UpgradeDataLayoutString("E-m:e-i64:64-n32:64-S128", "sparcv9"),86 "E-m:e-i64:64-i128:128-n32:64-S128");87 88 // Check that MIPS64 targets add -i128:128.89 EXPECT_EQ(UpgradeDataLayoutString(90 "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128", "mips64"),91 "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");92 EXPECT_EQ(UpgradeDataLayoutString(93 "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128", "mips64el"),94 "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");95 // but that MIPS64 with o32 does not.96 EXPECT_EQ(UpgradeDataLayoutString(97 "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64", "mips64el"),98 "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");99 100 // Check that PowerPC64 targets add -i128:128.101 EXPECT_EQ(UpgradeDataLayoutString("e-m:e-i64:64-n32:64", "powerpc64le-linux"),102 "e-m:e-i64:64-i128:128-n32:64");103 EXPECT_EQ(104 UpgradeDataLayoutString("E-m:e-Fn32-i64:64-n32:64", "powerpc64-linux"),105 "E-m:e-Fn32-i64:64-i128:128-n32:64");106 EXPECT_EQ(107 UpgradeDataLayoutString("E-m:a-Fi64-i64:64-n32:64", "powerpc64-ibm-aix"),108 "E-m:a-Fi64-i64:64-i128:128-n32:64");109 110 // Check that WebAssembly targets add -i128:128.111 EXPECT_EQ(112 UpgradeDataLayoutString(113 "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20",114 "wasm32"),115 "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20");116 EXPECT_EQ(117 UpgradeDataLayoutString(118 "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20",119 "wasm64"),120 "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20");121 122 // Check that SPIR && SPIRV targets add -G1 if it's not present.123 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir"), "e-p:32:32-G1");124 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir64"), "e-p:32:32-G1");125 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv32"), "e-p:32:32-G1");126 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv64"), "e-p:32:32-G1");127 // but that SPIRV Logical does not.128 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv"), "e-p:32:32");129}130 131TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {132 std::string DL1 = UpgradeDataLayoutString(133 "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-"134 "f32:32:32"135 "-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"136 "-n8:16:32:64-S128",137 "x86_64-unknown-linux-gnu");138 std::string DL3 = UpgradeDataLayoutString(139 "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32",140 "aarch64--");141 EXPECT_EQ(142 DL1,143 "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128"144 "-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64"145 "-f80:128:128-n8:16:32:64-S128");146 EXPECT_EQ(DL3, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:"147 "64-S128-Fn32");148 149 // Check that AMDGPU targets don't add -G1 if there is already a -G flag.150 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "r600"),151 "m:e-e-p:32:32-G2");152 EXPECT_EQ(UpgradeDataLayoutString("G2", "r600"), "m:e-G2");153 EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-G2", "amdgcn"),154 "m:e-e-p:64:64-G2-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"155 "192:256:256:32");156 EXPECT_EQ(UpgradeDataLayoutString("G2-e-p:64:64", "amdgcn"),157 "m:e-G2-e-p:64:64-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"158 "192:256:256:32");159 EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-G0", "amdgcn"),160 "m:e-e-p:64:64-G0-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"161 "192:256:256:32");162 163 // Check that AMDGCN targets don't add already declared address space 7.164 EXPECT_EQ(165 UpgradeDataLayoutString("e-p:64:64-p7:64:64", "amdgcn"),166 "m:e-e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");167 EXPECT_EQ(168 UpgradeDataLayoutString("p7:64:64-G2-e-p:64:64", "amdgcn"),169 "m:e-p7:64:64-G2-e-p:64:64-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");170 EXPECT_EQ(171 UpgradeDataLayoutString("e-p:64:64-p7:64:64-G1", "amdgcn"),172 "m:e-e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");173 174 // Check that SPIR & SPIRV targets don't add -G1 if there is already a -G175 // flag.176 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spir"), "e-p:32:32-G2");177 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spir64"), "e-p:32:32-G2");178 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spirv32"), "e-p:32:32-G2");179 EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spirv64"), "e-p:32:32-G2");180 EXPECT_EQ(UpgradeDataLayoutString("G2", "spir"), "G2");181 EXPECT_EQ(UpgradeDataLayoutString("G2", "spir64"), "G2");182 EXPECT_EQ(UpgradeDataLayoutString("G2", "spirv32"), "G2");183 EXPECT_EQ(UpgradeDataLayoutString("G2", "spirv64"), "G2");184 185 // Check that PowerPC32 targets don't add -i128:128.186 EXPECT_EQ(UpgradeDataLayoutString("e-m:e-i64:64-n32", "powerpcle-linux"),187 "e-m:e-i64:64-n32");188 EXPECT_EQ(UpgradeDataLayoutString("E-m:e-Fn32-i64:64-n32", "powerpc-linux"),189 "E-m:e-Fn32-i64:64-n32");190 EXPECT_EQ(UpgradeDataLayoutString("E-m:a-Fi64-i64:64-n32", "powerpc-aix"),191 "E-m:a-Fi64-i64:64-n32");192}193 194TEST(DataLayoutUpgradeTest, EmptyDataLayout) {195 std::string DL1 = UpgradeDataLayoutString("", "x86_64-unknown-linux-gnu");196 std::string DL2 = UpgradeDataLayoutString(197 "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128", "");198 EXPECT_EQ(DL1, "");199 EXPECT_EQ(DL2, "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128");200 201 // Check that AMDGPU targets add G1 if it's not present.202 EXPECT_EQ(UpgradeDataLayoutString("", "r600"), "m:e-G1");203 EXPECT_EQ(204 UpgradeDataLayoutString("", "amdgcn"),205 "m:e-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32");206 207 // Check that SPIR & SPIRV targets add G1 if it's not present.208 EXPECT_EQ(UpgradeDataLayoutString("", "spir"), "G1");209 EXPECT_EQ(UpgradeDataLayoutString("", "spir64"), "G1");210 EXPECT_EQ(UpgradeDataLayoutString("", "spirv32"), "G1");211 EXPECT_EQ(UpgradeDataLayoutString("", "spirv64"), "G1");212 // but SPIRV Logical does not.213 EXPECT_EQ(UpgradeDataLayoutString("", "spirv"), "");214}215 216} // end namespace217