Coverage Report

Created: 2022-01-22 13:19

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/Basic/Targets/AMDGPU.cpp
Line
Count
Source (jump to first uncovered line)
1
//===--- AMDGPU.cpp - Implement AMDGPU target feature support -------------===//
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
// This file implements AMDGPU TargetInfo objects.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "AMDGPU.h"
14
#include "clang/Basic/Builtins.h"
15
#include "clang/Basic/CodeGenOptions.h"
16
#include "clang/Basic/LangOptions.h"
17
#include "clang/Basic/MacroBuilder.h"
18
#include "clang/Basic/TargetBuiltins.h"
19
#include "llvm/ADT/StringSwitch.h"
20
21
using namespace clang;
22
using namespace clang::targets;
23
24
namespace clang {
25
namespace targets {
26
27
// If you edit the description strings, make sure you update
28
// getPointerWidthV().
29
30
static const char *const DataLayoutStringR600 =
31
    "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
32
    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1";
33
34
static const char *const DataLayoutStringAMDGCN =
35
    "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32"
36
    "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
37
    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1"
38
    "-ni:7";
39
40
const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
41
    Generic,  // Default
42
    Global,   // opencl_global
43
    Local,    // opencl_local
44
    Constant, // opencl_constant
45
    Private,  // opencl_private
46
    Generic,  // opencl_generic
47
    Global,   // opencl_global_device
48
    Global,   // opencl_global_host
49
    Global,   // cuda_device
50
    Constant, // cuda_constant
51
    Local,    // cuda_shared
52
    Global,   // sycl_global
53
    Global,   // sycl_global_device
54
    Global,   // sycl_global_host
55
    Local,    // sycl_local
56
    Private,  // sycl_private
57
    Generic,  // ptr32_sptr
58
    Generic,  // ptr32_uptr
59
    Generic   // ptr64
60
};
61
62
const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
63
    Private,  // Default
64
    Global,   // opencl_global
65
    Local,    // opencl_local
66
    Constant, // opencl_constant
67
    Private,  // opencl_private
68
    Generic,  // opencl_generic
69
    Global,   // opencl_global_device
70
    Global,   // opencl_global_host
71
    Global,   // cuda_device
72
    Constant, // cuda_constant
73
    Local,    // cuda_shared
74
    // SYCL address space values for this map are dummy
75
    Generic,  // sycl_global
76
    Generic,  // sycl_global_device
77
    Generic,  // sycl_global_host
78
    Generic,  // sycl_local
79
    Generic,  // sycl_private
80
    Generic,  // ptr32_sptr
81
    Generic,  // ptr32_uptr
82
    Generic   // ptr64
83
84
};
85
} // namespace targets
86
} // namespace clang
87
88
const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
89
#define BUILTIN(ID, TYPE, ATTRS)                                               \
90
  {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
91
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
92
  {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
93
#include "clang/Basic/BuiltinsAMDGPU.def"
94
};
95
96
const char *const AMDGPUTargetInfo::GCCRegNames[] = {
97
  "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8",
98
  "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",
99
  "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
100
  "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35",
101
  "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44",
102
  "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53",
103
  "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62",
104
  "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
105
  "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",
106
  "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89",
107
  "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98",
108
  "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107",
109
  "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116",
110
  "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125",
111
  "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134",
112
  "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
113
  "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152",
114
  "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161",
115
  "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170",
116
  "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179",
117
  "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188",
118
  "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197",
119
  "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206",
120
  "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
121
  "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224",
122
  "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233",
123
  "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242",
124
  "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251",
125
  "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4",
126
  "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13",
127
  "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
128
  "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
129
  "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",
130
  "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49",
131
  "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58",
132
  "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67",
133
  "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76",
134
  "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85",
135
  "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94",
136
  "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
137
  "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",
138
  "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",
139
  "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",
140
  "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",
141
  "flat_scratch_lo", "flat_scratch_hi",
142
  "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8",
143
  "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17",
144
  "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26",
145
  "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35",
146
  "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44",
147
  "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53",
148
  "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62",
149
  "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71",
150
  "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80",
151
  "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89",
152
  "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98",
153
  "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107",
154
  "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116",
155
  "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125",
156
  "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134",
157
  "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143",
158
  "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152",
159
  "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161",
160
  "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170",
161
  "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179",
162
  "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188",
163
  "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197",
164
  "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206",
165
  "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215",
166
  "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224",
167
  "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233",
168
  "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242",
169
  "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251",
170
  "a252", "a253", "a254", "a255"
171
};
172
173
0
ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
174
0
  return llvm::makeArrayRef(GCCRegNames);
175
0
}
176
177
bool AMDGPUTargetInfo::initFeatureMap(
178
    llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
179
237
    const std::vector<std::string> &FeatureVec) const {
180
181
237
  using namespace llvm::AMDGPU;
182
183
  // XXX - What does the member GPU mean if device name string passed here?
184
237
  if (isAMDGCN(getTriple())) {
185
210
    switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) {
186
0
    case GK_GFX1035:
187
0
    case GK_GFX1034:
188
0
    case GK_GFX1033:
189
0
    case GK_GFX1032:
190
0
    case GK_GFX1031:
191
0
    case GK_GFX1030:
192
0
      Features["ci-insts"] = true;
193
0
      Features["dot1-insts"] = true;
194
0
      Features["dot2-insts"] = true;
195
0
      Features["dot5-insts"] = true;
196
0
      Features["dot6-insts"] = true;
197
0
      Features["dot7-insts"] = true;
198
0
      Features["dl-insts"] = true;
199
0
      Features["flat-address-space"] = true;
200
0
      Features["16-bit-insts"] = true;
201
0
      Features["dpp"] = true;
202
0
      Features["gfx8-insts"] = true;
203
0
      Features["gfx9-insts"] = true;
204
0
      Features["gfx10-insts"] = true;
205
0
      Features["gfx10-3-insts"] = true;
206
0
      Features["s-memrealtime"] = true;
207
0
      Features["s-memtime-inst"] = true;
208
0
      break;
209
0
    case GK_GFX1012:
210
0
    case GK_GFX1011:
211
0
      Features["dot1-insts"] = true;
212
0
      Features["dot2-insts"] = true;
213
0
      Features["dot5-insts"] = true;
214
0
      Features["dot6-insts"] = true;
215
0
      Features["dot7-insts"] = true;
216
0
      LLVM_FALLTHROUGH;
217
0
    case GK_GFX1013:
218
1
    case GK_GFX1010:
219
1
      Features["dl-insts"] = true;
220
1
      Features["ci-insts"] = true;
221
1
      Features["flat-address-space"] = true;
222
1
      Features["16-bit-insts"] = true;
223
1
      Features["dpp"] = true;
224
1
      Features["gfx8-insts"] = true;
225
1
      Features["gfx9-insts"] = true;
226
1
      Features["gfx10-insts"] = true;
227
1
      Features["s-memrealtime"] = true;
228
1
      Features["s-memtime-inst"] = true;
229
1
      break;
230
3
    case GK_GFX90A:
231
3
      Features["gfx90a-insts"] = true;
232
3
      LLVM_FALLTHROUGH;
233
4
    case GK_GFX908:
234
4
      Features["dot3-insts"] = true;
235
4
      Features["dot4-insts"] = true;
236
4
      Features["dot5-insts"] = true;
237
4
      Features["dot6-insts"] = true;
238
4
      Features["mai-insts"] = true;
239
4
      LLVM_FALLTHROUGH;
240
11
    case GK_GFX906:
241
11
      Features["dl-insts"] = true;
242
11
      Features["dot1-insts"] = true;
243
11
      Features["dot2-insts"] = true;
244
11
      Features["dot7-insts"] = true;
245
11
      LLVM_FALLTHROUGH;
246
11
    case GK_GFX90C:
247
11
    case GK_GFX909:
248
11
    case GK_GFX904:
249
11
    case GK_GFX902:
250
14
    case GK_GFX900:
251
14
      Features["gfx9-insts"] = true;
252
14
      LLVM_FALLTHROUGH;
253
14
    case GK_GFX810:
254
14
    case GK_GFX805:
255
14
    case GK_GFX803:
256
14
    case GK_GFX802:
257
14
    case GK_GFX801:
258
14
      Features["gfx8-insts"] = true;
259
14
      Features["16-bit-insts"] = true;
260
14
      Features["dpp"] = true;
261
14
      Features["s-memrealtime"] = true;
262
14
      LLVM_FALLTHROUGH;
263
14
    case GK_GFX705:
264
14
    case GK_GFX704:
265
14
    case GK_GFX703:
266
14
    case GK_GFX702:
267
15
    case GK_GFX701:
268
16
    case GK_GFX700:
269
16
      Features["ci-insts"] = true;
270
16
      Features["flat-address-space"] = true;
271
16
      LLVM_FALLTHROUGH;
272
16
    case GK_GFX602:
273
18
    case GK_GFX601:
274
20
    case GK_GFX600:
275
20
      Features["s-memtime-inst"] = true;
276
20
      break;
277
189
    case GK_NONE:
278
189
      break;
279
0
    default:
280
0
      llvm_unreachable("Unhandled GPU!");
281
210
    }
282
210
  } else {
283
27
    if (CPU.empty())
284
13
      CPU = "r600";
285
286
27
    switch (llvm::AMDGPU::parseArchR600(CPU)) {
287
1
    case GK_CAYMAN:
288
1
    case GK_CYPRESS:
289
1
    case GK_RV770:
290
1
    case GK_RV670:
291
      // TODO: Add fp64 when implemented.
292
1
      break;
293
0
    case GK_TURKS:
294
1
    case GK_CAICOS:
295
1
    case GK_BARTS:
296
1
    case GK_SUMO:
297
1
    case GK_REDWOOD:
298
1
    case GK_JUNIPER:
299
1
    case GK_CEDAR:
300
1
    case GK_RV730:
301
1
    case GK_RV710:
302
1
    case GK_RS880:
303
1
    case GK_R630:
304
26
    case GK_R600:
305
26
      break;
306
0
    default:
307
0
      llvm_unreachable("Unhandled GPU!");
308
27
    }
309
27
  }
