clang 24.0.0git
AMDGPU.cpp
Go to the documentation of this file.
1//===------- AMDCPU.cpp - Emit LLVM Code for builtins ---------------------===//
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 contains code to emit Builtin calls as LLVM code.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CGBuiltin.h"
14#include "CodeGenFunction.h"
15#include "TargetInfo.h"
19#include "llvm/Analysis/ValueTracking.h"
20#include "llvm/CodeGen/MachineFunction.h"
21#include "llvm/IR/IntrinsicsAMDGPU.h"
22#include "llvm/IR/IntrinsicsR600.h"
23#include "llvm/IR/IntrinsicsSPIRV.h"
24#include "llvm/IR/MemoryModelRelaxationAnnotations.h"
25#include "llvm/Support/AMDGPUAddrSpace.h"
26#include "llvm/Support/AtomicOrdering.h"
27#include "llvm/TargetParser/AtomicScope.h"
28
29using namespace clang;
30using namespace CodeGen;
31using namespace llvm;
32
33namespace {
34
35static Value *emitAMDGPUSBufferLoadBuiltin(CodeGenFunction &CGF,
36 const CallExpr *E) {
37 llvm::Type *RetTy = CGF.ConvertType(E->getType());
38 Function *F =
39 CGF.CGM.getIntrinsic(Intrinsic::amdgcn_ptr_s_buffer_load, RetTy);
40
41 Value *RsrcPtr = CGF.EmitScalarExpr(E->getArg(0));
42 CallInst *Call =
43 CGF.Builder.CreateCall(F, {RsrcPtr, CGF.EmitScalarExpr(E->getArg(1)),
44 CGF.EmitScalarExpr(E->getArg(2))});
45 Call->setMetadata(llvm::LLVMContext::MD_invariant_load,
46 llvm::MDNode::get(CGF.Builder.getContext(), {}));
47 return Call;
48}
49
50// Has second type mangled argument.
51static Value *
53 Intrinsic::ID IntrinsicID,
54 Intrinsic::ID ConstrainedIntrinsicID) {
55 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0));
56 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1));
57
58 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E);
59 if (CGF.Builder.getIsFPConstrained()) {
60 Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID,
61 {Src0->getType(), Src1->getType()});
62 return CGF.Builder.CreateConstrainedFPCall(F, {Src0, Src1});
63 }
64
65 Function *F =
66 CGF.CGM.getIntrinsic(IntrinsicID, {Src0->getType(), Src1->getType()});
67 return CGF.Builder.CreateCall(F, {Src0, Src1});
68}
69
70// If \p E is not null pointer, insert address space cast to match return
71// type of \p E if necessary.
72Value *EmitAMDGPUDispatchPtr(CodeGenFunction &CGF,
73 const CallExpr *E = nullptr) {
74 auto *F = CGF.CGM.getIntrinsic(Intrinsic::amdgcn_dispatch_ptr);
75 auto *Call = CGF.Builder.CreateCall(F);
76 if (!E)
77 return Call;
78 QualType BuiltinRetType = E->getType();
79 auto *RetTy = cast<llvm::PointerType>(CGF.ConvertType(BuiltinRetType));
80 if (RetTy == Call->getType())
81 return Call;
82 return CGF.Builder.CreateAddrSpaceCast(Call, RetTy);
83}
84
85Value *EmitAMDGPUImplicitArgPtr(CodeGenFunction &CGF) {
86 auto *F = CGF.CGM.getIntrinsic(Intrinsic::amdgcn_implicitarg_ptr);
87 auto *Call = CGF.Builder.CreateCall(F);
88 Call->addRetAttr(
89 Attribute::getWithDereferenceableBytes(Call->getContext(), 256));
90 Call->addRetAttr(Attribute::getWithAlignment(Call->getContext(), Align(8)));
91 return Call;
92}
93
94static llvm::Intrinsic::ID getAMDGPUWorkGroupID(CodeGenFunction &CGF,
95 unsigned Index) {
96 switch (Index) {
97 case 0:
98 return llvm::Intrinsic::amdgcn_workgroup_id_x;
99 case 1:
100 return llvm::Intrinsic::amdgcn_workgroup_id_y;
101 case 2:
102 return llvm::Intrinsic::amdgcn_workgroup_id_z;
103 default:
104 llvm_unreachable("unhandled index");
105 }
106}
107
108static void setNoundefInvariantLoad(llvm::LoadInst *Ld) {
109 Ld->setMetadata(llvm::LLVMContext::MD_noundef,
110 llvm::MDNode::get(Ld->getContext(), {}));
111 Ld->setMetadata(llvm::LLVMContext::MD_invariant_load,
112 llvm::MDNode::get(Ld->getContext(), {}));
113}
114
115static void addMaxWorkGroupSizeRangeMetadata(CodeGenFunction &CGF,
116 llvm::LoadInst *GroupSize) {
117 llvm::MDBuilder MDHelper(CGF.getLLVMContext());
118 llvm::MDNode *RNode = MDHelper.createRange(
119 APInt(16, 1), APInt(16, CGF.getTarget().getMaxOpenCLWorkGroupSize() + 1));
120 GroupSize->setMetadata(llvm::LLVMContext::MD_range, RNode);
121 setNoundefInvariantLoad(GroupSize);
122}
123
124static Value *emitAMDGPUWorkGroupSizeV5(CodeGenFunction &CGF, unsigned Index) {
125 llvm::Value *ImplicitArgPtr = EmitAMDGPUImplicitArgPtr(CGF);
126
127 // offsetof(amdhsa_implicit_kernarg_v5, block_count[Index])
128 unsigned BlockCountOffset = 0 + Index * 4;
129 // offsetof(amdhsa_implicit_kernarg_v5, group_size[Index])
130 unsigned GroupSizeOffset = 12 + Index * 2;
131 // offsetof(amdhsa_implicit_kernarg_v5, remainder[Index])
132 unsigned RemainderOffset = 18 + Index * 2;
133
134 if (CGF.CGM.getLangOpts().OffloadUniformBlock) {
135 // Indexing the implicit kernarg segment.
136 llvm::Value *GroupSizeGEP = CGF.Builder.CreateConstInBoundsGEP1_64(
137 CGF.Int8Ty, ImplicitArgPtr, GroupSizeOffset);
138 llvm::LoadInst *GroupSize = CGF.Builder.CreateLoad(
139 Address(GroupSizeGEP, CGF.Int16Ty, CharUnits::fromQuantity(2)));
140
141 addMaxWorkGroupSizeRangeMetadata(CGF, GroupSize);
142
143 return CGF.Builder.CreateZExt(GroupSize, CGF.Int32Ty);
144 }
145
146 llvm::Value *BlockCountGEP = CGF.Builder.CreateConstGEP1_64(
147 CGF.Int8Ty, ImplicitArgPtr, BlockCountOffset);
148 llvm::LoadInst *BlockCount = CGF.Builder.CreateLoad(
149 Address(BlockCountGEP, CGF.Int32Ty, CharUnits::fromQuantity(4)));
150 setNoundefInvariantLoad(BlockCount);
151
152 llvm::Value *WorkgroupID =
153 CGF.Builder.CreateIntrinsic(getAMDGPUWorkGroupID(CGF, Index), {});
154 llvm::Value *IsFull = CGF.Builder.CreateICmpULT(WorkgroupID, BlockCount);
155
156 llvm::Value *StructOffset = CGF.Builder.CreateSelect(
157 IsFull, ConstantInt::get(CGF.Int32Ty, GroupSizeOffset),
158 ConstantInt::get(CGF.Int32Ty, RemainderOffset));
159
160 llvm::Value *SizeGEP =
161 CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, ImplicitArgPtr, StructOffset);
162 llvm::LoadInst *Size = CGF.Builder.CreateLoad(
163 Address(SizeGEP, CGF.Int16Ty, CharUnits::fromQuantity(2)));
164 addMaxWorkGroupSizeRangeMetadata(CGF, Size);
165 setNoundefInvariantLoad(Size);
166
167 return CGF.Builder.CreateZExt(Size, CGF.Int32Ty);
168}
169
170static Value *emitAMDGPUWorkGroupSizeV4(CodeGenFunction &CGF, unsigned Index) {
171 llvm::Value *DispatchPtr = EmitAMDGPUDispatchPtr(CGF);
172
173 // Indexing the HSA kernel_dispatch_packet struct.
174 llvm::Value *GroupSizeGEP = CGF.Builder.CreateConstInBoundsGEP1_64(
175 CGF.Int8Ty, DispatchPtr, 4 + Index * 2);
176 llvm::LoadInst *GroupSizeLD = CGF.Builder.CreateLoad(
177 Address(GroupSizeGEP, CGF.Int16Ty, CharUnits::fromQuantity(2)));
178
179 addMaxWorkGroupSizeRangeMetadata(CGF, GroupSizeLD);
180
181 llvm::Value *GroupSize = CGF.Builder.CreateZExt(GroupSizeLD, CGF.Int32Ty);
182
183 if (CGF.CGM.getLangOpts().OffloadUniformBlock)
184 return GroupSize;
185
186 llvm::Value *WorkgroupID =
187 CGF.Builder.CreateIntrinsic(getAMDGPUWorkGroupID(CGF, Index), {});
188
189 llvm::Value *GridSizeGEP = CGF.Builder.CreateConstInBoundsGEP1_64(
190 CGF.Int8Ty, DispatchPtr, 12 + Index * 4);
191 llvm::LoadInst *GridSize = CGF.Builder.CreateLoad(
192 Address(GridSizeGEP, CGF.Int32Ty, CharUnits::fromQuantity(4)));
193
194 llvm::MDBuilder MDB(CGF.getLLVMContext());
195
196 // Known non-zero.
197 GridSize->setMetadata(llvm::LLVMContext::MD_range,
198 MDB.createRange(APInt(32, 1), APInt::getZero(32)));
199 GridSize->setMetadata(llvm::LLVMContext::MD_invariant_load,
200 llvm::MDNode::get(CGF.getLLVMContext(), {}));
201
202 llvm::Value *Mul = CGF.Builder.CreateMul(WorkgroupID, GroupSize);
203 llvm::Value *Remainder = CGF.Builder.CreateSub(GridSize, Mul);
204
205 llvm::Value *IsPartial = CGF.Builder.CreateICmpULT(Remainder, GroupSize);
206
207 return CGF.Builder.CreateSelect(IsPartial, Remainder, GroupSize);
208}
209
210// \p Index is 0, 1, and 2 for x, y, and z dimension, respectively.
211/// Emit code based on Code Object ABI version.
212/// COV_4 : Emit code to use dispatch ptr
213/// COV_5+ : Emit code to use implicitarg ptr
214/// COV_NONE : Emit code to load a global variable "__oclc_ABI_version"
215/// and use its value for COV_4 or COV_5+ approach. It is used for
216/// compiling device libraries in an ABI-agnostic way.
217Value *EmitAMDGPUWorkGroupSize(CodeGenFunction &CGF, unsigned Index) {
218 auto Cov = CGF.getTarget().getTargetOpts().CodeObjectVersion;
219
220 // Do not emit __oclc_ABI_version references with non-empt environment.
221 if (Cov == CodeObjectVersionKind::COV_None &&
222 CGF.getTarget().getTriple().hasEnvironment())
223 Cov = CodeObjectVersionKind::COV_6;
224
225 if (Cov == CodeObjectVersionKind::COV_None) {
226 StringRef Name = "__oclc_ABI_version";
227 auto *ABIVersionC = CGF.CGM.getModule().getNamedGlobal(Name);
228 if (!ABIVersionC)
229 ABIVersionC = new llvm::GlobalVariable(
230 CGF.CGM.getModule(), CGF.Int32Ty, false,
231 llvm::GlobalValue::ExternalLinkage, nullptr, Name, nullptr,
232 llvm::GlobalVariable::NotThreadLocal,
234
235 // This load will be eliminated by the IPSCCP because it is constant
236 // weak_odr without externally_initialized. Either changing it to weak or
237 // adding externally_initialized will keep the load.
238 Value *ABIVersion = CGF.Builder.CreateAlignedLoad(CGF.Int32Ty, ABIVersionC,
239 CGF.CGM.getIntAlign());
240
241 Value *IsCOV5 = CGF.Builder.CreateICmpSGE(
242 ABIVersion,
243 llvm::ConstantInt::get(CGF.Int32Ty, CodeObjectVersionKind::COV_5));
244
245 llvm::Value *V5Impl = emitAMDGPUWorkGroupSizeV5(CGF, Index);
246 llvm::Value *V4Impl = emitAMDGPUWorkGroupSizeV4(CGF, Index);
247 return CGF.Builder.CreateSelect(IsCOV5, V5Impl, V4Impl);
248 }
249
250 return Cov >= CodeObjectVersionKind::COV_5
251 ? emitAMDGPUWorkGroupSizeV5(CGF, Index)
252 : emitAMDGPUWorkGroupSizeV4(CGF, Index);
253}
254
255// \p Index is 0, 1, and 2 for x, y, and z dimension, respectively.
256Value *EmitAMDGPUGridSize(CodeGenFunction &CGF, unsigned Index) {
257 const unsigned XOffset = 12;
258 auto *DP = EmitAMDGPUDispatchPtr(CGF);
259 // Indexing the HSA kernel_dispatch_packet struct.
260 auto *Offset = llvm::ConstantInt::get(CGF.Int32Ty, XOffset + Index * 4);
261 auto *GEP = CGF.Builder.CreateGEP(CGF.Int8Ty, DP, Offset);
262 auto *LD = CGF.Builder.CreateLoad(
264
265 llvm::MDBuilder MDB(CGF.getLLVMContext());
266
267 // Known non-zero.
268 LD->setMetadata(llvm::LLVMContext::MD_range,
269 MDB.createRange(APInt(32, 1), APInt::getZero(32)));
270 LD->setMetadata(llvm::LLVMContext::MD_invariant_load,
271 llvm::MDNode::get(CGF.getLLVMContext(), {}));
272 return LD;
273}
274} // namespace
275
276// Generates the IR for __builtin_read_exec_*.
277// Lowers the builtin to amdgcn_ballot intrinsic.
278//
279// The ballot must be taken at the wavefront width: a ballot narrower than the
280// wave size cannot represent one bit per lane and fails to select. Request the
281// mask at the wave width and narrow it afterwards for the _lo and _hi halves.
283 llvm::Type *RegisterType,
284 llvm::Type *ValueType, bool isExecHi) {
285 CodeGen::CGBuilderTy &Builder = CGF.Builder;
286 CodeGen::CodeGenModule &CGM = CGF.CGM;
287
288 unsigned WaveSize = CGF.getTarget().getGridValue().GV_Warp_Size;
289 unsigned BallotSize = std::max(WaveSize, RegisterType->getIntegerBitWidth());
290 llvm::Type *BallotType = Builder.getIntNTy(BallotSize);
291
292 Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_ballot, {BallotType});
293 llvm::Value *Call = Builder.CreateCall(F, {Builder.getInt1(true)});
294
295 if (isExecHi) {
296 Value *Rt2 = Builder.CreateLShr(Call, 32);
297 Rt2 = Builder.CreateTrunc(Rt2, CGF.Int32Ty);
298 return Rt2;
299 }
300
301 return Builder.CreateTrunc(Call, ValueType);
302}
303
305 llvm::Value *RsrcPtr) {
306 auto &B = CGF.Builder;
307 auto *VecTy = llvm::FixedVectorType::get(B.getInt32Ty(), 8);
308
309 if (RsrcPtr->getType() == VecTy)
310 return RsrcPtr;
311
312 if (RsrcPtr->getType()->isIntegerTy(32)) {
313 llvm::PointerType *VecPtrTy =
314 llvm::PointerType::get(CGF.getLLVMContext(), 8);
315 llvm::Value *Ptr = B.CreateIntToPtr(RsrcPtr, VecPtrTy, "tex.rsrc.from.int");
316 return B.CreateAlignedLoad(VecTy, Ptr, llvm::Align(32), "tex.rsrc.val");
317 }
318
319 if (RsrcPtr->getType()->isPointerTy()) {
320 auto *VecPtrTy = llvm::PointerType::get(
321 CGF.getLLVMContext(), RsrcPtr->getType()->getPointerAddressSpace());
322 llvm::Value *Typed = B.CreateBitCast(RsrcPtr, VecPtrTy, "tex.rsrc.typed");
323 return B.CreateAlignedLoad(VecTy, Typed, llvm::Align(32), "tex.rsrc.val");
324 }
325
326 const auto &DL = CGF.CGM.getDataLayout();
327 if (DL.getTypeSizeInBits(RsrcPtr->getType()) == 256)
328 return B.CreateBitCast(RsrcPtr, VecTy, "tex.rsrc.val");
329
330 llvm::report_fatal_error("Unexpected texture resource argument form");
331}
332
333llvm::CallInst *
335 const clang::CallExpr *E,
336 unsigned IntrinsicID, bool IsImageStore) {
337 auto findTextureDescIndex = [&CGF](const CallExpr *E) -> unsigned {
338 QualType TexQT = CGF.getContext().AMDGPUTextureTy;
339 for (unsigned I = 0, N = E->getNumArgs(); I < N; ++I) {
340 QualType ArgTy = E->getArg(I)->getType();
341 if (ArgTy == TexQT) {
342 return I;
343 }
344
345 if (ArgTy.getCanonicalType() == TexQT.getCanonicalType()) {
346 return I;
347 }
348 }
349
350 return ~0U;
351 };
352
354 unsigned RsrcIndex = findTextureDescIndex(E);
355
356 if (RsrcIndex == ~0U) {
357 llvm::report_fatal_error("Invalid argument count for image builtin");
358 }
359
360 for (unsigned I = 0; I < E->getNumArgs(); ++I) {
361 llvm::Value *V = CGF.EmitScalarExpr(E->getArg(I));
362 if (I == RsrcIndex)
364 Args.push_back(V);
365 }
366
367 llvm::Type *RetTy = IsImageStore ? CGF.VoidTy : CGF.ConvertType(E->getType());
368 llvm::CallInst *Call =
369 CGF.Builder.CreateIntrinsicWithoutFolding(RetTy, IntrinsicID, Args);
370 return Call;
371}
372
373// Emit an intrinsic that has 1 float or double operand, and 1 integer.
375 const CallExpr *E,
376 unsigned IntrinsicID) {
377 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0));
378 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1));
379
380 Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType());
381 return CGF.Builder.CreateCall(F, {Src0, Src1});
382}
383
384// When the target is SPIR-V (spirv64-amd-amdhsa) re-spell the scope for that
385// target by parsing as AMDGPU and re-emitting it.
386static inline StringRef mapScopeToSPIRV(const llvm::Triple &TargetTriple,
387 StringRef AMDGCNScope) {
388 static const llvm::Triple AMDGPU("amdgcn-amd-amdhsa");
389 if (auto Parsed = llvm::parseAtomicScopeIRString(AMDGPU, AMDGCNScope)) {
390 auto [Scope, IsSingleAddressSpace] = *Parsed;
391 if (auto Str = llvm::getAtomicScopeIRString(TargetTriple, Scope,
392 IsSingleAddressSpace))
393 return *Str;
394 }
395 return AMDGCNScope;
396}
397
398static llvm::AtomicOrdering mapCABIAtomicOrdering(unsigned AO) {
399 // Map C11/C++11 memory ordering to LLVM memory ordering
400 assert(llvm::isValidAtomicOrderingCABI(AO));
401 switch (static_cast<llvm::AtomicOrderingCABI>(AO)) {
402 case llvm::AtomicOrderingCABI::acquire:
403 case llvm::AtomicOrderingCABI::consume:
404 return llvm::AtomicOrdering::Acquire;
405 case llvm::AtomicOrderingCABI::release:
406 return llvm::AtomicOrdering::Release;
407 case llvm::AtomicOrderingCABI::acq_rel:
408 return llvm::AtomicOrdering::AcquireRelease;
409 case llvm::AtomicOrderingCABI::seq_cst:
410 return llvm::AtomicOrdering::SequentiallyConsistent;
411 case llvm::AtomicOrderingCABI::relaxed:
412 return llvm::AtomicOrdering::Monotonic;
413 }
414 llvm_unreachable("Unknown AtomicOrderingCABI enum");
415}
416
417// Map a __MEMORY_SCOPE_* integer constant to the AMDGPU-specific syncscope.
418// Invalid scope values are mapped to system scope (empty string).
419static StringRef getAMDGPUSyncScopeStr(CodeGenModule &CGM, unsigned ScopeInt,
420 llvm::AtomicOrdering AO) {
421 AtomicScopeGenericModel ScopeModel;
422 if (!ScopeModel.isValid(ScopeInt))
423 return "";
424 clang::SyncScope Scope = ScopeModel.map(ScopeInt);
426 Scope, AO);
427}
428
429/// Convert a __MEMORY_SCOPE_* integer constant to a metadata node containing
430/// the target-specific sync scope string.
431static llvm::MetadataAsValue *emitScopeMD(
432 CodeGenFunction &CGF, unsigned ScopeInt,
433 llvm::AtomicOrdering AO = llvm::AtomicOrdering::SequentiallyConsistent) {
434 StringRef ScopeStr = getAMDGPUSyncScopeStr(CGF.CGM, ScopeInt, AO);
435 llvm::LLVMContext &Ctx = CGF.CGM.getLLVMContext();
436 llvm::MDNode *MD =
437 llvm::MDNode::get(Ctx, {llvm::MDString::get(Ctx, ScopeStr)});
438 return llvm::MetadataAsValue::get(Ctx, MD);
439}
440
441// For processing memory ordering and memory scope arguments of various
442// amdgcn builtins.
443// \p Order takes a C++11 compatible memory-ordering specifier and converts
444// it into LLVM's memory ordering specifier using atomic C ABI, and writes
445// to \p AO. \p Scope takes a const char * and converts it into AMDGCN
446// specific SyncScopeID and writes it to \p SSID.
448 llvm::AtomicOrdering &AO,
449 llvm::SyncScope::ID &SSID) {
450 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
451
452 // Map C11/C++11 memory ordering to LLVM memory ordering
453 AO = mapCABIAtomicOrdering(ord);
454
455 // Some of the atomic builtins take the scope as a string name.
456 const llvm::Triple &TargetTriple = getTarget().getTriple();
457 StringRef scp;
458 if (llvm::getConstantStringInfo(Scope, scp)) {
459 if (TargetTriple.isSPIRV())
460 scp = mapScopeToSPIRV(TargetTriple, scp);
461 SSID = getLLVMContext().getOrInsertSyncScopeID(scp);
462 return;
463 }
464
465 // Older builtins had an enum argument for the memory scope.
466 unsigned scope = cast<llvm::ConstantInt>(Scope)->getZExtValue();
467 StringRef SSN = getAMDGPUSyncScopeStr(CGM, scope, AO);
468 SSID = getLLVMContext().getOrInsertSyncScopeID(SSN);
469}
470
472 const CallExpr *E) {
473 constexpr const char *Tag = "amdgpu-synchronize-as";
474
476 for (unsigned K = 2; K < E->getNumArgs(); ++K) {
477 llvm::Value *V = EmitScalarExpr(E->getArg(K));
478 StringRef AS;
479 if (llvm::getConstantStringInfo(V, AS)) {
480 MMRAs.push_back({Tag, AS});
481 // TODO: Delete the resulting unused constant?
482 continue;
483 }
484 CGM.Error(E->getExprLoc(),
485 "expected an address space name as a string literal");
486 }
487
488 MMRAMetadata::appendTags(*Inst, MMRAs);
489}
490
492 if (AMDGPUAvailableVisibleMode.empty())
493 return;
494
495 constexpr const char *Tag = "amdgcn-av";
496 MMRAMetadata::appendTags(*Inst, {{Tag, AMDGPUAvailableVisibleMode}});
497}
498
499static Value *GetAMDGPUPredicate(CodeGenFunction &CGF, Twine Name) {
500 Constant *SpecId = ConstantInt::getAllOnesValue(CGF.Int32Ty);
501
502 LLVMContext &Ctx = CGF.getLLVMContext();
503 MDNode *Predicate = MDNode::get(Ctx, MDString::get(Ctx, Name.str()));
504 std::vector<Value *> Args = {SpecId, ConstantInt::getFalse(Ctx),
505 MetadataAsValue::get(Ctx, Predicate)};
506 Value *Call = CGF.Builder.CreateIntrinsic(
507 Intrinsic::spv_named_boolean_spec_constant, Args);
508
509 return Call;
510}
511
512static Intrinsic::ID getIntrinsicIDforWaveReduction(unsigned BuiltinID) {
513 switch (BuiltinID) {
514 default:
515 llvm_unreachable("Unknown BuiltinID for wave reduction");
516 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_add_u32:
517 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_add_u64:
518 return Intrinsic::amdgcn_wave_reduce_add;
519 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f32:
520 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f64:
521 return Intrinsic::amdgcn_wave_reduce_fadd;
522 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u32:
523 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u64:
524 return Intrinsic::amdgcn_wave_reduce_sub;
525 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f32:
526 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f64:
527 return Intrinsic::amdgcn_wave_reduce_fsub;
528 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i32:
529 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i64:
530 return Intrinsic::amdgcn_wave_reduce_min;
531 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f32:
532 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f64:
533 return Intrinsic::amdgcn_wave_reduce_fmin;
534 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u32:
535 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u64:
536 return Intrinsic::amdgcn_wave_reduce_umin;
537 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_i32:
538 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_i64:
539 return Intrinsic::amdgcn_wave_reduce_max;
540 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f32:
541 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f64:
542 return Intrinsic::amdgcn_wave_reduce_fmax;
543 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u32:
544 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u64:
545 return Intrinsic::amdgcn_wave_reduce_umax;
546 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_and_b32:
547 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_and_b64:
548 return Intrinsic::amdgcn_wave_reduce_and;
549 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_or_b32:
550 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_or_b64:
551 return Intrinsic::amdgcn_wave_reduce_or;
552 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_xor_b32:
553 case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_xor_b64:
554 return Intrinsic::amdgcn_wave_reduce_xor;
555 }
556}
557
559 const CallExpr *E) {
560 llvm::AtomicOrdering AO = llvm::AtomicOrdering::SequentiallyConsistent;
561 llvm::SyncScope::ID SSID;
562 switch (BuiltinID) {
563 case AMDGPU::BI__builtin_amdgcn_wave_reduce_add_u32:
564 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f32:
565 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f64:
566 case AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u32:
567 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f32:
568 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f64:
569 case AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i32:
570 case AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u32:
571 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f32:
572 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f64:
573 case AMDGPU::BI__builtin_amdgcn_wave_reduce_max_i32:
574 case AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u32:
575 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f32:
576 case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f64:
577 case AMDGPU::BI__builtin_amdgcn_wave_reduce_and_b32:
578 case AMDGPU::BI__builtin_amdgcn_wave_reduce_or_b32:
579 case AMDGPU::BI__builtin_amdgcn_wave_reduce_xor_b32:
580 case AMDGPU::BI__builtin_amdgcn_wave_reduce_add_u64:
581 case AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u64:
582 case AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i64:
583 case AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u64:
584 case AMDGPU::BI__builtin_amdgcn_wave_reduce_max_i64:
585 case AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u64:
586 case AMDGPU::BI__builtin_amdgcn_wave_reduce_and_b64:
587 case AMDGPU::BI__builtin_amdgcn_wave_reduce_or_b64:
588 case AMDGPU::BI__builtin_amdgcn_wave_reduce_xor_b64: {
589 Intrinsic::ID IID = getIntrinsicIDforWaveReduction(BuiltinID);
590 llvm::Value *Value = EmitScalarExpr(E->getArg(0));
591 llvm::Value *Strategy = EmitScalarExpr(E->getArg(1));
592 llvm::Function *F = CGM.getIntrinsic(IID, {Value->getType()});
593 return Builder.CreateCall(F, {Value, Strategy});
594 }
595 case AMDGPU::BI__builtin_amdgcn_div_scale:
596 case AMDGPU::BI__builtin_amdgcn_div_scalef: {
597 // Translate from the intrinsics's struct return to the builtin's out
598 // argument.
599
600 Address FlagOutPtr = EmitPointerWithAlignment(E->getArg(3));
601
602 llvm::Value *X = EmitScalarExpr(E->getArg(0));
603 llvm::Value *Y = EmitScalarExpr(E->getArg(1));
604 llvm::Value *Z = EmitScalarExpr(E->getArg(2));
605
606 llvm::Function *Callee = CGM.getIntrinsic(Intrinsic::amdgcn_div_scale,
607 X->getType());
608
609 llvm::Value *Tmp = Builder.CreateCall(Callee, {X, Y, Z});
610
611 llvm::Value *Result = Builder.CreateExtractValue(Tmp, 0);
612 llvm::Value *Flag = Builder.CreateExtractValue(Tmp, 1);
613
614 llvm::Type *RealFlagType = FlagOutPtr.getElementType();
615
616 llvm::Value *FlagExt = Builder.CreateZExt(Flag, RealFlagType);
617 Builder.CreateStore(FlagExt, FlagOutPtr);
618 return Result;
619 }
620 case AMDGPU::BI__builtin_amdgcn_div_fmas:
621 case AMDGPU::BI__builtin_amdgcn_div_fmasf: {
622 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
623 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
624 llvm::Value *Src2 = EmitScalarExpr(E->getArg(2));
625 llvm::Value *Src3 = EmitScalarExpr(E->getArg(3));
626
627 llvm::Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_div_fmas,
628 Src0->getType());
629 llvm::Value *Src3ToBool = Builder.CreateIsNotNull(Src3);
630 return Builder.CreateCall(F, {Src0, Src1, Src2, Src3ToBool});
631 }
632
633 case AMDGPU::BI__builtin_amdgcn_ds_swizzle:
635 Intrinsic::amdgcn_ds_swizzle);
636 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
637 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
638 case AMDGPU::BI__builtin_amdgcn_update_dpp: {
640 // Find out if any arguments are required to be integer constant
641 // expressions.
642 unsigned ICEArguments = 0;
644 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
645 assert(Error == ASTContext::GE_None && "Should not codegen an error");
646 llvm::Type *DataTy = ConvertType(E->getArg(0)->getType());
647 unsigned Size = DataTy->getPrimitiveSizeInBits();
648 llvm::Type *IntTy =
649 llvm::IntegerType::get(Builder.getContext(), std::max(Size, 32u));
650 Function *F =
651 CGM.getIntrinsic(BuiltinID == AMDGPU::BI__builtin_amdgcn_mov_dpp8
652 ? Intrinsic::amdgcn_mov_dpp8
653 : Intrinsic::amdgcn_update_dpp,
654 IntTy);
655 assert(E->getNumArgs() == 5 || E->getNumArgs() == 6 ||
656 E->getNumArgs() == 2);
657 bool InsertOld = BuiltinID == AMDGPU::BI__builtin_amdgcn_mov_dpp;
658 if (InsertOld)
659 Args.push_back(llvm::PoisonValue::get(IntTy));
660 for (unsigned I = 0; I != E->getNumArgs(); ++I) {
661 llvm::Value *V = EmitScalarOrConstFoldImmArg(ICEArguments, I, E);
662 if (I < (BuiltinID == AMDGPU::BI__builtin_amdgcn_update_dpp ? 2u : 1u) &&
663 Size < 32) {
664 if (!DataTy->isIntegerTy())
665 V = Builder.CreateBitCast(
666 V, llvm::IntegerType::get(Builder.getContext(), Size));
667 V = Builder.CreateZExtOrBitCast(V, IntTy);
668 }
669 llvm::Type *ExpTy =
670 F->getFunctionType()->getFunctionParamType(I + InsertOld);
671 Args.push_back(Builder.CreateTruncOrBitCast(V, ExpTy));
672 }
673 Value *V = Builder.CreateCall(F, Args);
674 if (Size < 32 && !DataTy->isIntegerTy())
675 V = Builder.CreateTrunc(
676 V, llvm::IntegerType::get(Builder.getContext(), Size));
677 return Builder.CreateTruncOrBitCast(V, DataTy);
678 }
679 case AMDGPU::BI__builtin_amdgcn_permlane16:
680 case AMDGPU::BI__builtin_amdgcn_permlanex16:
682 *this, E,
683 BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16
684 ? Intrinsic::amdgcn_permlane16
685 : Intrinsic::amdgcn_permlanex16);
686 case AMDGPU::BI__builtin_amdgcn_permlane64:
688 Intrinsic::amdgcn_permlane64);
689 case AMDGPU::BI__builtin_amdgcn_readlane:
691 Intrinsic::amdgcn_readlane);
692 case AMDGPU::BI__builtin_amdgcn_wave_shuffle:
694 Intrinsic::amdgcn_wave_shuffle);
695 case AMDGPU::BI__builtin_amdgcn_readfirstlane:
697 Intrinsic::amdgcn_readfirstlane);
698 case AMDGPU::BI__builtin_amdgcn_div_fixup:
699 case AMDGPU::BI__builtin_amdgcn_div_fixupf:
700 case AMDGPU::BI__builtin_amdgcn_div_fixuph:
702 Intrinsic::amdgcn_div_fixup);
703 case AMDGPU::BI__builtin_amdgcn_trig_preop:
704 case AMDGPU::BI__builtin_amdgcn_trig_preopf:
705 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_trig_preop);
706 case AMDGPU::BI__builtin_amdgcn_rcp:
707 case AMDGPU::BI__builtin_amdgcn_rcpf:
708 case AMDGPU::BI__builtin_amdgcn_rcph:
709 case AMDGPU::BI__builtin_amdgcn_rcp_bf16:
710 return emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::amdgcn_rcp);
711 case AMDGPU::BI__builtin_amdgcn_sqrt:
712 case AMDGPU::BI__builtin_amdgcn_sqrtf:
713 case AMDGPU::BI__builtin_amdgcn_sqrth:
714 case AMDGPU::BI__builtin_amdgcn_sqrt_bf16:
716 Intrinsic::amdgcn_sqrt);
717 case AMDGPU::BI__builtin_amdgcn_rsq:
718 case AMDGPU::BI__builtin_amdgcn_rsqf:
719 case AMDGPU::BI__builtin_amdgcn_rsqh:
720 case AMDGPU::BI__builtin_amdgcn_rsq_bf16:
721 return emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::amdgcn_rsq);
722 case AMDGPU::BI__builtin_amdgcn_rsq_clamp:
723 case AMDGPU::BI__builtin_amdgcn_rsq_clampf:
725 Intrinsic::amdgcn_rsq_clamp);
726 case AMDGPU::BI__builtin_amdgcn_sinf:
727 case AMDGPU::BI__builtin_amdgcn_sinh:
728 case AMDGPU::BI__builtin_amdgcn_sin_bf16:
729 return emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::amdgcn_sin);
730 case AMDGPU::BI__builtin_amdgcn_cosf:
731 case AMDGPU::BI__builtin_amdgcn_cosh:
732 case AMDGPU::BI__builtin_amdgcn_cos_bf16:
733 return emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::amdgcn_cos);
734 case AMDGPU::BI__builtin_amdgcn_dispatch_ptr:
735 return EmitAMDGPUDispatchPtr(*this, E);
736 case AMDGPU::BI__builtin_amdgcn_logf:
737 case AMDGPU::BI__builtin_amdgcn_log_bf16:
738 return emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::amdgcn_log);
739 case AMDGPU::BI__builtin_amdgcn_exp2f:
740 case AMDGPU::BI__builtin_amdgcn_exp2_bf16:
742 Intrinsic::amdgcn_exp2);
743 case AMDGPU::BI__builtin_amdgcn_log_clampf:
745 Intrinsic::amdgcn_log_clamp);
746 case AMDGPU::BI__builtin_amdgcn_ldexp:
747 case AMDGPU::BI__builtin_amdgcn_ldexpf: {
748 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
749 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
750 llvm::Function *F =
751 CGM.getIntrinsic(Intrinsic::ldexp, {Src0->getType(), Src1->getType()});
752 return Builder.CreateCall(F, {Src0, Src1});
753 }
754 case AMDGPU::BI__builtin_amdgcn_ldexph: {
755 // The raw instruction has a different behavior for out of bounds exponent
756 // values (implicit truncation instead of saturate to short_min/short_max).
757 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
758 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
759 llvm::Function *F =
760 CGM.getIntrinsic(Intrinsic::ldexp, {Src0->getType(), Int16Ty});
761 return Builder.CreateCall(F, {Src0, Builder.CreateTrunc(Src1, Int16Ty)});
762 }
763 case AMDGPU::BI__builtin_amdgcn_frexp_mant:
764 case AMDGPU::BI__builtin_amdgcn_frexp_mantf:
765 case AMDGPU::BI__builtin_amdgcn_frexp_manth:
767 Intrinsic::amdgcn_frexp_mant);
768 case AMDGPU::BI__builtin_amdgcn_frexp_exp:
769 case AMDGPU::BI__builtin_amdgcn_frexp_expf: {
770 Value *Src0 = EmitScalarExpr(E->getArg(0));
771 Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_frexp_exp,
772 { Builder.getInt32Ty(), Src0->getType() });
773 return Builder.CreateCall(F, Src0);
774 }
775 case AMDGPU::BI__builtin_amdgcn_frexp_exph: {
776 Value *Src0 = EmitScalarExpr(E->getArg(0));
777 Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_frexp_exp,
778 { Builder.getInt16Ty(), Src0->getType() });
779 return Builder.CreateCall(F, Src0);
780 }
781 case AMDGPU::BI__builtin_amdgcn_fract:
782 case AMDGPU::BI__builtin_amdgcn_fractf:
783 case AMDGPU::BI__builtin_amdgcn_fracth:
785 Intrinsic::amdgcn_fract);
786 case AMDGPU::BI__builtin_amdgcn_lerp:
788 Intrinsic::amdgcn_lerp);
789 case AMDGPU::BI__builtin_amdgcn_ubfe:
791 Intrinsic::amdgcn_ubfe);
792 case AMDGPU::BI__builtin_amdgcn_sbfe:
794 Intrinsic::amdgcn_sbfe);
795 case AMDGPU::BI__builtin_amdgcn_ballot_w32:
796 case AMDGPU::BI__builtin_amdgcn_ballot_w64: {
797 llvm::Type *ResultType = ConvertType(E->getType());
798 llvm::Value *Src = EmitScalarExpr(E->getArg(0));
799 Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_ballot, {ResultType});
800 return Builder.CreateCall(F, {Src});
801 }
802 case AMDGPU::BI__builtin_amdgcn_inverse_ballot_w32:
803 case AMDGPU::BI__builtin_amdgcn_inverse_ballot_w64: {
804 llvm::Value *Src = EmitScalarExpr(E->getArg(0));
805 Function *F =
806 CGM.getIntrinsic(Intrinsic::amdgcn_inverse_ballot, {Src->getType()});
807 return Builder.CreateCall(F, {Src});
808 }
809 case AMDGPU::BI__builtin_amdgcn_tanhf:
810 case AMDGPU::BI__builtin_amdgcn_tanhh:
811 case AMDGPU::BI__builtin_amdgcn_tanh_bf16:
813 Intrinsic::amdgcn_tanh);
814 case AMDGPU::BI__builtin_amdgcn_uicmp:
815 case AMDGPU::BI__builtin_amdgcn_uicmpl:
816 case AMDGPU::BI__builtin_amdgcn_sicmp:
817 case AMDGPU::BI__builtin_amdgcn_sicmpl:
818 case AMDGPU::BI__builtin_amdgcn_fcmp:
819 case AMDGPU::BI__builtin_amdgcn_fcmpf: {
820 Value *LHS = EmitScalarExpr(E->getArg(0));
821 Value *RHS = EmitScalarExpr(E->getArg(1));
822 CmpInst::Predicate Pred = static_cast<CmpInst::Predicate>(
823 cast<ConstantInt>(EmitScalarExpr(E->getArg(2)))->getZExtValue());
824
825 // FIXME-GFX10: How should 32 bit mask be handled?
826 return Builder.CreateIntrinsic(Builder.getInt64Ty(),
827 Intrinsic::amdgcn_ballot,
828 Builder.CreateCmp(Pred, LHS, RHS));
829 }
830 case AMDGPU::BI__builtin_amdgcn_class:
831 case AMDGPU::BI__builtin_amdgcn_classf:
832 case AMDGPU::BI__builtin_amdgcn_classh:
833 return emitFPIntBuiltin(*this, E, Intrinsic::amdgcn_class);
834 case AMDGPU::BI__builtin_amdgcn_fmed3f:
835 case AMDGPU::BI__builtin_amdgcn_fmed3h:
837 Intrinsic::amdgcn_fmed3);
838 case AMDGPU::BI__builtin_amdgcn_ds_append:
839 case AMDGPU::BI__builtin_amdgcn_ds_consume: {
840 Intrinsic::ID Intrin = BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_append ?
841 Intrinsic::amdgcn_ds_append : Intrinsic::amdgcn_ds_consume;
842 Value *Src0 = EmitScalarExpr(E->getArg(0));
843 Function *F = CGM.getIntrinsic(Intrin, { Src0->getType() });
844 return Builder.CreateCall(F, { Src0, Builder.getFalse() });
845 }
846 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_i32:
847 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_v2i32:
848 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4i16:
849 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4f16:
850 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4bf16:
851 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8i16:
852 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8f16:
853 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8bf16:
854 case AMDGPU::BI__builtin_amdgcn_global_load_tr4_b64_v2i32:
855 case AMDGPU::BI__builtin_amdgcn_global_load_tr8_b64_v2i32:
856 case AMDGPU::BI__builtin_amdgcn_global_load_tr6_b96_v3i32:
857 case AMDGPU::BI__builtin_amdgcn_global_load_tr16_b128_v8i16:
858 case AMDGPU::BI__builtin_amdgcn_global_load_tr16_b128_v8f16:
859 case AMDGPU::BI__builtin_amdgcn_global_load_tr16_b128_v8bf16:
860 case AMDGPU::BI__builtin_amdgcn_ds_load_tr4_b64_v2i32:
861 case AMDGPU::BI__builtin_amdgcn_ds_load_tr8_b64_v2i32:
862 case AMDGPU::BI__builtin_amdgcn_ds_load_tr6_b96_v3i32:
863 case AMDGPU::BI__builtin_amdgcn_ds_load_tr16_b128_v8i16:
864 case AMDGPU::BI__builtin_amdgcn_ds_load_tr16_b128_v8f16:
865 case AMDGPU::BI__builtin_amdgcn_ds_load_tr16_b128_v8bf16:
866 case AMDGPU::BI__builtin_amdgcn_ds_read_tr4_b64_v2i32:
867 case AMDGPU::BI__builtin_amdgcn_ds_read_tr8_b64_v2i32:
868 case AMDGPU::BI__builtin_amdgcn_ds_read_tr6_b96_v3i32:
869 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4f16:
870 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4bf16:
871 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4i16: {
872 Intrinsic::ID IID;
873 switch (BuiltinID) {
874 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_i32:
875 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b64_v2i32:
876 case AMDGPU::BI__builtin_amdgcn_global_load_tr8_b64_v2i32:
877 IID = Intrinsic::amdgcn_global_load_tr_b64;
878 break;
879 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4i16:
880 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4f16:
881 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v4bf16:
882 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8i16:
883 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8f16:
884 case AMDGPU::BI__builtin_amdgcn_global_load_tr_b128_v8bf16:
885 case AMDGPU::BI__builtin_amdgcn_global_load_tr16_b128_v8i16:
886 case AMDGPU::BI__builtin_amdgcn_global_load_tr16_b128_v8f16:
887 case AMDGPU::BI__builtin_amdgcn_global_load_tr16_b128_v8bf16:
888 IID = Intrinsic::amdgcn_global_load_tr_b128;
889 break;
890 case AMDGPU::BI__builtin_amdgcn_global_load_tr4_b64_v2i32:
891 IID = Intrinsic::amdgcn_global_load_tr4_b64;
892 break;
893 case AMDGPU::BI__builtin_amdgcn_global_load_tr6_b96_v3i32:
894 IID = Intrinsic::amdgcn_global_load_tr6_b96;
895 break;
896 case AMDGPU::BI__builtin_amdgcn_ds_load_tr4_b64_v2i32:
897 IID = Intrinsic::amdgcn_ds_load_tr4_b64;
898 break;
899 case AMDGPU::BI__builtin_amdgcn_ds_load_tr6_b96_v3i32:
900 IID = Intrinsic::amdgcn_ds_load_tr6_b96;
901 break;
902 case AMDGPU::BI__builtin_amdgcn_ds_load_tr8_b64_v2i32:
903 IID = Intrinsic::amdgcn_ds_load_tr8_b64;
904 break;
905 case AMDGPU::BI__builtin_amdgcn_ds_load_tr16_b128_v8i16:
906 case AMDGPU::BI__builtin_amdgcn_ds_load_tr16_b128_v8f16:
907 case AMDGPU::BI__builtin_amdgcn_ds_load_tr16_b128_v8bf16:
908 IID = Intrinsic::amdgcn_ds_load_tr16_b128;
909 break;
910 case AMDGPU::BI__builtin_amdgcn_ds_read_tr4_b64_v2i32:
911 IID = Intrinsic::amdgcn_ds_read_tr4_b64;
912 break;
913 case AMDGPU::BI__builtin_amdgcn_ds_read_tr8_b64_v2i32:
914 IID = Intrinsic::amdgcn_ds_read_tr8_b64;
915 break;
916 case AMDGPU::BI__builtin_amdgcn_ds_read_tr6_b96_v3i32:
917 IID = Intrinsic::amdgcn_ds_read_tr6_b96;
918 break;
919 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4i16:
920 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4f16:
921 case AMDGPU::BI__builtin_amdgcn_ds_read_tr16_b64_v4bf16:
922 IID = Intrinsic::amdgcn_ds_read_tr16_b64;
923 break;
924 }
925 llvm::Type *LoadTy = ConvertType(E->getType());
926 llvm::Value *Addr = EmitScalarExpr(E->getArg(0));
927 llvm::Function *F = CGM.getIntrinsic(IID, {LoadTy});
928 return Builder.CreateCall(F, {Addr});
929 }
930 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b32:
931 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b64:
932 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b128:
933 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b32:
934 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b64:
935 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b128: {
936
937 Intrinsic::ID IID;
938 switch (BuiltinID) {
939 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b32:
940 IID = Intrinsic::amdgcn_global_load_monitor_b32;
941 break;
942 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b64:
943 IID = Intrinsic::amdgcn_global_load_monitor_b64;
944 break;
945 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b128:
946 IID = Intrinsic::amdgcn_global_load_monitor_b128;
947 break;
948 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b32:
949 IID = Intrinsic::amdgcn_flat_load_monitor_b32;
950 break;
951 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b64:
952 IID = Intrinsic::amdgcn_flat_load_monitor_b64;
953 break;
954 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b128:
955 IID = Intrinsic::amdgcn_flat_load_monitor_b128;
956 break;
957 }
958
959 llvm::Type *LoadTy = ConvertType(E->getType());
960 llvm::Value *Addr = EmitScalarExpr(E->getArg(0));
961
962 auto *AOExpr = cast<llvm::ConstantInt>(EmitScalarExpr(E->getArg(1)));
963 auto *ScopeExpr = cast<llvm::ConstantInt>(EmitScalarExpr(E->getArg(2)));
964 llvm::AtomicOrdering AO = mapCABIAtomicOrdering(AOExpr->getZExtValue());
965
966 llvm::Value *ScopeMD = emitScopeMD(*this, ScopeExpr->getZExtValue(), AO);
967 llvm::Function *F = CGM.getIntrinsic(IID, {LoadTy});
968 return Builder.CreateCall(F, {Addr, AOExpr, ScopeMD});
969 }
970 case AMDGPU::BI__builtin_amdgcn_cluster_load_b32:
971 case AMDGPU::BI__builtin_amdgcn_cluster_load_b64:
972 case AMDGPU::BI__builtin_amdgcn_cluster_load_b128: {
973 Intrinsic::ID IID;
974 switch (BuiltinID) {
975 case AMDGPU::BI__builtin_amdgcn_cluster_load_b32:
976 IID = Intrinsic::amdgcn_cluster_load_b32;
977 break;
978 case AMDGPU::BI__builtin_amdgcn_cluster_load_b64:
979 IID = Intrinsic::amdgcn_cluster_load_b64;
980 break;
981 case AMDGPU::BI__builtin_amdgcn_cluster_load_b128:
982 IID = Intrinsic::amdgcn_cluster_load_b128;
983 break;
984 }
986 for (int i = 0, e = E->getNumArgs(); i != e; ++i)
987 Args.push_back(EmitScalarExpr(E->getArg(i)));
988 llvm::Function *F = CGM.getIntrinsic(IID, {ConvertType(E->getType())});
989 return Builder.CreateCall(F, {Args});
990 }
991 case AMDGPU::BI__builtin_amdgcn_load_to_lds: {
992 // Should this have asan instrumentation?
994 Intrinsic::amdgcn_load_to_lds);
995 }
996 case AMDGPU::BI__builtin_amdgcn_load_async_to_lds: {
997 // Should this have asan instrumentation?
999 *this, E, Intrinsic::amdgcn_load_async_to_lds);
1000 }
1001 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
1002 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
1003 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
1004 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_16x8B:
1005 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_8x16B:
1006 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_8x16B: {
1007 Intrinsic::ID IID;
1008 switch (BuiltinID) {
1009 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
1010 IID = Intrinsic::amdgcn_cooperative_atomic_load_32x4B;
1011 break;
1012 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
1013 IID = Intrinsic::amdgcn_cooperative_atomic_store_32x4B;
1014 break;
1015 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
1016 IID = Intrinsic::amdgcn_cooperative_atomic_load_16x8B;
1017 break;
1018 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_16x8B:
1019 IID = Intrinsic::amdgcn_cooperative_atomic_store_16x8B;
1020 break;
1021 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_8x16B:
1022 IID = Intrinsic::amdgcn_cooperative_atomic_load_8x16B;
1023 break;
1024 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_8x16B:
1025 IID = Intrinsic::amdgcn_cooperative_atomic_store_8x16B;
1026 break;
1027 }
1028
1029 LLVMContext &Ctx = CGM.getLLVMContext();
1031 // last argument is a MD string
1032 const unsigned ScopeArg = E->getNumArgs() - 1;
1033 for (unsigned i = 0; i != ScopeArg; ++i)
1034 Args.push_back(EmitScalarExpr(E->getArg(i)));
1035 StringRef Arg = cast<StringLiteral>(E->getArg(ScopeArg)->IgnoreParenCasts())
1036 ->getString();
1037 llvm::MDNode *MD = llvm::MDNode::get(Ctx, {llvm::MDString::get(Ctx, Arg)});
1038 Args.push_back(llvm::MetadataAsValue::get(Ctx, MD));
1039 // Intrinsic is typed based on the pointer AS. Pointer is always the first
1040 // argument.
1041 llvm::Function *F = CGM.getIntrinsic(IID, {Args[0]->getType()});
1042 return Builder.CreateCall(F, {Args});
1043 }
1044 case AMDGPU::BI__builtin_amdgcn_av_load_b128:
1045 case AMDGPU::BI__builtin_amdgcn_av_store_b128: {
1046 const bool IsStore = BuiltinID == AMDGPU::BI__builtin_amdgcn_av_store_b128;
1047 SmallVector<Value *, 5> Args = {EmitScalarExpr(E->getArg(0))}; // addr
1048 if (IsStore)
1049 Args.push_back(EmitScalarExpr(E->getArg(1))); // data
1050 const unsigned ScopeIdx = E->getNumArgs() - 1;
1051 auto *ScopeExpr =
1053 Args.push_back(emitScopeMD(*this, ScopeExpr->getZExtValue()));
1054 llvm::Function *F =
1055 CGM.getIntrinsic(IsStore ? Intrinsic::amdgcn_av_store_b128
1056 : Intrinsic::amdgcn_av_load_b128,
1057 {Args[0]->getType()});
1058 return Builder.CreateCall(F, Args);
1059 }
1060 case AMDGPU::BI__builtin_amdgcn_get_fpenv: {
1061 Function *F = CGM.getIntrinsic(Intrinsic::get_fpenv,
1062 {llvm::Type::getInt64Ty(getLLVMContext())});
1063 return Builder.CreateCall(F);
1064 }
1065 case AMDGPU::BI__builtin_amdgcn_set_fpenv: {
1066 Function *F = CGM.getIntrinsic(Intrinsic::set_fpenv,
1067 {llvm::Type::getInt64Ty(getLLVMContext())});
1068 llvm::Value *Env = EmitScalarExpr(E->getArg(0));
1069 return Builder.CreateCall(F, {Env});
1070 }
1071 case AMDGPU::BI__builtin_amdgcn_processor_is: {
1072 assert(CGM.getTriple().isSPIRV() &&
1073 "__builtin_amdgcn_processor_is should never reach CodeGen for "
1074 "concrete targets!");
1075 StringRef Proc = cast<clang::StringLiteral>(E->getArg(0))->getString();
1076 return GetAMDGPUPredicate(*this, "is." + Proc);
1077 }
1078 case AMDGPU::BI__builtin_amdgcn_is_invocable: {
1079 assert(CGM.getTriple().isSPIRV() &&
1080 "__builtin_amdgcn_is_invocable should never reach CodeGen for "
1081 "concrete targets!");
1082 auto *FD = cast<FunctionDecl>(
1083 cast<DeclRefExpr>(E->getArg(0))->getReferencedDeclOfCallee());
1084 StringRef RF =
1085 getContext().BuiltinInfo.getRequiredFeatures(FD->getBuiltinID());
1086 return GetAMDGPUPredicate(*this, "has." + RF);
1087 }
1088 case AMDGPU::BI__builtin_amdgcn_read_exec:
1089 return EmitAMDGCNBallotForExec(*this, E, Int64Ty, Int64Ty, false);
1090 case AMDGPU::BI__builtin_amdgcn_read_exec_lo:
1091 return EmitAMDGCNBallotForExec(*this, E, Int32Ty, Int32Ty, false);
1092 case AMDGPU::BI__builtin_amdgcn_read_exec_hi:
1093 return EmitAMDGCNBallotForExec(*this, E, Int64Ty, Int64Ty, true);
1094 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray:
1095 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_h:
1096 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_l:
1097 case AMDGPU::BI__builtin_amdgcn_image_bvh_intersect_ray_lh: {
1098 llvm::Value *NodePtr = EmitScalarExpr(E->getArg(0));
1099 llvm::Value *RayExtent = EmitScalarExpr(E->getArg(1));
1100 llvm::Value *RayOrigin = EmitScalarExpr(E->getArg(2));
1101 llvm::Value *RayDir = EmitScalarExpr(E->getArg(3));
1102 llvm::Value *RayInverseDir = EmitScalarExpr(E->getArg(4));
1103 llvm::Value *TextureDescr = EmitScalarExpr(E->getArg(5));
1104
1105 // The builtins take these arguments as vec4 where the last element is
1106 // ignored. The intrinsic takes them as vec3.
1107 RayOrigin = Builder.CreateShuffleVector(RayOrigin, RayOrigin,
1108 {0, 1, 2});
1109 RayDir =
1110 Builder.CreateShuffleVector(RayDir, RayDir, {0, 1, 2});
1111 RayInverseDir = Builder.CreateShuffleVector(RayInverseDir, RayInverseDir,
1112 {0, 1, 2});
1113
1114 Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_image_bvh_intersect_ray,
1115 {NodePtr->getType(), RayDir->getType()});
1116 return Builder.CreateCall(F, {NodePtr, RayExtent, RayOrigin, RayDir,
1117 RayInverseDir, TextureDescr});
1118 }
1119 case AMDGPU::BI__builtin_amdgcn_image_bvh8_intersect_ray:
1120 case AMDGPU::BI__builtin_amdgcn_image_bvh_dual_intersect_ray: {
1121 Intrinsic::ID IID;
1122 switch (BuiltinID) {
1123 case AMDGPU::BI__builtin_amdgcn_image_bvh8_intersect_ray:
1124 IID = Intrinsic::amdgcn_image_bvh8_intersect_ray;
1125 break;
1126 case AMDGPU::BI__builtin_amdgcn_image_bvh_dual_intersect_ray:
1127 IID = Intrinsic::amdgcn_image_bvh_dual_intersect_ray;
1128 break;
1129 }
1130 llvm::Value *NodePtr = EmitScalarExpr(E->getArg(0));
1131 llvm::Value *RayExtent = EmitScalarExpr(E->getArg(1));
1132 llvm::Value *InstanceMask = EmitScalarExpr(E->getArg(2));
1133 llvm::Value *RayOrigin = EmitScalarExpr(E->getArg(3));
1134 llvm::Value *RayDir = EmitScalarExpr(E->getArg(4));
1135 llvm::Value *Offset = EmitScalarExpr(E->getArg(5));
1136 llvm::Value *TextureDescr = EmitScalarExpr(E->getArg(6));
1137
1138 Address RetRayOriginPtr = EmitPointerWithAlignment(E->getArg(7));
1139 Address RetRayDirPtr = EmitPointerWithAlignment(E->getArg(8));
1140
1141 llvm::Function *IntrinsicFunc = CGM.getIntrinsic(IID);
1142
1143 llvm::CallInst *CI = Builder.CreateCall(
1144 IntrinsicFunc, {NodePtr, RayExtent, InstanceMask, RayOrigin, RayDir,
1145 Offset, TextureDescr});
1146
1147 llvm::Value *RetVData = Builder.CreateExtractValue(CI, 0);
1148 llvm::Value *RetRayOrigin = Builder.CreateExtractValue(CI, 1);
1149 llvm::Value *RetRayDir = Builder.CreateExtractValue(CI, 2);
1150
1151 Builder.CreateStore(RetRayOrigin, RetRayOriginPtr);
1152 Builder.CreateStore(RetRayDir, RetRayDirPtr);
1153
1154 return RetVData;
1155 }
1156
1157 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_rtn:
1158 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_push4_pop1_rtn:
1159 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_push8_pop1_rtn:
1160 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_push8_pop2_rtn: {
1161 Intrinsic::ID IID;
1162 switch (BuiltinID) {
1163 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_rtn:
1164 IID = Intrinsic::amdgcn_ds_bvh_stack_rtn;
1165 break;
1166 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_push4_pop1_rtn:
1167 IID = Intrinsic::amdgcn_ds_bvh_stack_push4_pop1_rtn;
1168 break;
1169 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_push8_pop1_rtn:
1170 IID = Intrinsic::amdgcn_ds_bvh_stack_push8_pop1_rtn;
1171 break;
1172 case AMDGPU::BI__builtin_amdgcn_ds_bvh_stack_push8_pop2_rtn:
1173 IID = Intrinsic::amdgcn_ds_bvh_stack_push8_pop2_rtn;
1174 break;
1175 }
1176
1178 for (int i = 0, e = E->getNumArgs(); i != e; ++i)
1179 Args.push_back(EmitScalarExpr(E->getArg(i)));
1180
1181 Function *F = CGM.getIntrinsic(IID);
1182 Value *Call = Builder.CreateCall(F, Args);
1183 Value *Rtn = Builder.CreateExtractValue(Call, 0);
1184 Value *A = Builder.CreateExtractValue(Call, 1);
1185 llvm::Type *RetTy = ConvertType(E->getType());
1186 Value *I0 = Builder.CreateInsertElement(PoisonValue::get(RetTy), Rtn,
1187 (uint64_t)0);
1188 // ds_bvh_stack_push8_pop2_rtn returns {i64, i32} but the builtin returns
1189 // <2 x i64>, zext the second value.
1190 if (A->getType()->getPrimitiveSizeInBits() <
1191 RetTy->getScalarType()->getPrimitiveSizeInBits())
1192 A = Builder.CreateZExt(A, RetTy->getScalarType());
1193
1194 return Builder.CreateInsertElement(I0, A, 1);
1195 }
1196 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f32_i32:
1197 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f16_i32:
1199 *this, E, Intrinsic::amdgcn_image_load_1d, false);
1200 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f32_i32:
1201 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f16_i32:
1203 *this, E, Intrinsic::amdgcn_image_load_1darray, false);
1204 case AMDGPU::BI__builtin_amdgcn_image_load_2d_f32_i32:
1205 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f32_i32:
1206 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f16_i32:
1208 *this, E, Intrinsic::amdgcn_image_load_2d, false);
1209 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_f32_i32:
1210 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f32_i32:
1211 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f16_i32:
1213 *this, E, Intrinsic::amdgcn_image_load_2darray, false);
1214 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f32_i32:
1215 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f16_i32:
1217 *this, E, Intrinsic::amdgcn_image_load_3d, false);
1218 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f32_i32:
1219 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f16_i32:
1221 *this, E, Intrinsic::amdgcn_image_load_cube, false);
1222 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f32_i32:
1223 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f16_i32:
1225 *this, E, Intrinsic::amdgcn_image_load_mip_1d, false);
1226 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f32_i32:
1227 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f16_i32:
1229 *this, E, Intrinsic::amdgcn_image_load_mip_1darray, false);
1230 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_f32_i32:
1231 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f32_i32:
1232 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f16_i32:
1234 *this, E, Intrinsic::amdgcn_image_load_mip_2d, false);
1235 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_f32_i32:
1236 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f32_i32:
1237 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f16_i32:
1239 *this, E, Intrinsic::amdgcn_image_load_mip_2darray, false);
1240 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f32_i32:
1241 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f16_i32:
1243 *this, E, Intrinsic::amdgcn_image_load_mip_3d, false);
1244 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f32_i32:
1245 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f16_i32:
1247 *this, E, Intrinsic::amdgcn_image_load_mip_cube, false);
1248 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f32_i32:
1249 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f16_i32:
1251 *this, E, Intrinsic::amdgcn_image_store_1d, true);
1252 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f32_i32:
1253 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f16_i32:
1255 *this, E, Intrinsic::amdgcn_image_store_1darray, true);
1256 case AMDGPU::BI__builtin_amdgcn_image_store_2d_f32_i32:
1257 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f32_i32:
1258 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f16_i32:
1260 *this, E, Intrinsic::amdgcn_image_store_2d, true);
1261 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_f32_i32:
1262 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f32_i32:
1263 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f16_i32:
1265 *this, E, Intrinsic::amdgcn_image_store_2darray, true);
1266 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f32_i32:
1267 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f16_i32:
1269 *this, E, Intrinsic::amdgcn_image_store_3d, true);
1270 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f32_i32:
1271 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f16_i32:
1273 *this, E, Intrinsic::amdgcn_image_store_cube, true);
1274 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f32_i32:
1275 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f16_i32:
1277 *this, E, Intrinsic::amdgcn_image_store_mip_1d, true);
1278 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f32_i32:
1279 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f16_i32:
1281 *this, E, Intrinsic::amdgcn_image_store_mip_1darray, true);
1282 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_f32_i32:
1283 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f32_i32:
1284 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f16_i32:
1286 *this, E, Intrinsic::amdgcn_image_store_mip_2d, true);
1287 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_f32_i32:
1288 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f32_i32:
1289 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f16_i32:
1291 *this, E, Intrinsic::amdgcn_image_store_mip_2darray, true);
1292 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f32_i32:
1293 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f16_i32:
1295 *this, E, Intrinsic::amdgcn_image_store_mip_3d, true);
1296 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f32_i32:
1297 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f16_i32:
1299 *this, E, Intrinsic::amdgcn_image_store_mip_cube, true);
1300 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
1301 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
1303 *this, E, Intrinsic::amdgcn_image_sample_1d, false);
1304 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
1305 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
1307 *this, E, Intrinsic::amdgcn_image_sample_1darray, false);
1308 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
1309 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
1310 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
1312 *this, E, Intrinsic::amdgcn_image_sample_2d, false);
1313 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
1314 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
1315 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
1317 *this, E, Intrinsic::amdgcn_image_sample_2darray, false);
1318 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
1319 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
1321 *this, E, Intrinsic::amdgcn_image_sample_3d, false);
1322 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
1323 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
1325 *this, E, Intrinsic::amdgcn_image_sample_cube, false);
1326 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32:
1327 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32:
1329 *this, E, Intrinsic::amdgcn_image_sample_lz_1d, false);
1330 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32:
1331 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32:
1333 *this, E, Intrinsic::amdgcn_image_sample_l_1d, false);
1334 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32:
1335 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32:
1337 *this, E, Intrinsic::amdgcn_image_sample_d_1d, false);
1338 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32:
1339 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32:
1340 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32:
1342 *this, E, Intrinsic::amdgcn_image_sample_lz_2d, false);
1343 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32:
1344 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32:
1345 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32:
1347 *this, E, Intrinsic::amdgcn_image_sample_l_2d, false);
1348 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32:
1349 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32:
1350 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32:
1352 *this, E, Intrinsic::amdgcn_image_sample_d_2d, false);
1353 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32:
1354 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32:
1356 *this, E, Intrinsic::amdgcn_image_sample_lz_3d, false);
1357 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32:
1358 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32:
1360 *this, E, Intrinsic::amdgcn_image_sample_l_3d, false);
1361 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32:
1362 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32:
1364 *this, E, Intrinsic::amdgcn_image_sample_d_3d, false);
1365 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32:
1366 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32:
1368 *this, E, Intrinsic::amdgcn_image_sample_lz_cube, false);
1369 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32:
1370 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32:
1372 *this, E, Intrinsic::amdgcn_image_sample_l_cube, false);
1373 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32:
1374 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32:
1376 *this, E, Intrinsic::amdgcn_image_sample_lz_1darray, false);
1377 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32:
1378 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32:
1380 *this, E, Intrinsic::amdgcn_image_sample_l_1darray, false);
1381 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32:
1382 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32:
1384 *this, E, Intrinsic::amdgcn_image_sample_d_1darray, false);
1385 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32:
1386 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32:
1387 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32:
1389 *this, E, Intrinsic::amdgcn_image_sample_lz_2darray, false);
1390 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32:
1391 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32:
1392 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32:
1394 *this, E, Intrinsic::amdgcn_image_sample_l_2darray, false);
1395 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32:
1396 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32:
1397 case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32:
1399 *this, E, Intrinsic::amdgcn_image_sample_d_2darray, false);
1400 case clang::AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32:
1402 *this, E, Intrinsic::amdgcn_image_gather4_lz_2d, false);
1403 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
1404 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
1405 llvm::FixedVectorType *VT = FixedVectorType::get(Builder.getInt32Ty(), 8);
1406 Function *F = CGM.getIntrinsic(
1407 BuiltinID == AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4
1408 ? Intrinsic::amdgcn_mfma_scale_f32_32x32x64_f8f6f4
1409 : Intrinsic::amdgcn_mfma_scale_f32_16x16x128_f8f6f4,
1410 {VT, VT});
1411
1413 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1414 Args.push_back(EmitScalarExpr(E->getArg(I)));
1415 return Builder.CreateCall(F, Args);
1416 }
1417 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32:
1418 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w32:
1419 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64:
1420 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w64:
1421 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32:
1422 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w32:
1423 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64:
1424 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w64:
1425 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32:
1426 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64:
1427 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32:
1428 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64:
1429 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32:
1430 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64:
1431 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32:
1432 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64:
1433 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32_gfx12:
1434 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64_gfx12:
1435 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12:
1436 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64_gfx12:
1437 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32_gfx12:
1438 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64_gfx12:
1439 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32_gfx12:
1440 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64_gfx12:
1441 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32_gfx12:
1442 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64_gfx12:
1443 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12:
1444 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64_gfx12:
1445 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12:
1446 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w64_gfx12:
1447 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12:
1448 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w64_gfx12:
1449 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12:
1450 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w64_gfx12:
1451 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12:
1452 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w64_gfx12:
1453 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w32_gfx12:
1454 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w64_gfx12:
1455 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w32:
1456 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w64:
1457 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w32:
1458 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w64:
1459 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w32:
1460 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w64:
1461 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w32:
1462 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w64:
1463 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w32:
1464 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w64:
1465 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w32:
1466 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w64:
1467 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w32:
1468 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w64:
1469 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w32:
1470 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w64:
1471 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w32:
1472 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w64:
1473 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w32:
1474 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w64:
1475 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w32:
1476 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w64:
1477 // GFX1250 WMMA builtins
1478 case AMDGPU::BI__builtin_amdgcn_wmma_f64_16x16x4_f64:
1479 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x4_f32:
1480 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_bf16:
1481 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_f16:
1482 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x32_f16:
1483 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x32_bf16:
1484 case AMDGPU::BI__builtin_amdgcn_wmma_bf16f32_16x16x32_bf16:
1485 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_fp8_fp8:
1486 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_fp8_bf8:
1487 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_bf8_fp8:
1488 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_bf8_bf8:
1489 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_fp8_fp8:
1490 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_fp8_bf8:
1491 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_bf8_fp8:
1492 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_bf8_bf8:
1493 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_fp8_fp8:
1494 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_fp8_bf8:
1495 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_bf8_fp8:
1496 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_bf8_bf8:
1497 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_fp8_fp8:
1498 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_fp8_bf8:
1499 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_bf8_fp8:
1500 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_bf8_bf8:
1501 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8:
1502 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_f8f6f4:
1503 case AMDGPU::BI__builtin_amdgcn_wmma_f32_32x16x128_f4:
1504 case AMDGPU::BI__builtin_amdgcn_wmma_scale_f32_16x16x128_f8f6f4:
1505 case AMDGPU::BI__builtin_amdgcn_wmma_scale16_f32_16x16x128_f8f6f4:
1506 case AMDGPU::BI__builtin_amdgcn_wmma_scale_f32_32x16x128_f4:
1507 case AMDGPU::BI__builtin_amdgcn_wmma_scale16_f32_32x16x128_f4:
1508 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x64_f16:
1509 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x64_bf16:
1510 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x64_f16:
1511 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x64_bf16:
1512 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16f32_16x16x64_bf16:
1513 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_fp8_fp8:
1514 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_fp8_bf8:
1515 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_bf8_fp8:
1516 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_bf8_bf8:
1517 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_fp8_fp8:
1518 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_fp8_bf8:
1519 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_bf8_fp8:
1520 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_bf8_bf8:
1521 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8: {
1522
1523 // These operations perform a matrix multiplication and accumulation of
1524 // the form:
1525 // D = A * B + C
1526 // We need to specify one type for matrices AB and one for matrices CD.
1527 // Sparse matrix operations can have different types for A and B as well as
1528 // an additional type for sparsity index.
1529 // Destination type should be put before types used for source operands.
1530 SmallVector<unsigned, 2> ArgsForMatchingMatrixTypes;
1531 // On GFX12, the intrinsics with 16-bit accumulator use a packed layout.
1532 // There is no need for the variable opsel argument, so always set it to
1533 // "false".
1534 bool AppendFalseForOpselArg = false;
1535 unsigned BuiltinWMMAOp;
1536 // Need return type when D and C are of different types.
1537 bool NeedReturnType = false;
1538 // Need to remove unused neg modifiers.
1539 bool RemoveABNeg = false;
1540
1541 switch (BuiltinID) {
1542 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32:
1543 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64:
1544 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w32_gfx12:
1545 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_f16_w64_gfx12:
1546 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1547 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_f16;
1548 break;
1549 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32:
1550 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64:
1551 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w32_gfx12:
1552 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf16_w64_gfx12:
1553 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1554 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf16;
1555 break;
1556 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12:
1557 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64_gfx12:
1558 AppendFalseForOpselArg = true;
1559 [[fallthrough]];
1560 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w32:
1561 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_w64:
1562 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1563 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x16_f16;
1564 break;
1565 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32_gfx12:
1566 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64_gfx12:
1567 AppendFalseForOpselArg = true;
1568 [[fallthrough]];
1569 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w32:
1570 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_w64:
1571 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1572 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16;
1573 break;
1574 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w32:
1575 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x16_f16_tied_w64:
1576 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1577 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x16_f16_tied;
1578 break;
1579 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w32:
1580 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x16_bf16_tied_w64:
1581 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1582 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16_tied;
1583 break;
1584 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32:
1585 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64:
1586 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12:
1587 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64_gfx12:
1588 ArgsForMatchingMatrixTypes = {4, 1}; // CD, AB
1589 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x16_iu8;
1590 break;
1591 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32:
1592 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64:
1593 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w32_gfx12:
1594 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x16_iu4_w64_gfx12:
1595 ArgsForMatchingMatrixTypes = {4, 1}; // CD, AB
1596 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x16_iu4;
1597 break;
1598 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12:
1599 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w64_gfx12:
1600 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1601 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_fp8_fp8;
1602 break;
1603 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12:
1604 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w64_gfx12:
1605 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1606 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_fp8_bf8;
1607 break;
1608 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12:
1609 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w64_gfx12:
1610 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1611 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf8_fp8;
1612 break;
1613 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12:
1614 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w64_gfx12:
1615 ArgsForMatchingMatrixTypes = {2, 0}; // CD, AB
1616 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x16_bf8_bf8;
1617 break;
1618 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w32_gfx12:
1619 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x32_iu4_w64_gfx12:
1620 ArgsForMatchingMatrixTypes = {4, 1}; // CD, AB
1621 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x32_iu4;
1622 break;
1623 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w32:
1624 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_f16_w64:
1625 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1626 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_f16;
1627 break;
1628 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w32:
1629 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf16_w64:
1630 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1631 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf16;
1632 break;
1633 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w32:
1634 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x32_f16_w64:
1635 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1636 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x32_f16;
1637 break;
1638 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w32:
1639 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x32_bf16_w64:
1640 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1641 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_bf16_16x16x32_bf16;
1642 break;
1643 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w32:
1644 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu8_w64:
1645 ArgsForMatchingMatrixTypes = {4, 1, 3, 5}; // CD, A, B, Index
1646 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x32_iu8;
1647 break;
1648 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w32:
1649 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x32_iu4_w64:
1650 ArgsForMatchingMatrixTypes = {4, 1, 3, 5}; // CD, A, B, Index
1651 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x32_iu4;
1652 break;
1653 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w32:
1654 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x64_iu4_w64:
1655 ArgsForMatchingMatrixTypes = {4, 1, 3, 5}; // CD, A, B, Index
1656 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x64_iu4;
1657 break;
1658 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w32:
1659 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_fp8_w64:
1660 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1661 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_fp8;
1662 break;
1663 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w32:
1664 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_fp8_bf8_w64:
1665 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1666 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_bf8;
1667 break;
1668 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w32:
1669 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_fp8_w64:
1670 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1671 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_fp8;
1672 break;
1673 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w32:
1674 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x32_bf8_bf8_w64:
1675 ArgsForMatchingMatrixTypes = {2, 0, 1, 3}; // CD, A, B, Index
1676 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_bf8;
1677 break;
1678 // GFX1250 WMMA builtins
1679 case AMDGPU::BI__builtin_amdgcn_wmma_f64_16x16x4_f64:
1680 ArgsForMatchingMatrixTypes = {5, 1};
1681 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f64_16x16x4_f64;
1682 break;
1683 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x4_f32:
1684 ArgsForMatchingMatrixTypes = {3, 0};
1685 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x4_f32;
1686 RemoveABNeg = true;
1687 break;
1688 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_bf16:
1689 ArgsForMatchingMatrixTypes = {3, 0};
1690 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x32_bf16;
1691 RemoveABNeg = true;
1692 break;
1693 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_f16:
1694 ArgsForMatchingMatrixTypes = {3, 0};
1695 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x32_f16;
1696 RemoveABNeg = true;
1697 break;
1698 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x32_f16:
1699 ArgsForMatchingMatrixTypes = {3, 0};
1700 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x32_f16;
1701 RemoveABNeg = true;
1702 break;
1703 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x32_bf16:
1704 ArgsForMatchingMatrixTypes = {3, 0};
1705 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16_16x16x32_bf16;
1706 RemoveABNeg = true;
1707 break;
1708 case AMDGPU::BI__builtin_amdgcn_wmma_bf16f32_16x16x32_bf16:
1709 NeedReturnType = true;
1710 ArgsForMatchingMatrixTypes = {0, 3};
1711 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_bf16f32_16x16x32_bf16;
1712 RemoveABNeg = true;
1713 break;
1714 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_fp8_fp8:
1715 ArgsForMatchingMatrixTypes = {3, 0};
1716 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x64_fp8_fp8;
1717 break;
1718 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_fp8_bf8:
1719 ArgsForMatchingMatrixTypes = {3, 0};
1720 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x64_fp8_bf8;
1721 break;
1722 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_bf8_fp8:
1723 ArgsForMatchingMatrixTypes = {3, 0};
1724 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x64_bf8_fp8;
1725 break;
1726 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x64_bf8_bf8:
1727 ArgsForMatchingMatrixTypes = {3, 0};
1728 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x64_bf8_bf8;
1729 break;
1730 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_fp8_fp8:
1731 ArgsForMatchingMatrixTypes = {3, 0};
1732 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x64_fp8_fp8;
1733 break;
1734 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_fp8_bf8:
1735 ArgsForMatchingMatrixTypes = {3, 0};
1736 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x64_fp8_bf8;
1737 break;
1738 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_bf8_fp8:
1739 ArgsForMatchingMatrixTypes = {3, 0};
1740 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x64_bf8_fp8;
1741 break;
1742 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x64_bf8_bf8:
1743 ArgsForMatchingMatrixTypes = {3, 0};
1744 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x64_bf8_bf8;
1745 break;
1746 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_fp8_fp8:
1747 ArgsForMatchingMatrixTypes = {3, 0};
1748 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x128_fp8_fp8;
1749 break;
1750 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_fp8_bf8:
1751 ArgsForMatchingMatrixTypes = {3, 0};
1752 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x128_fp8_bf8;
1753 break;
1754 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_bf8_fp8:
1755 ArgsForMatchingMatrixTypes = {3, 0};
1756 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x128_bf8_fp8;
1757 break;
1758 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x128_bf8_bf8:
1759 ArgsForMatchingMatrixTypes = {3, 0};
1760 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f16_16x16x128_bf8_bf8;
1761 break;
1762 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_fp8_fp8:
1763 ArgsForMatchingMatrixTypes = {3, 0};
1764 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x128_fp8_fp8;
1765 break;
1766 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_fp8_bf8:
1767 ArgsForMatchingMatrixTypes = {3, 0};
1768 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x128_fp8_bf8;
1769 break;
1770 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_bf8_fp8:
1771 ArgsForMatchingMatrixTypes = {3, 0};
1772 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x128_bf8_fp8;
1773 break;
1774 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_bf8_bf8:
1775 ArgsForMatchingMatrixTypes = {3, 0};
1776 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x128_bf8_bf8;
1777 break;
1778 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8:
1779 ArgsForMatchingMatrixTypes = {4, 1};
1780 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_i32_16x16x64_iu8;
1781 break;
1782 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x128_f8f6f4:
1783 ArgsForMatchingMatrixTypes = {5, 1, 3};
1784 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_16x16x128_f8f6f4;
1785 break;
1786 case AMDGPU::BI__builtin_amdgcn_wmma_scale_f32_16x16x128_f8f6f4:
1787 ArgsForMatchingMatrixTypes = {5, 1, 3};
1788 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_scale_f32_16x16x128_f8f6f4;
1789 break;
1790 case AMDGPU::BI__builtin_amdgcn_wmma_scale16_f32_16x16x128_f8f6f4:
1791 ArgsForMatchingMatrixTypes = {5, 1, 3};
1792 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_scale16_f32_16x16x128_f8f6f4;
1793 break;
1794 case AMDGPU::BI__builtin_amdgcn_wmma_f32_32x16x128_f4:
1795 ArgsForMatchingMatrixTypes = {3, 0, 1};
1796 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_f32_32x16x128_f4;
1797 break;
1798 case AMDGPU::BI__builtin_amdgcn_wmma_scale_f32_32x16x128_f4:
1799 ArgsForMatchingMatrixTypes = {3, 0, 1};
1800 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_scale_f32_32x16x128_f4;
1801 break;
1802 case AMDGPU::BI__builtin_amdgcn_wmma_scale16_f32_32x16x128_f4:
1803 ArgsForMatchingMatrixTypes = {3, 0, 1};
1804 BuiltinWMMAOp = Intrinsic::amdgcn_wmma_scale16_f32_32x16x128_f4;
1805 break;
1806 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x64_f16:
1807 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
1808 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x64_f16;
1809 break;
1810 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x64_bf16:
1811 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
1812 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x64_bf16;
1813 break;
1814 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x64_f16:
1815 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
1816 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x64_f16;
1817 break;
1818 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16_16x16x64_bf16:
1819 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
1820 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_bf16_16x16x64_bf16;
1821 break;
1822 case AMDGPU::BI__builtin_amdgcn_swmmac_bf16f32_16x16x64_bf16:
1823 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
1824 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_bf16f32_16x16x64_bf16;
1825 break;
1826 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_fp8_fp8:
1827 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1828 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x128_fp8_fp8;
1829 break;
1830 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_fp8_bf8:
1831 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1832 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x128_fp8_bf8;
1833 break;
1834 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_bf8_fp8:
1835 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1836 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x128_bf8_fp8;
1837 break;
1838 case AMDGPU::BI__builtin_amdgcn_swmmac_f32_16x16x128_bf8_bf8:
1839 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1840 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f32_16x16x128_bf8_bf8;
1841 break;
1842 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_fp8_fp8:
1843 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1844 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x128_fp8_fp8;
1845 break;
1846 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_fp8_bf8:
1847 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1848 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x128_fp8_bf8;
1849 break;
1850 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_bf8_fp8:
1851 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1852 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x128_bf8_fp8;
1853 break;
1854 case AMDGPU::BI__builtin_amdgcn_swmmac_f16_16x16x128_bf8_bf8:
1855 ArgsForMatchingMatrixTypes = {2, 0, 1, 3};
1856 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_f16_16x16x128_bf8_bf8;
1857 break;
1858 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8:
1859 ArgsForMatchingMatrixTypes = {4, 1, 3, 5};
1860 BuiltinWMMAOp = Intrinsic::amdgcn_swmmac_i32_16x16x128_iu8;
1861 break;
1862 }
1863
1865 for (int i = 0, e = E->getNumArgs(); i != e; ++i) {
1866 // Remove unused neg modifiers.
1867 if (RemoveABNeg && (i == 0 || i == 2))
1868 continue;
1869 Args.push_back(EmitScalarExpr(E->getArg(i)));
1870 }
1871 if (AppendFalseForOpselArg)
1872 Args.push_back(Builder.getFalse());
1873
1874 // Handle the optional clamp argument of the following two builtins.
1875 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8) {
1876 if (Args.size() == 7)
1877 Args.push_back(Builder.getFalse());
1878 assert(Args.size() == 8 && "Expected 8 arguments");
1879 Args[7] = Builder.CreateZExtOrTrunc(Args[7], Builder.getInt1Ty());
1880 } else if (BuiltinID ==
1881 AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8) {
1882 if (Args.size() == 8)
1883 Args.push_back(Builder.getFalse());
1884 assert(Args.size() == 9 && "Expected 9 arguments");
1885 Args[8] = Builder.CreateZExtOrTrunc(Args[8], Builder.getInt1Ty());
1886 }
1887
1889 if (NeedReturnType)
1890 ArgTypes.push_back(ConvertType(E->getType()));
1891 for (auto ArgIdx : ArgsForMatchingMatrixTypes)
1892 ArgTypes.push_back(Args[ArgIdx]->getType());
1893
1894 Function *F = CGM.getIntrinsic(BuiltinWMMAOp, ArgTypes);
1895 return Builder.CreateCall(F, Args);
1896 }
1897 // amdgcn workgroup size
1898 case AMDGPU::BI__builtin_amdgcn_workgroup_size_x:
1899 return EmitAMDGPUWorkGroupSize(*this, 0);
1900 case AMDGPU::BI__builtin_amdgcn_workgroup_size_y:
1901 return EmitAMDGPUWorkGroupSize(*this, 1);
1902 case AMDGPU::BI__builtin_amdgcn_workgroup_size_z:
1903 return EmitAMDGPUWorkGroupSize(*this, 2);
1904
1905 // amdgcn grid size
1906 case AMDGPU::BI__builtin_amdgcn_grid_size_x:
1907 return EmitAMDGPUGridSize(*this, 0);
1908 case AMDGPU::BI__builtin_amdgcn_grid_size_y:
1909 return EmitAMDGPUGridSize(*this, 1);
1910 case AMDGPU::BI__builtin_amdgcn_grid_size_z:
1911 return EmitAMDGPUGridSize(*this, 2);
1912
1913 // r600 intrinsics
1914 case AMDGPU::BI__builtin_r600_recipsqrt_ieee:
1915 case AMDGPU::BI__builtin_r600_recipsqrt_ieeef:
1917 Intrinsic::r600_recipsqrt_ieee);
1918 case AMDGPU::BI__builtin_amdgcn_alignbit: {
1919 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
1920 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
1921 llvm::Value *Src2 = EmitScalarExpr(E->getArg(2));
1922 Function *F = CGM.getIntrinsic(Intrinsic::fshr, Src0->getType());
1923 return Builder.CreateCall(F, { Src0, Src1, Src2 });
1924 }
1925 case AMDGPU::BI__builtin_amdgcn_fence: {
1927 EmitScalarExpr(E->getArg(1)), AO, SSID);
1928 FenceInst *Fence = Builder.CreateFence(AO, SSID);
1929 if (E->getNumArgs() > 2)
1931 getTargetHooks().setTargetAtomicMetadata(*this, *Fence);
1932 return Fence;
1933 }
1934 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
1935 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
1936 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
1937 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
1938 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f64:
1939 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f32:
1940 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2f16:
1941 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16:
1942 case AMDGPU::BI__builtin_amdgcn_ds_faddf:
1943 case AMDGPU::BI__builtin_amdgcn_ds_fminf:
1944 case AMDGPU::BI__builtin_amdgcn_ds_fmaxf:
1945 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f32:
1946 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f64:
1947 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2f16:
1948 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2f16:
1949 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f32:
1950 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f64:
1951 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16:
1952 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16:
1953 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmin_f64:
1954 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmax_f64:
1955 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmin_f64:
1956 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmax_f64: {
1957 llvm::AtomicRMWInst::BinOp BinOp;
1958 switch (BuiltinID) {
1959 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
1960 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
1961 BinOp = llvm::AtomicRMWInst::UIncWrap;
1962 break;
1963 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
1964 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
1965 BinOp = llvm::AtomicRMWInst::UDecWrap;
1966 break;
1967 case AMDGPU::BI__builtin_amdgcn_ds_faddf:
1968 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f64:
1969 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_f32:
1970 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2f16:
1971 case AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16:
1972 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f32:
1973 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_f64:
1974 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2f16:
1975 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2f16:
1976 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f32:
1977 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_f64:
1978 case AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16:
1979 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16:
1980 BinOp = llvm::AtomicRMWInst::FAdd;
1981 break;
1982 case AMDGPU::BI__builtin_amdgcn_ds_fminf:
1983 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmin_f64:
1984 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmin_f64:
1985 BinOp = llvm::AtomicRMWInst::FMin;
1986 break;
1987 case AMDGPU::BI__builtin_amdgcn_global_atomic_fmax_f64:
1988 case AMDGPU::BI__builtin_amdgcn_flat_atomic_fmax_f64:
1989 case AMDGPU::BI__builtin_amdgcn_ds_fmaxf:
1990 BinOp = llvm::AtomicRMWInst::FMax;
1991 break;
1992 }
1993
1994 Address Ptr = CheckAtomicAlignment(*this, E);
1995 Value *Val = EmitScalarExpr(E->getArg(1));
1996 llvm::Type *OrigTy = Val->getType();
1997 QualType PtrTy = E->getArg(0)->IgnoreImpCasts()->getType();
1998
1999 bool Volatile;
2000
2001 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_faddf ||
2002 BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_fminf ||
2003 BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_fmaxf) {
2004 // __builtin_amdgcn_ds_faddf/fminf/fmaxf has an explicit volatile argument
2005 Volatile =
2006 cast<ConstantInt>(EmitScalarExpr(E->getArg(4)))->getZExtValue();
2007 } else {
2008 // Infer volatile from the passed type.
2009 Volatile =
2010 PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
2011 }
2012
2013 if (E->getNumArgs() >= 4) {
2014 // Some of the builtins have explicit ordering and scope arguments.
2016 EmitScalarExpr(E->getArg(3)), AO, SSID);
2017 } else {
2018 // Most of the builtins do not have syncscope/order arguments. For DS
2019 // atomics the scope doesn't really matter, as they implicitly operate at
2020 // workgroup scope.
2021 //
2022 // The global/flat cases need to use agent scope to consistently produce
2023 // the native instruction instead of a cmpxchg expansion.
2024 SSID =
2025 getLLVMContext().getOrInsertSyncScopeID(*llvm::getAtomicScopeIRString(
2026 getTarget().getTriple(), llvm::AtomicScope::Device));
2027 AO = AtomicOrdering::Monotonic;
2028
2029 // The v2bf16 builtin uses i16 instead of a natural bfloat type.
2030 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_ds_atomic_fadd_v2bf16 ||
2031 BuiltinID == AMDGPU::BI__builtin_amdgcn_global_atomic_fadd_v2bf16 ||
2032 BuiltinID == AMDGPU::BI__builtin_amdgcn_flat_atomic_fadd_v2bf16) {
2033 llvm::Type *V2BF16Ty = FixedVectorType::get(
2034 llvm::Type::getBFloatTy(Builder.getContext()), 2);
2035 Val = Builder.CreateBitCast(Val, V2BF16Ty);
2036 }
2037 }
2038
2039 llvm::AtomicRMWInst *RMW =
2040 Builder.CreateAtomicRMW(BinOp, Ptr, Val, AO, SSID);
2041 if (Volatile)
2042 RMW->setVolatile(true);
2044
2045 unsigned AddrSpace = Ptr.getType()->getAddressSpace();
2046 if (AddrSpace != llvm::AMDGPUAS::LOCAL_ADDRESS) {
2047 // Most targets require "amdgpu.no.fine.grained.memory" to emit the native
2048 // instruction for flat and global operations.
2049 llvm::MDTuple *EmptyMD = MDNode::get(getLLVMContext(), {});
2050 RMW->setMetadata("amdgpu.no.fine.grained.memory", EmptyMD);
2051
2052 // Most targets require "amdgpu.ignore.denormal.mode" to emit the native
2053 // instruction, but this only matters for float fadd.
2054 if (BinOp == llvm::AtomicRMWInst::FAdd && Val->getType()->isFloatTy())
2055 RMW->setMetadata("amdgpu.ignore.denormal.mode", EmptyMD);
2056 }
2057
2058 return Builder.CreateBitCast(RMW, OrigTy);
2059 }
2060 case AMDGPU::BI__builtin_amdgcn_s_sendmsg_rtn:
2061 case AMDGPU::BI__builtin_amdgcn_s_sendmsg_rtnl: {
2062 llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
2063 llvm::Type *ResultType = ConvertType(E->getType());
2064 // s_sendmsg_rtn is mangled using return type only.
2065 Function *F =
2066 CGM.getIntrinsic(Intrinsic::amdgcn_s_sendmsg_rtn, {ResultType});
2067 return Builder.CreateCall(F, {Arg});
2068 }
2069 case AMDGPU::BI__builtin_amdgcn_permlane16_swap:
2070 case AMDGPU::BI__builtin_amdgcn_permlane32_swap: {
2071 // Because builtin types are limited, and the intrinsic uses a struct/pair
2072 // output, marshal the pair-of-i32 to <2 x i32>.
2073 Value *VDstOld = EmitScalarExpr(E->getArg(0));
2074 Value *VSrcOld = EmitScalarExpr(E->getArg(1));
2075 Value *FI = EmitScalarExpr(E->getArg(2));
2076 Value *BoundCtrl = EmitScalarExpr(E->getArg(3));
2077 Function *F =
2078 CGM.getIntrinsic(BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16_swap
2079 ? Intrinsic::amdgcn_permlane16_swap
2080 : Intrinsic::amdgcn_permlane32_swap);
2081 llvm::CallInst *Call =
2082 Builder.CreateCall(F, {VDstOld, VSrcOld, FI, BoundCtrl});
2083
2084 llvm::Value *Elt0 = Builder.CreateExtractValue(Call, 0);
2085 llvm::Value *Elt1 = Builder.CreateExtractValue(Call, 1);
2086
2087 llvm::Type *ResultType = ConvertType(E->getType());
2088
2089 llvm::Value *Insert0 = Builder.CreateInsertElement(
2090 llvm::PoisonValue::get(ResultType), Elt0, UINT64_C(0));
2091 llvm::Value *AsVector =
2092 Builder.CreateInsertElement(Insert0, Elt1, UINT64_C(1));
2093 return AsVector;
2094 }
2095 case AMDGPU::BI__builtin_amdgcn_bitop3_b32:
2096 case AMDGPU::BI__builtin_amdgcn_bitop3_b16:
2098 Intrinsic::amdgcn_bitop3);
2099 case AMDGPU::BI__builtin_amdgcn_make_buffer_rsrc: {
2100 // TODO: LLVM has this overloaded to allow for fat pointers, but since
2101 // those haven't been plumbed through to Clang yet, default to creating the
2102 // resource type.
2104 for (unsigned I = 0; I < 4; ++I)
2105 Args.push_back(EmitScalarExpr(E->getArg(I)));
2106 llvm::PointerType *RetTy = llvm::PointerType::get(
2107 Builder.getContext(), llvm::AMDGPUAS::BUFFER_RESOURCE);
2108 Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_make_buffer_rsrc,
2109 {RetTy, Args[0]->getType()});
2110 return Builder.CreateCall(F, Args);
2111 }
2112 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b8:
2113 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b16:
2114 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b32:
2115 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b64:
2116 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b96:
2117 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_b128:
2119 *this, E, Intrinsic::amdgcn_raw_ptr_buffer_store);
2120 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_format_v4f32:
2121 case AMDGPU::BI__builtin_amdgcn_raw_buffer_store_format_v4f16:
2123 *this, E, Intrinsic::amdgcn_raw_ptr_buffer_store_format);
2124 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b8:
2125 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b16:
2126 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b32:
2127 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b64:
2128 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b96:
2129 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b128: {
2130 llvm::Type *RetTy = nullptr;
2131 switch (BuiltinID) {
2132 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b8:
2133 RetTy = Int8Ty;
2134 break;
2135 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b16:
2136 RetTy = Int16Ty;
2137 break;
2138 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b32:
2139 RetTy = Int32Ty;
2140 break;
2141 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b64:
2142 RetTy = llvm::FixedVectorType::get(Int32Ty, /*NumElements=*/2);
2143 break;
2144 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b96:
2145 RetTy = llvm::FixedVectorType::get(Int32Ty, /*NumElements=*/3);
2146 break;
2147 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_b128:
2148 RetTy = llvm::FixedVectorType::get(Int32Ty, /*NumElements=*/4);
2149 break;
2150 }
2151 Function *F =
2152 CGM.getIntrinsic(Intrinsic::amdgcn_raw_ptr_buffer_load, RetTy);
2153 return Builder.CreateCall(
2154 F, {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)),
2155 EmitScalarExpr(E->getArg(2)), EmitScalarExpr(E->getArg(3))});
2156 }
2157 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_format_v4f32:
2158 case AMDGPU::BI__builtin_amdgcn_raw_buffer_load_format_v4f16: {
2159 llvm::Type *RetTy = ConvertType(E->getType());
2160 Function *F =
2161 CGM.getIntrinsic(Intrinsic::amdgcn_raw_ptr_buffer_load_format, {RetTy});
2162
2163 return Builder.CreateCall(
2164 F, {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)),
2165 EmitScalarExpr(E->getArg(2)), EmitScalarExpr(E->getArg(3))});
2166 }
2167 case AMDGPU::BI__builtin_amdgcn_struct_buffer_store_format_v4f32:
2168 case AMDGPU::BI__builtin_amdgcn_struct_buffer_store_format_v4f16:
2170 *this, E, Intrinsic::amdgcn_struct_ptr_buffer_store_format);
2171 case AMDGPU::BI__builtin_amdgcn_struct_buffer_load_format_v4f32:
2172 case AMDGPU::BI__builtin_amdgcn_struct_buffer_load_format_v4f16: {
2173 llvm::Type *RetTy = ConvertType(E->getType());
2174 Function *F = CGM.getIntrinsic(
2175 Intrinsic::amdgcn_struct_ptr_buffer_load_format, {RetTy});
2176
2177 return Builder.CreateCall(
2178 F, {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)),
2180 EmitScalarExpr(E->getArg(4))});
2181 }
2182 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_add_i32:
2184 *this, E, Intrinsic::amdgcn_raw_ptr_buffer_atomic_add);
2185 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_fadd_f32:
2186 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_fadd_v2f16:
2188 *this, E, Intrinsic::amdgcn_raw_ptr_buffer_atomic_fadd);
2189 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_fmin_f32:
2190 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_fmin_f64:
2192 *this, E, Intrinsic::amdgcn_raw_ptr_buffer_atomic_fmin);
2193 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_fmax_f32:
2194 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_atomic_fmax_f64:
2196 *this, E, Intrinsic::amdgcn_raw_ptr_buffer_atomic_fmax);
2197 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_i32:
2198 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v2i32:
2199 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v3i32:
2200 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v4i32:
2201 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v8i32:
2202 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v16i32:
2203 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_f32:
2204 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v2f32:
2205 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v3f32:
2206 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v4f32:
2207 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v8f32:
2208 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v16f32:
2209 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_i8:
2210 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_u8:
2211 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_i16:
2212 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_u16:
2213 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v2i8:
2214 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v3i8:
2215 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v4i8:
2216 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_f16:
2217 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v2f16:
2218 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v3f16:
2219 case AMDGPU::BI__builtin_amdgcn_s_buffer_load_v4f16:
2220 return emitAMDGPUSBufferLoadBuiltin(*this, E);
2221 case AMDGPU::BI__builtin_amdgcn_s_prefetch_data:
2223 *this, E, Intrinsic::amdgcn_s_prefetch_data);
2224 case AMDGPU::BI__builtin_amdgcn_s_prefetch_inst:
2226 *this, E, Intrinsic::amdgcn_s_prefetch_inst);
2227 case Builtin::BIlogbf:
2228 case Builtin::BI__builtin_logbf: {
2229 Value *Src0 = EmitScalarExpr(E->getArg(0));
2230 Function *FrExpFunc = CGM.getIntrinsic(
2231 Intrinsic::frexp, {Src0->getType(), Builder.getInt32Ty()});
2232 CallInst *FrExp = Builder.CreateCall(FrExpFunc, Src0);
2233 Value *Exp = Builder.CreateExtractValue(FrExp, 1);
2234 Value *Add = Builder.CreateAdd(
2235 Exp, ConstantInt::getSigned(Exp->getType(), -1), "", false, true);
2236 Value *SIToFP = Builder.CreateSIToFP(Add, Builder.getFloatTy());
2237 Value *Fabs =
2238 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::fabs);
2239 Value *FCmpONE = Builder.CreateFCmpONE(
2240 Fabs, ConstantFP::getInfinity(Builder.getFloatTy()));
2241 Value *Sel1 = Builder.CreateSelect(FCmpONE, SIToFP, Fabs);
2242 Value *FCmpOEQ =
2243 Builder.CreateFCmpOEQ(Src0, ConstantFP::getZero(Builder.getFloatTy()));
2244 Value *Sel2 = Builder.CreateSelect(
2245 FCmpOEQ,
2246 ConstantFP::getInfinity(Builder.getFloatTy(), /*Negative=*/true), Sel1);
2247 return Sel2;
2248 }
2249 case Builtin::BIlogb:
2250 case Builtin::BI__builtin_logb: {
2251 Value *Src0 = EmitScalarExpr(E->getArg(0));
2252 Function *FrExpFunc = CGM.getIntrinsic(
2253 Intrinsic::frexp, {Src0->getType(), Builder.getInt32Ty()});
2254 CallInst *FrExp = Builder.CreateCall(FrExpFunc, Src0);
2255 Value *Exp = Builder.CreateExtractValue(FrExp, 1);
2256 Value *Add = Builder.CreateAdd(
2257 Exp, ConstantInt::getSigned(Exp->getType(), -1), "", false, true);
2258 Value *SIToFP = Builder.CreateSIToFP(Add, Builder.getDoubleTy());
2259 Value *Fabs =
2260 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::fabs);
2261 Value *FCmpONE = Builder.CreateFCmpONE(
2262 Fabs, ConstantFP::getInfinity(Builder.getDoubleTy()));
2263 Value *Sel1 = Builder.CreateSelect(FCmpONE, SIToFP, Fabs);
2264 Value *FCmpOEQ =
2265 Builder.CreateFCmpOEQ(Src0, ConstantFP::getZero(Builder.getDoubleTy()));
2266 Value *Sel2 = Builder.CreateSelect(
2267 FCmpOEQ,
2268 ConstantFP::getInfinity(Builder.getDoubleTy(), /*Negative=*/true),
2269 Sel1);
2270 return Sel2;
2271 }
2272 case Builtin::BIscalbnf:
2273 case Builtin::BI__builtin_scalbnf:
2274 case Builtin::BIscalbn:
2275 case Builtin::BI__builtin_scalbn:
2277 *this, E, Intrinsic::ldexp, Intrinsic::experimental_constrained_ldexp);
2278 case AMDGPU::BI__builtin_amdgcn_permlane_bcast:
2280 *this, E, Intrinsic::amdgcn_permlane_bcast);
2281 case AMDGPU::BI__builtin_amdgcn_permlane_up:
2283 Intrinsic::amdgcn_permlane_up);
2284 case AMDGPU::BI__builtin_amdgcn_permlane_down:
2286 Intrinsic::amdgcn_permlane_down);
2287 case AMDGPU::BI__builtin_amdgcn_permlane_xor:
2289 Intrinsic::amdgcn_permlane_xor);
2290 default:
2291 return nullptr;
2292 }
2293}
#define V(N, I)
Address CheckAtomicAlignment(CodeGenFunction &CGF, const CallExpr *E)
llvm::Value * emitBuiltinWithOneOverloadedType(clang::CodeGen::CodeGenFunction &CGF, const clang::CallExpr *E, unsigned IntrinsicID, llvm::StringRef Name="")
Definition CGBuiltin.h:63
static mlir::Value emitAMDGCNImageOverloadedReturnType(CIRGenFunction &cgf, const CallExpr *e, llvm::StringRef intrinsicName, bool isImageStore)
static mlir::Value emitBinaryExpMaybeConstrainedFPBuiltin(CIRGenFunction &cgf, const CallExpr *e, llvm::StringRef intrinsicName, llvm::StringRef constrainedIntrinsicName)
static StringRef getAMDGPUSyncScopeStr(CodeGenModule &CGM, unsigned ScopeInt, llvm::AtomicOrdering AO)
Definition AMDGPU.cpp:419
static StringRef mapScopeToSPIRV(const llvm::Triple &TargetTriple, StringRef AMDGCNScope)
Definition AMDGPU.cpp:386
static Value * GetAMDGPUPredicate(CodeGenFunction &CGF, Twine Name)
Definition AMDGPU.cpp:499
static Intrinsic::ID getIntrinsicIDforWaveReduction(unsigned BuiltinID)
Definition AMDGPU.cpp:512
static llvm::Value * loadTextureDescPtorAsVec8I32(CodeGenFunction &CGF, llvm::Value *RsrcPtr)
Definition AMDGPU.cpp:304
static Value * EmitAMDGCNBallotForExec(CodeGenFunction &CGF, const CallExpr *E, llvm::Type *RegisterType, llvm::Type *ValueType, bool isExecHi)
Definition AMDGPU.cpp:282
llvm::CallInst * emitAMDGCNImageOverloadedReturnType(clang::CodeGen::CodeGenFunction &CGF, const clang::CallExpr *E, unsigned IntrinsicID, bool IsImageStore)
Definition AMDGPU.cpp:334
static llvm::MetadataAsValue * emitScopeMD(CodeGenFunction &CGF, unsigned ScopeInt, llvm::AtomicOrdering AO=llvm::AtomicOrdering::SequentiallyConsistent)
Convert a __MEMORY_SCOPE_* integer constant to a metadata node containing the target-specific sync sc...
Definition AMDGPU.cpp:431
static Value * emitFPIntBuiltin(CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID)
Definition AMDGPU.cpp:374
static llvm::AtomicOrdering mapCABIAtomicOrdering(unsigned AO)
Definition AMDGPU.cpp:398
TokenType getType() const
Returns the token's type, e.g.
#define X(type, name)
Definition Value.h:97
static StringRef getTriple(const Command &Job)
HLSLResourceBindingAttr::RegisterType RegisterType
Definition SemaHLSL.cpp:57
static QualType getPointeeType(const MemRegion *R)
Provides definitions for the atomic synchronization scopes.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Builtin::Context & BuiltinInfo
Definition ASTContext.h:810
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
unsigned getTargetAddressSpace(LangAS AS) const
@ GE_None
No error.
Defines the generic atomic scope model.
Definition SyncScope.h:241
bool isValid(unsigned S) const override
Check if the compile-time constant sync scope value is valid.
Definition SyncScope.h:279
SyncScope map(unsigned S) const override
Maps language specific sync scope values to internal SyncScope enum.
Definition SyncScope.h:259
const char * getRequiredFeatures(unsigned ID) const
Definition Builtins.cpp:116
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2949
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3153
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Definition Expr.h:3140
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Definition CharUnits.h:63
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition Address.h:128
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition Address.h:209
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition Address.h:204
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
Definition CGBuilder.h:302
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Definition CGBuilder.h:118
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition CGBuilder.h:138
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, llvm::Type *ElementTy, const llvm::Twine &Name="")
Definition CGBuilder.h:199
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition CGBuilder.h:356
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
StringRef AMDGPUAvailableVisibleMode
The mode string from the amdgpu_av attribute on the current statement, or empty if the attribute is n...
llvm::Value * EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E)
llvm::Type * ConvertType(QualType T)
void AddAMDGPUAvailableVisibleMMRA(llvm::Instruction *Inst)
Attach the AMDGPU availability/visibility MMRA to Inst when the amdgpu_av attribute is active on the ...
Definition AMDGPU.cpp:491
llvm::Value * EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition AMDGPU.cpp:558
const TargetInfo & getTarget() const
void AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst, const CallExpr *E)
Definition AMDGPU.cpp:471
const TargetCodeGenInfo & getTargetHooks() const
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
Definition CGExpr.cpp:1621
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
llvm::LLVMContext & getLLVMContext()
void ProcessOrderScopeAMDGCN(llvm::Value *Order, llvm::Value *Scope, llvm::AtomicOrdering &AO, llvm::SyncScope::ID &SSID)
Definition AMDGPU.cpp:447
This class organizes the cross-function state that is used while generating LLVM code.
llvm::Module & getModule() const
const LangOptions & getLangOpts() const
const llvm::DataLayout & getDataLayout() const
ASTContext & getContext() const
const TargetCodeGenInfo & getTargetCodeGenInfo()
llvm::LLVMContext & getLLVMContext()
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
virtual StringRef getLLVMSyncScopeStr(const LangOptions &LangOpts, SyncScope Scope, llvm::AtomicOrdering Ordering) const
Get the syncscope used in LLVM IR as a string.
virtual void setTargetAtomicMetadata(CodeGenFunction &CGF, llvm::Instruction &AtomicInst, const AtomicExpr *Expr=nullptr) const
Allow the target to apply other metadata to an atomic instruction.
Definition TargetInfo.h:375
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition Expr.cpp:3106
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3081
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:283
QualType getType() const
Definition Expr.h:144
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3399
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8579
QualType getCanonicalType() const
Definition TypeBase.h:8547
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
TargetOptions & getTargetOpts() const
Retrieve the target options.
Definition TargetInfo.h:333
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getMaxOpenCLWorkGroupSize() const
Definition TargetInfo.h:885
virtual const llvm::omp::GV & getGridValue() const
llvm::CodeObjectVersionKind CodeObjectVersion
Code object version for AMDGPU.
QualType getType() const
Definition Value.cpp:238
bool Mul(InterpState &S, CodePtr OpPC)
Definition Interp.h:490
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
Definition TypeBase.h:906
SyncScope
Defines sync scope values used internally by clang.
Definition SyncScope.h:43
U cast(CodeGen::Address addr)
Definition Address.h:327
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64