310
311
237
  return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
312
237
}
313
314
void AMDGPUTargetInfo::fillValidCPUList(
315
2
    SmallVectorImpl<StringRef> &Values) const {
316
2
  if (isAMDGCN(getTriple()))
317
1
    llvm::AMDGPU::fillValidArchListAMDGCN(Values);
318
1
  else
319
1
    llvm::AMDGPU::fillValidArchListR600(Values);
320
2
}
321
322
520
void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
323
520
  AddrSpaceMap = DefaultIsPrivate ? 
&AMDGPUDefIsPrivMap234
:
&AMDGPUDefIsGenMap286
;
324
520
}
325
326
AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
327
                                   const TargetOptions &Opts)
328
    : TargetInfo(Triple),
329
      GPUKind(isAMDGCN(Triple) ?
330
              llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) :
331
              llvm::AMDGPU::parseArchR600(Opts.CPU)),
332
      GPUFeatures(isAMDGCN(Triple) ?
333
                  llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) :
334
182
                  llvm::AMDGPU::getArchAttrR600(GPUKind)) {
335
182
  resetDataLayout(isAMDGCN(getTriple()) ? 
DataLayoutStringAMDGCN154
336
182
                                        : 
DataLayoutStringR60028
);
337
338
182
  setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
339
182
                     
!isAMDGCN(Triple)176
);
340
182
  UseAddrSpaceMapMangling = true;
341
342
182
  HasLegalHalfType = true;
343
182
  HasFloat16 = true;
344
182
  WavefrontSize = GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32 ? 
321
:
64181
;
345
182
  AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics;
346
347
  // Set pointer width and alignment for target address space 0.
348
182
  PointerWidth = PointerAlign = getPointerWidthV(Generic);
349
182
  if (getMaxPointerWidth() == 64) {
350
154
    LongWidth = LongAlign = 64;
351
154
    SizeType = UnsignedLong;
352
154
    PtrDiffType = SignedLong;
353
154
    IntPtrType = SignedLong;
354
154
  }
355
356
182
  MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
357
182
}
Unexecuted instantiation: clang::targets::AMDGPUTargetInfo::AMDGPUTargetInfo(llvm::Triple const&, clang::TargetOptions const&)
clang::targets::AMDGPUTargetInfo::AMDGPUTargetInfo(llvm::Triple const&, clang::TargetOptions const&)
Line
Count
Source
334
182
                  llvm::AMDGPU::getArchAttrR600(GPUKind)) {
335
182
  resetDataLayout(isAMDGCN(getTriple()) ? 
DataLayoutStringAMDGCN154
336
182
                                        : 
DataLayoutStringR60028
);
337
338
182
  setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
339
182
                     
!isAMDGCN(Triple)176
);
340
182
  UseAddrSpaceMapMangling = true;
341
342
182
  HasLegalHalfType = true;
343
182
  HasFloat16 = true;
344
182
  WavefrontSize = GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32 ? 
321
:
64181
;
345
182
  AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics;
346
347
  // Set pointer width and alignment for target address space 0.
348
182
  PointerWidth = PointerAlign = getPointerWidthV(Generic);
349
182
  if (getMaxPointerWidth() == 64) {
350
154
    LongWidth = LongAlign = 64;
351
154
    SizeType = UnsignedLong;
352
154
    PtrDiffType = SignedLong;
353
154
    IntPtrType = SignedLong;
354
154
  }
355
356
182
  MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
357
182
}
358
359
338
void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
360
338
  TargetInfo::adjust(Diags, Opts);
361
  // ToDo: There are still a few places using default address space as private
362
  // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL
363
  // can be removed from the following line.
364
338
  setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL ||
365
338
                     
!isAMDGCN(getTriple())146
);
366
338
}
367
368
180
ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
369
180
  return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin -
370
180
                                             Builtin::FirstTSBuiltin);
371
180
}
372
373
void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
374
180
                                        MacroBuilder &Builder) const {
375
180
  Builder.defineMacro("__AMD__");
376
180
  Builder.defineMacro("__AMDGPU__");
377
378
180
  if (isAMDGCN(getTriple()))
379
153
    Builder.defineMacro("__AMDGCN__");
380
27
  else
381
27
    Builder.defineMacro("__R600__");
382
383
180
  if (GPUKind != llvm::AMDGPU::GK_NONE) {
384
35
    StringRef CanonName = isAMDGCN(getTriple()) ?
385
21
      getArchNameAMDGCN(GPUKind) : 
getArchNameR600(GPUKind)14
;
386
35
    Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
387
35
    if (isAMDGCN(getTriple())) {
388
21
      Builder.defineMacro("__amdgcn_processor__",
389
21
                          Twine("\"") + Twine(CanonName) + Twine("\""));
390
21
      Builder.defineMacro("__amdgcn_target_id__",
391
21
                          Twine("\"") + Twine(getTargetID().getValue()) +
392
21
                              Twine("\""));
393
26
      for (auto F : getAllPossibleTargetIDFeatures(getTriple(), CanonName)) {
394
26
        auto Loc = OffloadArchFeatures.find(F);
395
26
        if (Loc != OffloadArchFeatures.end()) {
396
0
          std::string NewF = F.str();
397
0
          std::replace(NewF.begin(), NewF.end(), '-', '_');
398
0
          Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) +
399
0
                                  Twine("__"),
400
0
                              Loc->second ? "1" : "0");
401
0
        }
402
26
      }
403
21
    }
404
35
  }
405
406
  // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be
407
  // removed in the near future.
408
180
  if (hasFMAF())
409
154
    Builder.defineMacro("__HAS_FMAF__");
410
180
  if (hasFastFMAF())
411
150
    Builder.defineMacro("FP_FAST_FMAF");
412
180
  if (hasLDEXPF())
413
153
    Builder.defineMacro("__HAS_LDEXPF__");
414
180
  if (hasFP64())
415
153
    Builder.defineMacro("__HAS_FP64__");
416
180
  if (hasFastFMA())
417
153
    Builder.defineMacro("FP_FAST_FMA");
418
419
180
  Builder.defineMacro("__AMDGCN_WAVEFRONT_SIZE", Twine(WavefrontSize));
420
180
}
421
422
17
void AMDGPUTargetInfo::setAuxTarget(const TargetInfo *Aux) {
423
17
  assert(HalfFormat == Aux->HalfFormat);
424
0
  assert(FloatFormat == Aux->FloatFormat);
425
0
  assert(DoubleFormat == Aux->DoubleFormat);
426
427
  // On x86_64 long double is 80-bit extended precision format, which is
428
  // not supported by AMDGPU. 128-bit floating point format is also not
429
  // supported by AMDGPU. Therefore keep its own format for these two types.
430
0
  auto SaveLongDoubleFormat = LongDoubleFormat;
431
17
  auto SaveFloat128Format = Float128Format;
432
17
  copyAuxTarget(Aux);
433
17
  LongDoubleFormat = SaveLongDoubleFormat;
434
17
  Float128Format = SaveFloat128Format;
435
  // For certain builtin types support on the host target, claim they are
436
  // support to pass the compilation of the host code during the device-side
437
  // compilation.
438
  // FIXME: As the side effect, we also accept `__float128` uses in the device
439
  // code. To rejct these builtin types supported in the host target but not in
440
  // the device target, one approach would support `device_builtin` attribute
441
  // so that we could tell the device builtin types from the host ones. The
442
  // also solves the different representations of the same builtin type, such
443
  // as `size_t` in the MSVC environment.
444
17
  if (Aux->hasFloat128Type()) {
445
5
    HasFloat128 = true;
446
5
    Float128Format = DoubleFormat;
447
5
  }
448
17
}