1 //===- SPIRVWriter.cpp - Converts LLVM to SPIR-V ----------------*- C++ -*-===// 2 // 3 // The LLVM/SPIR-V Translator 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 // Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved. 9 // 10 // Permission is hereby granted, free of charge, to any person obtaining a 11 // copy of this software and associated documentation files (the "Software"), 12 // to deal with the Software without restriction, including without limitation 13 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 // and/or sell copies of the Software, and to permit persons to whom the 15 // Software is furnished to do so, subject to the following conditions: 16 // 17 // Redistributions of source code must retain the above copyright notice, 18 // this list of conditions and the following disclaimers. 19 // Redistributions in binary form must reproduce the above copyright notice, 20 // this list of conditions and the following disclaimers in the documentation 21 // and/or other materials provided with the distribution. 22 // Neither the names of Advanced Micro Devices, Inc., nor the names of its 23 // contributors may be used to endorse or promote products derived from this 24 // Software without specific prior written permission. 25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 // CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH 31 // THE SOFTWARE. 32 // 33 //===----------------------------------------------------------------------===// 34 /// \file 35 /// 36 /// This file implements conversion of LLVM intermediate language to SPIR-V 37 /// binary. 38 /// 39 //===----------------------------------------------------------------------===// 40 41 #include "SPIRVModule.h" 42 #include "SPIRVEnum.h" 43 #include "SPIRVEntry.h" 44 #include "SPIRVType.h" 45 #include "SPIRVValue.h" 46 #include "SPIRVFunction.h" 47 #include "SPIRVBasicBlock.h" 48 #include "SPIRVInstruction.h" 49 #include "SPIRVExtInst.h" 50 #include "SPIRVUtil.h" 51 #include "SPIRVInternal.h" 52 #include "SPIRVMDWalker.h" 53 #include "OCLTypeToSPIRV.h" 54 #include "OCLUtil.h" 55 56 #include "llvm/ADT/DenseMap.h" 57 #include "llvm/ADT/SetVector.h" 58 #include "llvm/ADT/StringSwitch.h" 59 #include "llvm/ADT/Triple.h" 60 #include "llvm/Bitcode/ReaderWriter.h" 61 #include "llvm/IR/Constants.h" 62 #include "llvm/IR/DerivedTypes.h" 63 #include "llvm/IR/DebugInfo.h" 64 #include "llvm/IR/Function.h" 65 #include "llvm/IR/InstrTypes.h" 66 #include "llvm/IR/Instructions.h" 67 #include "llvm/IR/Module.h" 68 #include "llvm/IR/Operator.h" 69 #include "llvm/IR/Verifier.h" 70 #include "llvm/Pass.h" 71 #include "llvm/PassSupport.h" 72 #include "llvm/IR/LegacyPassManager.h" 73 #include "llvm/Support/Casting.h" 74 #include "llvm/Support/CommandLine.h" 75 #include "llvm/Support/Debug.h" 76 #include "llvm/Support/raw_ostream.h" 77 #include "llvm/Support/ToolOutputFile.h" 78 #include "llvm/Transforms/IPO.h" 79 80 #include <iostream> 81 #include <list> 82 #include <memory> 83 #include <set> 84 #include <sstream> 85 #include <vector> 86 #include <functional> 87 #include <cstdlib> 88 89 #define DEBUG_TYPE "spirv" 90 91 using namespace llvm; 92 using namespace SPIRV; 93 using namespace OCLUtil; 94 95 namespace llvm { 96 FunctionPass *createPromoteMemoryToRegisterPass(); 97 } 98 99 namespace SPIRV{ 100 101 cl::opt<bool> SPIRVMemToReg("spirv-mem2reg", cl::init(true), 102 cl::desc("LLVM/SPIR-V translation enable mem2reg")); 103 104 105 static void 106 foreachKernelArgMD(MDNode *MD, SPIRVFunction *BF, 107 std::function<void(const std::string& Str, 108 SPIRVFunctionParameter *BA)>Func) { 109 for (unsigned I = 1, E = MD->getNumOperands(); I != E; ++I) { 110 SPIRVFunctionParameter *BA = BF->getArgument(I-1); 111 Func(getMDOperandAsString(MD, I), BA); 112 } 113 } 114 115 /// Information for translating OCL builtin. 116 struct OCLBuiltinSPIRVTransInfo { 117 std::string UniqName; 118 /// Postprocessor of operands 119 std::function<void(std::vector<SPIRVWord>&)> PostProc; 120 OCLBuiltinSPIRVTransInfo(){ 121 PostProc = [](std::vector<SPIRVWord>&){}; 122 } 123 }; 124 125 class LLVMToSPIRVDbgTran { 126 public: 127 LLVMToSPIRVDbgTran(Module *TM = nullptr, SPIRVModule *TBM = nullptr) 128 :BM(TBM), M(TM){ 129 } 130 131 void setModule(Module *Mod) { M = Mod;} 132 void setSPIRVModule(SPIRVModule *SMod) { BM = SMod;} 133 134 void transDbgInfo(Value *V, SPIRVValue *BV) { 135 if (auto I = dyn_cast<Instruction>(V)) { 136 auto DL = I->getDebugLoc(); 137 if (DL.get() != nullptr) { 138 DILocation* DIL = DL.get(); 139 auto File = BM->getString(DIL->getFilename().str()); 140 // ToDo: SPIR-V rev.31 cannot add debug info for instructions without ids. 141 // This limitation needs to be addressed. 142 if (!BV->hasId()) 143 return; 144 BM->addLine(BV, File, DL.getLine(), DL.getCol()); 145 } 146 } else if (auto F = dyn_cast<Function>(V)) { 147 if (auto DIS = F->getSubprogram()) { 148 auto File = BM->getString(DIS->getFilename().str()); 149 BM->addLine(BV, File, DIS->getLine(), 0); 150 } 151 } 152 } 153 154 private: 155 SPIRVModule *BM; 156 Module *M; 157 }; 158 159 class LLVMToSPIRV: public ModulePass { 160 public: 161 LLVMToSPIRV(SPIRVModule *SMod = nullptr) 162 : ModulePass(ID), 163 M(nullptr), 164 Ctx(nullptr), 165 BM(SMod), 166 ExtSetId(SPIRVID_INVALID), 167 SrcLang(0), 168 SrcLangVer(0), 169 DbgTran(nullptr, SMod){ 170 } 171 172 bool runOnModule(Module &Mod) override { 173 M = &Mod; 174 Ctx = &M->getContext(); 175 DbgTran.setModule(M); 176 assert(BM && "SPIR-V module not initialized"); 177 translate(); 178 return true; 179 } 180 181 void getAnalysisUsage(AnalysisUsage &AU) const { 182 AU.addRequired<OCLTypeToSPIRV>(); 183 } 184 185 static char ID; 186 187 SPIRVType *transType(Type *T); 188 SPIRVType *transSPIRVOpaqueType(Type *T); 189 190 SPIRVValue *getTranslatedValue(Value *); 191 192 // Translation functions 193 bool transAddressingMode(); 194 bool transAlign(Value *V, SPIRVValue *BV); 195 std::vector<SPIRVValue *> transArguments(CallInst *, SPIRVBasicBlock *); 196 std::vector<SPIRVWord> transArguments(CallInst *, SPIRVBasicBlock *, 197 SPIRVEntry *); 198 bool transSourceLanguage(); 199 bool transExtension(); 200 bool transBuiltinSet(); 201 SPIRVValue *transCallInst(CallInst *Call, SPIRVBasicBlock *BB); 202 bool transDecoration(Value *V, SPIRVValue *BV); 203 SPIRVWord transFunctionControlMask(CallInst *); 204 SPIRVWord transFunctionControlMask(Function *); 205 SPIRVFunction *transFunctionDecl(Function *F); 206 bool transGlobalVariables(); 207 208 Op transBoolOpCode(SPIRVValue *Opn, Op OC); 209 // Translate LLVM module to SPIR-V module. 210 // Returns true if succeeds. 211 bool translate(); 212 bool transExecutionMode(); 213 SPIRVValue *transConstant(Value *V); 214 SPIRVValue *transValue(Value *V, SPIRVBasicBlock *BB, 215 bool CreateForward = true); 216 SPIRVValue *transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB, 217 bool CreateForward = true); 218 219 typedef DenseMap<Type *, SPIRVType *> LLVMToSPIRVTypeMap; 220 typedef DenseMap<Value *, SPIRVValue *> LLVMToSPIRVValueMap; 221 private: 222 Module *M; 223 LLVMContext *Ctx; 224 SPIRVModule *BM; 225 LLVMToSPIRVTypeMap TypeMap; 226 LLVMToSPIRVValueMap ValueMap; 227 //ToDo: support multiple builtin sets. Currently assume one builtin set. 228 SPIRVId ExtSetId; 229 SPIRVWord SrcLang; 230 SPIRVWord SrcLangVer; 231 LLVMToSPIRVDbgTran DbgTran; 232 233 SPIRVType *mapType(Type *T, SPIRVType *BT) { 234 TypeMap[T] = BT; 235 SPIRVDBG(dbgs() << "[mapType] " << *T << " => "; 236 spvdbgs() << *BT << '\n'); 237 return BT; 238 } 239 240 SPIRVValue *mapValue(Value *V, SPIRVValue *BV) { 241 auto Loc = ValueMap.find(V); 242 if (Loc != ValueMap.end()) { 243 if (Loc->second == BV) 244 return BV; 245 assert (Loc->second->isForward() && 246 "LLVM Value is mapped to different SPIRV Values"); 247 auto Forward = static_cast<SPIRVForward *>(Loc->second); 248 BV->setId(Forward->getId()); 249 BM->replaceForward(Forward, BV); 250 } 251 ValueMap[V] = BV; 252 SPIRVDBG(dbgs() << "[mapValue] " << *V << " => "; 253 spvdbgs() << *BV << "\n"); 254 return BV; 255 } 256 257 SPIRVType *getSPIRVType(Type *T) { 258 return TypeMap[T]; 259 } 260 261 SPIRVValue *getSPIRVValue(Value *V) { 262 return ValueMap[V]; 263 } 264 265 SPIRVErrorLog &getErrorLog() { 266 return BM->getErrorLog(); 267 } 268 269 llvm::IntegerType* getSizetType(); 270 std::vector<SPIRVValue*> transValue(const std::vector<Value *> &Values, 271 SPIRVBasicBlock* BB); 272 std::vector<SPIRVWord> transValue(const std::vector<Value *> &Values, 273 SPIRVBasicBlock* BB, SPIRVEntry *Entry); 274 275 SPIRVInstruction* transBinaryInst(BinaryOperator* B, SPIRVBasicBlock* BB); 276 SPIRVInstruction* transCmpInst(CmpInst* Cmp, SPIRVBasicBlock* BB); 277 278 void dumpUsers(Value *V); 279 280 template<class ExtInstKind> 281 bool oclGetExtInstIndex(const std::string &MangledName, 282 const std::string& DemangledName, SPIRVWord* EntryPoint); 283 void oclGetMutatedArgumentTypesByBuiltin(llvm::FunctionType* FT, 284 std::map<unsigned, Type*>& ChangedType, Function* F); 285 286 bool isBuiltinTransToInst(Function *F); 287 bool isBuiltinTransToExtInst(Function *F, 288 SPIRVExtInstSetKind *BuiltinSet = nullptr, 289 SPIRVWord *EntryPoint = nullptr, 290 SmallVectorImpl<std::string> *Dec = nullptr); 291 bool oclIsKernel(Function *F); 292 293 bool transOCLKernelMetadata(); 294 295 SPIRVInstruction *transBuiltinToInst(const std::string& DemangledName, 296 const std::string &MangledName, CallInst* CI, SPIRVBasicBlock* BB); 297 SPIRVInstruction *transBuiltinToInstWithoutDecoration(Op OC, 298 CallInst* CI, SPIRVBasicBlock* BB); 299 void mutateFuncArgType(const std::map<unsigned, Type*>& ChangedType, 300 Function* F); 301 302 SPIRVValue *transSpcvCast(CallInst* CI, SPIRVBasicBlock *BB); 303 SPIRVValue *oclTransSpvcCastSampler(CallInst* CI, SPIRVBasicBlock *BB); 304 305 SPIRV::SPIRVInstruction* transUnaryInst(UnaryInstruction* U, 306 SPIRVBasicBlock* BB); 307 308 /// Add a 32 bit integer constant. 309 /// \return Id of the constant. 310 SPIRVId addInt32(int); 311 void transFunction(Function *I); 312 SPIRV::SPIRVLinkageTypeKind transLinkageType(const GlobalValue* GV); 313 }; 314 315 316 SPIRVValue * 317 LLVMToSPIRV::getTranslatedValue(Value *V) { 318 LLVMToSPIRVValueMap::iterator Loc = ValueMap.find(V); 319 if (Loc != ValueMap.end()) 320 return Loc->second; 321 return nullptr; 322 } 323 324 bool 325 LLVMToSPIRV::oclIsKernel(Function *F) { 326 if (F->getCallingConv() == CallingConv::SPIR_KERNEL) 327 return true; 328 return false; 329 } 330 331 bool 332 LLVMToSPIRV::isBuiltinTransToInst(Function *F) { 333 std::string DemangledName; 334 if (!oclIsBuiltin(F->getName(), &DemangledName) && 335 !isDecoratedSPIRVFunc(F, &DemangledName)) 336 return false; 337 SPIRVDBG(spvdbgs() << "CallInst: demangled name: " << DemangledName << '\n'); 338 return getSPIRVFuncOC(DemangledName) != OpNop; 339 } 340 341 bool 342 LLVMToSPIRV::isBuiltinTransToExtInst(Function *F, 343 SPIRVExtInstSetKind *ExtSet, 344 SPIRVWord *ExtOp, 345 SmallVectorImpl<std::string> *Dec) { 346 std::string OrigName = F->getName(); 347 std::string DemangledName; 348 if (!oclIsBuiltin(OrigName, &DemangledName)) 349 return false; 350 DEBUG(dbgs() << "[oclIsBuiltinTransToExtInst] CallInst: demangled name: " 351 << DemangledName << '\n'); 352 StringRef S = DemangledName; 353 if (!S.startswith(kSPIRVName::Prefix)) 354 return false; 355 S = S.drop_front(strlen(kSPIRVName::Prefix)); 356 auto Loc = S.find(kSPIRVPostfix::Divider); 357 auto ExtSetName = S.substr(0, Loc); 358 SPIRVExtInstSetKind Set = SPIRVEIS_Count; 359 if (!SPIRVExtSetShortNameMap::rfind(ExtSetName, &Set)) 360 return false; 361 assert(Set == BM->getBuiltinSet(ExtSetId) && 362 "Invalid extended instruction set"); 363 assert(Set == SPIRVEIS_OpenCL && "Unsupported extended instruction set"); 364 365 auto ExtOpName = S.substr(Loc + 1); 366 auto Splited = ExtOpName.split(kSPIRVPostfix::ExtDivider); 367 OCLExtOpKind EOC; 368 if (!OCLExtOpMap::rfind(Splited.first, &EOC)) 369 return false; 370 371 if (ExtSet) 372 *ExtSet = Set; 373 if (ExtOp) 374 *ExtOp = EOC; 375 if (Dec) { 376 SmallVector<StringRef, 2> P; 377 Splited.second.split(P, kSPIRVPostfix::Divider); 378 for (auto &I:P) 379 Dec->push_back(I.str()); 380 } 381 return true; 382 } 383 384 /// Decode SPIR-V type name in the format spirv.{TypeName}._{Postfixes} 385 /// where Postfixes are strings separated by underscores. 386 /// \return TypeName. 387 /// \param Ops contains the integers decoded from postfixes. 388 static std::string 389 decodeSPIRVTypeName(StringRef Name, 390 SmallVectorImpl<std::string>& Strs) { 391 SmallVector<StringRef, 4> SubStrs; 392 const char Delim[] = { kSPIRVTypeName::Delimiter, 0 }; 393 Name.split(SubStrs, Delim, -1, true); 394 assert(SubStrs.size() >= 2 && "Invalid SPIRV type name"); 395 assert(SubStrs[0] == kSPIRVTypeName::Prefix && "Invalid prefix"); 396 assert((SubStrs.size() == 2 || !SubStrs[2].empty()) && "Invalid postfix"); 397 398 if (SubStrs.size() > 2) { 399 const char PostDelim[] = { kSPIRVTypeName::PostfixDelim, 0 }; 400 SmallVector<StringRef, 4> Postfixes; 401 SubStrs[2].split(Postfixes, PostDelim, -1, true); 402 assert(Postfixes.size() > 1 && Postfixes[0].empty() && "Invalid postfix"); 403 for (unsigned I = 1, E = Postfixes.size(); I != E; ++I) 404 Strs.push_back(std::string(Postfixes[I]).c_str()); 405 } 406 return SubStrs[1].str(); 407 } 408 409 static bool recursiveType(const StructType *ST, const Type *Ty) { 410 SmallPtrSet<const StructType *, 4> Seen; 411 412 std::function<bool(const Type *Ty)> Run = [&](const Type *Ty) { 413 if (!isa<CompositeType>(Ty)) 414 return false; 415 416 if (auto *StructTy = dyn_cast<StructType>(Ty)) { 417 if (StructTy == ST) 418 return true; 419 420 if (Seen.count(StructTy)) 421 return false; 422 423 Seen.insert(StructTy); 424 425 return find_if(StructTy->subtype_begin(), StructTy->subtype_end(), Run) != 426 StructTy->subtype_end(); 427 } 428 429 if (auto *PtrTy = dyn_cast<PointerType>(Ty)) 430 return Run(PtrTy->getPointerElementType()); 431 432 if (auto *ArrayTy = dyn_cast<ArrayType>(Ty)) 433 return Run(ArrayTy->getArrayElementType()); 434 435 return false; 436 }; 437 438 return Run(Ty); 439 } 440 441 SPIRVType * 442 LLVMToSPIRV::transType(Type *T) { 443 LLVMToSPIRVTypeMap::iterator Loc = TypeMap.find(T); 444 if (Loc != TypeMap.end()) 445 return Loc->second; 446 447 SPIRVDBG(dbgs() << "[transType] " << *T << '\n'); 448 if (T->isVoidTy()) 449 return mapType(T, BM->addVoidType()); 450 451 if (T->isIntegerTy(1)) 452 return mapType(T, BM->addBoolType()); 453 454 if (T->isIntegerTy()) 455 return mapType(T, BM->addIntegerType(T->getIntegerBitWidth())); 456 457 if (T->isFloatingPointTy()) 458 return mapType(T, BM->addFloatType(T->getPrimitiveSizeInBits())); 459 460 // A pointer to image or pipe type in LLVM is translated to a SPIRV 461 // sampler or pipe type. 462 if (T->isPointerTy()) { 463 auto ET = T->getPointerElementType(); 464 assert(!ET->isFunctionTy() && "Function pointer type is not allowed"); 465 auto ST = dyn_cast<StructType>(ET); 466 auto AddrSpc = T->getPointerAddressSpace(); 467 if (ST && !ST->isSized()) { 468 Op OpCode; 469 StringRef STName = ST->getName(); 470 // Workaround for non-conformant SPIR binary 471 if (STName == "struct._event_t") { 472 STName = kSPR2TypeName::Event; 473 ST->setName(STName); 474 } 475 assert (!STName.startswith(kSPR2TypeName::Pipe) && 476 "OpenCL type names should be translated to SPIR-V type names"); 477 // ToDo: For SPIR1.2/2.0 there may still be load/store or bitcast 478 // instructions using opencl.* type names. We need to handle these 479 // type names until they are all mapped or FE generates SPIR-V type 480 // names. 481 if (STName.find(kSPR2TypeName::Pipe) == 0) { 482 assert(AddrSpc == SPIRAS_Global); 483 SmallVector<StringRef, 4> SubStrs; 484 const char Delims[] = {kSPR2TypeName::Delimiter, 0}; 485 STName.split(SubStrs, Delims); 486 std::string Acc = kAccessQualName::ReadOnly; 487 if (SubStrs.size() > 2) { 488 Acc = SubStrs[2]; 489 } 490 auto PipeT = BM->addPipeType(); 491 PipeT->setPipeAcessQualifier(SPIRSPIRVAccessQualifierMap::map(Acc)); 492 return mapType(T, PipeT); 493 } else if (STName.find(kSPR2TypeName::ImagePrefix) == 0) { 494 assert(AddrSpc == SPIRAS_Global); 495 auto SPIRVImageTy = getSPIRVImageTypeFromOCL(M, T); 496 return mapType(T, transSPIRVOpaqueType(SPIRVImageTy)); 497 } else if (STName.startswith(kSPIRVTypeName::PrefixAndDelim)) 498 return transSPIRVOpaqueType(T); 499 else if (OCLOpaqueTypeOpCodeMap::find(STName, &OpCode)) { 500 switch (OpCode) { 501 default: 502 return mapType(T, BM->addOpaqueGenericType(OpCode)); 503 case OpTypePipe: 504 return mapType(T, BM->addPipeType()); 505 case OpTypeDeviceEvent: 506 return mapType(T, BM->addDeviceEventType()); 507 case OpTypeQueue: 508 return mapType(T, BM->addQueueType()); 509 } 510 } else if (isPointerToOpaqueStructType(T)) { 511 return mapType(T, BM->addPointerType(SPIRSPIRVAddrSpaceMap::map( 512 static_cast<SPIRAddressSpace>(AddrSpc)), 513 transType(ET))); 514 } 515 } else { 516 return mapType(T, BM->addPointerType(SPIRSPIRVAddrSpaceMap::map( 517 static_cast<SPIRAddressSpace>(AddrSpc)), 518 transType(ET))); 519 } 520 } 521 522 if (T->isVectorTy()) 523 return mapType(T, BM->addVectorType(transType(T->getVectorElementType()), 524 T->getVectorNumElements())); 525 526 if (T->isArrayTy()) 527 return mapType(T, BM->addArrayType(transType(T->getArrayElementType()), 528 static_cast<SPIRVConstant*>(transValue(ConstantInt::get(getSizetType(), 529 T->getArrayNumElements(), false), nullptr)))); 530 531 if (T->isStructTy() && !T->isSized()) { 532 auto ST = dyn_cast<StructType>(T); 533 (void) ST; 534 assert(!ST->getName().startswith(kSPR2TypeName::Pipe)); 535 assert(!ST->getName().startswith(kSPR2TypeName::ImagePrefix)); 536 return mapType(T, BM->addOpaqueType(T->getStructName())); 537 } 538 539 if (auto ST = dyn_cast<StructType>(T)) { 540 assert(ST->isSized()); 541 542 std::string Name; 543 if (ST->hasName()) 544 Name = ST->getName(); 545 546 if(Name == getSPIRVTypeName(kSPIRVTypeName::ConstantSampler)) 547 return transType(getSamplerType(M)); 548 if (Name == getSPIRVTypeName(kSPIRVTypeName::ConstantPipeStorage)) 549 return transType(getPipeStorageType(M)); 550 551 auto *Struct = BM->openStructType(T->getStructNumElements(), Name); 552 mapType(T, Struct); 553 554 SmallVector<unsigned, 4> ForwardRefs; 555 556 for (unsigned I = 0, E = T->getStructNumElements(); I != E; ++I) { 557 auto *ElemTy = ST->getElementType(I); 558 if (isa<CompositeType>(ElemTy) && recursiveType(ST, ElemTy)) 559 ForwardRefs.push_back(I); 560 else 561 Struct->setMemberType(I, transType(ST->getElementType(I))); 562 } 563 564 BM->closeStructType(Struct, ST->isPacked()); 565 566 for (auto I : ForwardRefs) 567 Struct->setMemberType(I, transType(ST->getElementType(I))); 568 569 return Struct; 570 } 571 572 if (FunctionType *FT = dyn_cast<FunctionType>(T)) { 573 SPIRVType *RT = transType(FT->getReturnType()); 574 std::vector<SPIRVType *> PT; 575 for (FunctionType::param_iterator I = FT->param_begin(), 576 E = FT->param_end(); I != E; ++I) 577 PT.push_back(transType(*I)); 578 return mapType(T, BM->addFunctionType(RT, PT)); 579 } 580 581 llvm_unreachable("Not implemented!"); 582 return 0; 583 } 584 585 SPIRVType * 586 LLVMToSPIRV::transSPIRVOpaqueType(Type *T) { 587 auto ET = T->getPointerElementType(); 588 auto ST = cast<StructType>(ET); 589 auto AddrSpc = T->getPointerAddressSpace(); 590 (void)AddrSpc; // prevent warning about unused variable in NDEBUG build 591 auto STName = ST->getStructName(); 592 assert (STName.startswith(kSPIRVTypeName::PrefixAndDelim) && 593 "Invalid SPIR-V opaque type name"); 594 SmallVector<std::string, 8> Postfixes; 595 auto TN = decodeSPIRVTypeName(STName, Postfixes); 596 if (TN == kSPIRVTypeName::Pipe) { 597 assert(AddrSpc == SPIRAS_Global); 598 assert(Postfixes.size() == 1 && "Invalid pipe type ops"); 599 auto PipeT = BM->addPipeType(); 600 PipeT->setPipeAcessQualifier(static_cast<spv::AccessQualifier>( 601 atoi(Postfixes[0].c_str()))); 602 return mapType(T, PipeT); 603 } else if (TN == kSPIRVTypeName::Image) { 604 assert(AddrSpc == SPIRAS_Global); 605 // The sampled type needs to be translated through LLVM type to guarantee 606 // uniqueness. 607 auto SampledT = transType(getLLVMTypeForSPIRVImageSampledTypePostfix( 608 Postfixes[0], *Ctx)); 609 SmallVector<int, 7> Ops; 610 for (unsigned I = 1; I < 8; ++I) 611 Ops.push_back(atoi(Postfixes[I].c_str())); 612 SPIRVTypeImageDescriptor Desc(static_cast<SPIRVImageDimKind>(Ops[0]), 613 Ops[1], Ops[2], Ops[3], Ops[4], Ops[5]); 614 return mapType(T, BM->addImageType(SampledT, Desc, 615 static_cast<spv::AccessQualifier>(Ops[6]))); 616 } else if (TN == kSPIRVTypeName::SampledImg) { 617 return mapType(T, BM->addSampledImageType( 618 static_cast<SPIRVTypeImage *>( 619 transType(getSPIRVTypeByChangeBaseTypeName(M, 620 T, kSPIRVTypeName::SampledImg, 621 kSPIRVTypeName::Image))))); 622 } else if(TN == kSPIRVTypeName::Sampler) 623 return mapType(T, BM->addSamplerType()); 624 else if (TN == kSPIRVTypeName::DeviceEvent) 625 return mapType(T, BM->addDeviceEventType()); 626 else if (TN == kSPIRVTypeName::Queue) 627 return mapType(T, BM->addQueueType()); 628 else if (TN == kSPIRVTypeName::PipeStorage) 629 return mapType(T, BM->addPipeStorageType()); 630 else 631 return mapType(T, BM->addOpaqueGenericType( 632 SPIRVOpaqueTypeOpCodeMap::map(TN))); 633 } 634 635 SPIRVFunction * 636 LLVMToSPIRV::transFunctionDecl(Function *F) { 637 if (auto BF= getTranslatedValue(F)) 638 return static_cast<SPIRVFunction *>(BF); 639 640 SPIRVTypeFunction *BFT = static_cast<SPIRVTypeFunction *>(transType( 641 getAnalysis<OCLTypeToSPIRV>().getAdaptedType(F))); 642 SPIRVFunction *BF = static_cast<SPIRVFunction *>(mapValue(F, 643 BM->addFunction(BFT))); 644 BF->setFunctionControlMask(transFunctionControlMask(F)); 645 if (F->hasName()) 646 BM->setName(BF, F->getName()); 647 if (oclIsKernel(F)) 648 BM->addEntryPoint(ExecutionModelKernel, BF->getId()); 649 else if (F->getLinkage() != GlobalValue::InternalLinkage) 650 BF->setLinkageType(transLinkageType(F)); 651 auto Attrs = F->getAttributes(); 652 for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; 653 ++I) { 654 auto ArgNo = I->getArgNo(); 655 SPIRVFunctionParameter *BA = BF->getArgument(ArgNo); 656 if (I->hasName()) 657 BM->setName(BA, I->getName()); 658 if (I->hasByValAttr()) 659 BA->addAttr(FunctionParameterAttributeByVal); 660 if (I->hasNoAliasAttr()) 661 BA->addAttr(FunctionParameterAttributeNoAlias); 662 if (I->hasNoCaptureAttr()) 663 BA->addAttr(FunctionParameterAttributeNoCapture); 664 if (I->hasStructRetAttr()) 665 BA->addAttr(FunctionParameterAttributeSret); 666 if (Attrs.hasAttribute(ArgNo + 1, Attribute::ZExt)) 667 BA->addAttr(FunctionParameterAttributeZext); 668 if (Attrs.hasAttribute(ArgNo + 1, Attribute::SExt)) 669 BA->addAttr(FunctionParameterAttributeSext); 670 if (Attrs.hasAttribute(ArgNo + 1, Attribute::Dereferenceable)) 671 BA->addDecorate(DecorationMaxByteOffset, 672 Attrs.getAttribute(ArgNo + 1, Attribute::Dereferenceable) 673 .getDereferenceableBytes()); 674 } 675 if (Attrs.hasAttribute(AttributeSet::ReturnIndex, Attribute::ZExt)) 676 BF->addDecorate(DecorationFuncParamAttr, FunctionParameterAttributeZext); 677 if (Attrs.hasAttribute(AttributeSet::ReturnIndex, Attribute::SExt)) 678 BF->addDecorate(DecorationFuncParamAttr, FunctionParameterAttributeSext); 679 DbgTran.transDbgInfo(F, BF); 680 SPIRVDBG(dbgs() << "[transFunction] " << *F << " => "; 681 spvdbgs() << *BF << '\n';) 682 return BF; 683 } 684 685 #define _SPIRV_OPL(x) OpLogical##x 686 687 #define _SPIRV_OPB(x) OpBitwise##x 688 689 SPIRVValue * 690 LLVMToSPIRV::transConstant(Value *V) { 691 if (auto CPNull = dyn_cast<ConstantPointerNull>(V)) 692 return BM->addNullConstant(bcast<SPIRVTypePointer>(transType( 693 CPNull->getType()))); 694 695 if (auto CAZero = dyn_cast<ConstantAggregateZero>(V)) { 696 Type *AggType = CAZero->getType(); 697 if (const StructType* ST = dyn_cast<StructType>(AggType)) 698 if (ST->getName() == getSPIRVTypeName(kSPIRVTypeName::ConstantSampler)) 699 return BM->addSamplerConstant(transType(AggType), 0,0,0); 700 701 return BM->addNullConstant(transType(AggType)); 702 } 703 704 if (auto ConstI = dyn_cast<ConstantInt>(V)) 705 return BM->addConstant(transType(V->getType()), ConstI->getZExtValue()); 706 707 if (auto ConstFP = dyn_cast<ConstantFP>(V)) { 708 auto BT = static_cast<SPIRVType *>(transType(V->getType())); 709 return BM->addConstant(BT, 710 ConstFP->getValueAPF().bitcastToAPInt().getZExtValue()); 711 } 712 713 if (auto ConstDA = dyn_cast<ConstantDataArray>(V)) { 714 std::vector<SPIRVValue *> BV; 715 for (unsigned I = 0, E = ConstDA->getNumElements(); I != E; ++I) 716 BV.push_back(transValue(ConstDA->getElementAsConstant(I), nullptr)); 717 return BM->addCompositeConstant(transType(V->getType()), BV); 718 } 719 720 if (auto ConstA = dyn_cast<ConstantArray>(V)) { 721 std::vector<SPIRVValue *> BV; 722 for (auto I = ConstA->op_begin(), E = ConstA->op_end(); I != E; ++I) 723 BV.push_back(transValue(*I, nullptr)); 724 return BM->addCompositeConstant(transType(V->getType()), BV); 725 } 726 727 if (auto ConstDV = dyn_cast<ConstantDataVector>(V)) { 728 std::vector<SPIRVValue *> BV; 729 for (unsigned I = 0, E = ConstDV->getNumElements(); I != E; ++I) 730 BV.push_back(transValue(ConstDV->getElementAsConstant(I), nullptr)); 731 return BM->addCompositeConstant(transType(V->getType()), BV); 732 } 733 734 if (auto ConstV = dyn_cast<ConstantVector>(V)) { 735 std::vector<SPIRVValue *> BV; 736 for (auto I = ConstV->op_begin(), E = ConstV->op_end(); I != E; ++I) 737 BV.push_back(transValue(*I, nullptr)); 738 return BM->addCompositeConstant(transType(V->getType()), BV); 739 } 740 741 if (auto ConstV = dyn_cast<ConstantStruct>(V)) { 742 if (ConstV->getType()->getName() == 743 getSPIRVTypeName(kSPIRVTypeName::ConstantSampler)) { 744 assert(ConstV->getNumOperands() == 3); 745 SPIRVWord 746 AddrMode = ConstV->getOperand(0)->getUniqueInteger().getZExtValue(), 747 Normalized = ConstV->getOperand(1)->getUniqueInteger().getZExtValue(), 748 FilterMode = ConstV->getOperand(2)->getUniqueInteger().getZExtValue(); 749 assert(AddrMode < 5 && "Invalid addressing mode"); 750 assert(Normalized < 2 && "Invalid value of normalized coords"); 751 assert(FilterMode < 2 && "Invalid filter mode"); 752 SPIRVType* SamplerTy = transType(ConstV->getType()); 753 return BM->addSamplerConstant(SamplerTy, 754 AddrMode, Normalized, FilterMode); 755 } 756 if (ConstV->getType()->getName() == 757 getSPIRVTypeName(kSPIRVTypeName::ConstantPipeStorage)) { 758 assert(ConstV->getNumOperands() == 3); 759 SPIRVWord 760 PacketSize = ConstV->getOperand(0)->getUniqueInteger().getZExtValue(), 761 PacketAlign = ConstV->getOperand(1)->getUniqueInteger().getZExtValue(), 762 Capacity = ConstV->getOperand(2)->getUniqueInteger().getZExtValue(); 763 assert(PacketAlign >= 1 && "Invalid packet alignment"); 764 assert(PacketSize >= PacketAlign && PacketSize % PacketAlign == 0 && 765 "Invalid packet size and/or alignment."); 766 SPIRVType* PipeStorageTy = transType(ConstV->getType()); 767 return BM->addPipeStorageConstant(PipeStorageTy, PacketSize, PacketAlign, 768 Capacity); 769 } 770 std::vector<SPIRVValue *> BV; 771 for (auto I = ConstV->op_begin(), E = ConstV->op_end(); I != E; ++I) 772 BV.push_back(transValue(*I, nullptr)); 773 return BM->addCompositeConstant(transType(V->getType()), BV); 774 } 775 776 if (auto ConstUE = dyn_cast<ConstantExpr>(V)) { 777 auto Inst = ConstUE->getAsInstruction(); 778 SPIRVDBG(dbgs() << "ConstantExpr: " << *ConstUE << '\n'; 779 dbgs() << "Instruction: " << *Inst << '\n';) 780 auto BI = transValue(Inst, nullptr, false); 781 Inst->dropAllReferences(); 782 return BI; 783 } 784 785 if (isa<UndefValue>(V)) { 786 return BM->addUndef(transType(V->getType())); 787 } 788 789 return nullptr; 790 } 791 792 SPIRVValue * 793 LLVMToSPIRV::transValue(Value *V, SPIRVBasicBlock *BB, bool CreateForward) { 794 LLVMToSPIRVValueMap::iterator Loc = ValueMap.find(V); 795 if (Loc != ValueMap.end() && (!Loc->second->isForward() || CreateForward)) 796 return Loc->second; 797 798 SPIRVDBG(dbgs() << "[transValue] " << *V << '\n'); 799 assert ((!isa<Instruction>(V) || isa<GetElementPtrInst>(V) || 800 isa<CastInst>(V) || BB) && 801 "Invalid SPIRV BB"); 802 803 auto BV = transValueWithoutDecoration(V, BB, CreateForward); 804 std::string name = V->getName(); 805 if (!name.empty()) // Don't erase the name, which BM might already have 806 BM->setName(BV, name); 807 if(!transDecoration(V, BV)) 808 return nullptr; 809 return BV; 810 } 811 812 SPIRVInstruction* 813 LLVMToSPIRV::transBinaryInst(BinaryOperator* B, SPIRVBasicBlock* BB) { 814 unsigned LLVMOC = B->getOpcode(); 815 auto Op0 = transValue(B->getOperand(0), BB); 816 SPIRVInstruction* BI = BM->addBinaryInst( 817 transBoolOpCode(Op0, OpCodeMap::map(LLVMOC)), 818 transType(B->getType()), Op0, transValue(B->getOperand(1), BB), BB); 819 return BI; 820 } 821 822 SPIRVInstruction* 823 LLVMToSPIRV::transCmpInst(CmpInst* Cmp, SPIRVBasicBlock* BB) { 824 auto Op0 = transValue(Cmp->getOperand(0), BB); 825 SPIRVInstruction* BI = BM->addCmpInst( 826 transBoolOpCode(Op0, CmpMap::map(Cmp->getPredicate())), 827 transType(Cmp->getType()), Op0, 828 transValue(Cmp->getOperand(1), BB), BB); 829 return BI; 830 } 831 832 SPIRV::SPIRVInstruction *LLVMToSPIRV::transUnaryInst(UnaryInstruction *U, 833 SPIRVBasicBlock *BB) { 834 Op BOC = OpNop; 835 if (auto Cast = dyn_cast<AddrSpaceCastInst>(U)) { 836 if (Cast->getDestTy()->getPointerAddressSpace() == SPIRAS_Generic) { 837 assert(Cast->getSrcTy()->getPointerAddressSpace() != SPIRAS_Constant && 838 "Casts from constant address space to generic are illegal"); 839 BOC = OpPtrCastToGeneric; 840 } else { 841 assert(Cast->getDestTy()->getPointerAddressSpace() != SPIRAS_Constant && 842 "Casts from generic address space to constant are illegal"); 843 assert(Cast->getSrcTy()->getPointerAddressSpace() == SPIRAS_Generic); 844 BOC = OpGenericCastToPtr; 845 } 846 } else { 847 auto OpCode = U->getOpcode(); 848 BOC = OpCodeMap::map(OpCode); 849 } 850 851 auto Op = transValue(U->getOperand(0), BB); 852 return BM->addUnaryInst(transBoolOpCode(Op, BOC), 853 transType(U->getType()), Op, BB); 854 } 855 856 /// An instruction may use an instruction from another BB which has not been 857 /// translated. SPIRVForward should be created as place holder for these 858 /// instructions and replaced later by the real instructions. 859 /// Use CreateForward = true to indicate such situation. 860 SPIRVValue * 861 LLVMToSPIRV::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB, 862 bool CreateForward) { 863 if (auto LBB = dyn_cast<BasicBlock>(V)) { 864 auto BF = static_cast<SPIRVFunction *>(getTranslatedValue(LBB->getParent())); 865 assert (BF && "Function not translated"); 866 BB = static_cast<SPIRVBasicBlock *>(mapValue(V, BM->addBasicBlock(BF))); 867 BM->setName(BB, LBB->getName()); 868 return BB; 869 } 870 871 if (auto F = dyn_cast<Function>(V)) 872 return transFunctionDecl(F); 873 874 if (auto GV = dyn_cast<GlobalVariable>(V)) { 875 llvm::PointerType * Ty = GV->getType(); 876 // Though variables with common linkage type are initialized by 0, 877 // they can be represented in SPIR-V as uninitialized variables with 878 // 'Export' linkage type, just as tentative definitions look in C 879 llvm::Value *Init = GV->hasInitializer() && !GV->hasCommonLinkage() ? 880 GV->getInitializer() : nullptr; 881 StructType *ST = Init ? dyn_cast<StructType>(Init->getType()) : nullptr; 882 if (ST && ST->hasName() && isSPIRVConstantName(ST->getName())) { 883 auto BV = transConstant(Init); 884 assert(BV); 885 return mapValue(V, BV); 886 } else if (ConstantExpr *ConstUE = dyn_cast_or_null<ConstantExpr>(Init)) { 887 Instruction * Inst = ConstUE->getAsInstruction(); 888 if (isSpecialTypeInitializer(Inst)) { 889 Init = Inst->getOperand(0); 890 Ty = static_cast<PointerType*>(Init->getType()); 891 } 892 Inst->dropAllReferences(); 893 } 894 auto BVar = static_cast<SPIRVVariable *>(BM->addVariable( 895 transType(Ty), GV->isConstant(), 896 transLinkageType(GV), 897 Init ? transValue(Init, nullptr) : nullptr, 898 GV->getName(), 899 SPIRSPIRVAddrSpaceMap::map( 900 static_cast<SPIRAddressSpace>(Ty->getAddressSpace())), 901 nullptr 902 )); 903 mapValue(V, BVar); 904 spv::BuiltIn Builtin = spv::BuiltInPosition; 905 if (!GV->hasName() || !getSPIRVBuiltin(GV->getName().str(), Builtin)) 906 return BVar; 907 BVar->setBuiltin(Builtin); 908 return BVar; 909 } 910 911 if (isa<Constant>(V)) { 912 auto BV = transConstant(V); 913 assert(BV); 914 return mapValue(V, BV); 915 } 916 917 if (auto Arg = dyn_cast<Argument>(V)) { 918 unsigned ArgNo = Arg->getArgNo(); 919 SPIRVFunction *BF = BB->getParent(); 920 //assert(BF->existArgument(ArgNo)); 921 return mapValue(V, BF->getArgument(ArgNo)); 922 } 923 924 if (CreateForward) 925 return mapValue(V, BM->addForward(transType(V->getType()))); 926 927 if (StoreInst *ST = dyn_cast<StoreInst>(V)) { 928 std::vector<SPIRVWord> MemoryAccess(1,0); 929 if (ST->isVolatile()) 930 MemoryAccess[0] |= MemoryAccessVolatileMask; 931 if (ST->getAlignment()) { 932 MemoryAccess[0] |= MemoryAccessAlignedMask; 933 MemoryAccess.push_back(ST->getAlignment()); 934 } 935 if (ST->getMetadata(LLVMContext::MD_nontemporal)) 936 MemoryAccess[0] |= MemoryAccessNontemporalMask; 937 if (MemoryAccess.front() == 0) 938 MemoryAccess.clear(); 939 return mapValue(V, BM->addStoreInst( 940 transValue(ST->getPointerOperand(), BB), 941 transValue(ST->getValueOperand(), BB), 942 MemoryAccess, BB)); 943 } 944 945 if (LoadInst *LD = dyn_cast<LoadInst>(V)) { 946 std::vector<SPIRVWord> MemoryAccess(1,0); 947 if (LD->isVolatile()) 948 MemoryAccess[0] |= MemoryAccessVolatileMask; 949 if (LD->getAlignment()) { 950 MemoryAccess[0] |= MemoryAccessAlignedMask; 951 MemoryAccess.push_back(LD->getAlignment()); 952 } 953 if (LD->getMetadata(LLVMContext::MD_nontemporal)) 954 MemoryAccess[0] |= MemoryAccessNontemporalMask; 955 if (MemoryAccess.front() == 0) 956 MemoryAccess.clear(); 957 return mapValue(V, BM->addLoadInst( 958 transValue(LD->getPointerOperand(), BB), 959 MemoryAccess, BB)); 960 } 961 962 if (BinaryOperator *B = dyn_cast<BinaryOperator>(V)) { 963 SPIRVInstruction* BI = transBinaryInst(B, BB); 964 return mapValue(V, BI); 965 } 966 967 if (auto RI = dyn_cast<ReturnInst>(V)) { 968 if (auto RV = RI->getReturnValue()) 969 return mapValue(V, BM->addReturnValueInst( 970 transValue(RV, BB), BB)); 971 return mapValue(V, BM->addReturnInst(BB)); 972 } 973 974 if (CmpInst *Cmp = dyn_cast<CmpInst>(V)) { 975 SPIRVInstruction* BI = transCmpInst(Cmp, BB); 976 return mapValue(V, BI); 977 } 978 979 if (SelectInst *Sel = dyn_cast<SelectInst>(V)) 980 return mapValue(V, BM->addSelectInst( 981 transValue(Sel->getCondition(), BB), 982 transValue(Sel->getTrueValue(), BB), 983 transValue(Sel->getFalseValue(), BB),BB)); 984 985 if (AllocaInst *Alc = dyn_cast<AllocaInst>(V)) 986 return mapValue(V, BM->addVariable( 987 transType(Alc->getType()), false, 988 SPIRVLinkageTypeKind::LinkageTypeInternal, 989 nullptr, Alc->getName(), 990 StorageClassFunction, BB)); 991 992 if (auto *Switch = dyn_cast<SwitchInst>(V)) { 993 std::vector<std::pair<SPIRVWord, SPIRVBasicBlock *>> Pairs; 994 for (auto I = Switch->case_begin(), E = Switch->case_end(); I != E; ++I) 995 Pairs.push_back(std::make_pair(I.getCaseValue()->getZExtValue(), 996 static_cast<SPIRVBasicBlock*>(transValue(I.getCaseSuccessor(), 997 nullptr)))); 998 return mapValue(V, BM->addSwitchInst( 999 transValue(Switch->getCondition(), BB), 1000 static_cast<SPIRVBasicBlock*>(transValue(Switch->getDefaultDest(), 1001 nullptr)), Pairs, BB)); 1002 } 1003 1004 if (auto Branch = dyn_cast<BranchInst>(V)) { 1005 if (Branch->isUnconditional()) 1006 return mapValue(V, BM->addBranchInst( 1007 static_cast<SPIRVLabel*>(transValue(Branch->getSuccessor(0), BB)), 1008 BB)); 1009 return mapValue(V, BM->addBranchConditionalInst( 1010 transValue(Branch->getCondition(), BB), 1011 static_cast<SPIRVLabel*>(transValue(Branch->getSuccessor(0), BB)), 1012 static_cast<SPIRVLabel*>(transValue(Branch->getSuccessor(1), BB)), 1013 BB)); 1014 } 1015 1016 if (auto Phi = dyn_cast<PHINode>(V)) { 1017 std::vector<SPIRVValue *> IncomingPairs; 1018 for (size_t I = 0, E = Phi->getNumIncomingValues(); I != E; ++I) { 1019 IncomingPairs.push_back(transValue(Phi->getIncomingValue(I), BB)); 1020 IncomingPairs.push_back(transValue(Phi->getIncomingBlock(I), nullptr)); 1021 } 1022 return mapValue(V, BM->addPhiInst(transType(Phi->getType()), IncomingPairs, 1023 BB)); 1024 } 1025 1026 if (auto Ext = dyn_cast<ExtractValueInst>(V)) { 1027 return mapValue(V, BM->addCompositeExtractInst( 1028 transType(Ext->getType()), 1029 transValue(Ext->getAggregateOperand(), BB), 1030 Ext->getIndices(), BB)); 1031 } 1032 1033 if (auto Ins = dyn_cast<InsertValueInst>(V)) { 1034 return mapValue(V, BM->addCompositeInsertInst( 1035 transValue(Ins->getInsertedValueOperand(), BB), 1036 transValue(Ins->getAggregateOperand(), BB), 1037 Ins->getIndices(), BB)); 1038 } 1039 1040 if (UnaryInstruction *U = dyn_cast<UnaryInstruction>(V)) { 1041 if (isSpecialTypeInitializer(U)) 1042 return mapValue(V, transValue(U->getOperand(0), BB)); 1043 return mapValue(V, transUnaryInst(U, BB)); 1044 } 1045 1046 if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V)) { 1047 std::vector<SPIRVValue *> Indices; 1048 for (unsigned i = 0, e = GEP->getNumIndices(); i != e; ++i) 1049 Indices.push_back(transValue(GEP->getOperand(i+1), BB)); 1050 return mapValue(V, BM->addPtrAccessChainInst( 1051 transType(GEP->getType()), 1052 transValue(GEP->getPointerOperand(), BB), 1053 Indices, BB, GEP->isInBounds())); 1054 } 1055 1056 if (auto Ext = dyn_cast<ExtractElementInst>(V)) { 1057 auto Index = Ext->getIndexOperand(); 1058 if (auto Const = dyn_cast<ConstantInt>(Index)) 1059 return mapValue(V, BM->addCompositeExtractInst( 1060 transType(Ext->getType()), 1061 transValue(Ext->getVectorOperand(), BB), 1062 std::vector<SPIRVWord>(1, Const->getZExtValue()), 1063 BB)); 1064 else 1065 return mapValue(V, BM->addVectorExtractDynamicInst( 1066 transValue(Ext->getVectorOperand(), BB), 1067 transValue(Index, BB), 1068 BB)); 1069 } 1070 1071 if (auto Ins = dyn_cast<InsertElementInst>(V)) { 1072 auto Index = Ins->getOperand(2); 1073 if (auto Const = dyn_cast<ConstantInt>(Index)) 1074 return mapValue(V, BM->addCompositeInsertInst( 1075 transValue(Ins->getOperand(1), BB), 1076 transValue(Ins->getOperand(0), BB), 1077 std::vector<SPIRVWord>(1, Const->getZExtValue()), 1078 BB)); 1079 else 1080 return mapValue(V, BM->addVectorInsertDynamicInst( 1081 transValue(Ins->getOperand(0), BB), 1082 transValue(Ins->getOperand(1), BB), 1083 transValue(Index, BB), 1084 BB)); 1085 } 1086 1087 if (auto SF = dyn_cast<ShuffleVectorInst>(V)) { 1088 std::vector<SPIRVWord> Comp; 1089 for (auto &I:SF->getShuffleMask()) 1090 Comp.push_back(I); 1091 return mapValue(V, BM->addVectorShuffleInst( 1092 transType(SF->getType()), 1093 transValue(SF->getOperand(0), BB), 1094 transValue(SF->getOperand(1), BB), 1095 Comp, 1096 BB)); 1097 } 1098 1099 if (CallInst *CI = dyn_cast<CallInst>(V)) 1100 return mapValue(V, transCallInst(CI, BB)); 1101 1102 llvm_unreachable("Not implemented"); 1103 return nullptr; 1104 } 1105 1106 bool 1107 LLVMToSPIRV::transDecoration(Value *V, SPIRVValue *BV) { 1108 if (!transAlign(V, BV)) 1109 return false; 1110 if ((isa<AtomicCmpXchgInst>(V) && 1111 cast<AtomicCmpXchgInst>(V)->isVolatile()) || 1112 (isa<AtomicRMWInst>(V) && cast<AtomicRMWInst>(V)->isVolatile())) 1113 BV->setVolatile(true); 1114 DbgTran.transDbgInfo(V, BV); 1115 return true; 1116 } 1117 1118 bool 1119 LLVMToSPIRV::transAlign(Value *V, SPIRVValue *BV) { 1120 if (auto AL = dyn_cast<AllocaInst>(V)) { 1121 BM->setAlignment(BV, AL->getAlignment()); 1122 return true; 1123 } 1124 if (auto GV = dyn_cast<GlobalVariable>(V)) { 1125 BM->setAlignment(BV, GV->getAlignment()); 1126 return true; 1127 } 1128 return true; 1129 } 1130 1131 /// Do this after source language is set. 1132 bool 1133 LLVMToSPIRV::transBuiltinSet() { 1134 SPIRVWord Ver = 0; 1135 SourceLanguage Kind = BM->getSourceLanguage(&Ver); 1136 (void) Kind; 1137 assert((Kind == SourceLanguageOpenCL_C || 1138 Kind == SourceLanguageOpenCL_CPP ) && "not supported"); 1139 std::stringstream SS; 1140 SS << "OpenCL.std"; 1141 return BM->importBuiltinSet(SS.str(), &ExtSetId); 1142 } 1143 1144 /// Transform sampler* spcv.cast(i32 arg) 1145 /// Only two cases are possible: 1146 /// arg = ConstantInt x -> SPIRVConstantSampler 1147 /// arg = i32 argument -> transValue(arg) 1148 /// arg = load from sampler -> look through load 1149 SPIRVValue * 1150 LLVMToSPIRV::oclTransSpvcCastSampler(CallInst* CI, SPIRVBasicBlock *BB) { 1151 llvm::Function* F = CI->getCalledFunction(); 1152 auto FT = F->getFunctionType(); 1153 auto RT = FT->getReturnType(); 1154 assert(FT->getNumParams() == 1); 1155 assert(isSPIRVType(RT, kSPIRVTypeName::Sampler) && 1156 FT->getParamType(0)->isIntegerTy() && "Invalid sampler type"); 1157 auto Arg = CI->getArgOperand(0); 1158 1159 auto GetSamplerConstant = [&](uint64_t SamplerValue) { 1160 auto AddrMode = (SamplerValue & 0xE) >> 1; 1161 auto Param = SamplerValue & 0x1; 1162 auto Filter = ((SamplerValue & 0x30) >> 4) - 1; 1163 auto BV = BM->addSamplerConstant(transType(RT), AddrMode, Param, Filter); 1164 return BV; 1165 }; 1166 1167 if (auto Const = dyn_cast<ConstantInt>(Arg)) { 1168 // Sampler is declared as a kernel scope constant 1169 return GetSamplerConstant(Const->getZExtValue()); 1170 } else if (auto Load = dyn_cast<LoadInst>(Arg)) { 1171 // If value of the sampler is loaded from a global constant, use its 1172 // initializer for initialization of the sampler. 1173 auto Op = Load->getPointerOperand(); 1174 assert(isa<GlobalVariable>(Op) && "Unknown sampler pattern!"); 1175 auto GV = cast<GlobalVariable>(Op); 1176 assert(GV->isConstant() || 1177 GV->getType()->getPointerAddressSpace() == SPIRAS_Constant); 1178 auto Initializer = GV->getInitializer(); 1179 assert(isa<ConstantInt>(Initializer) && "sampler not constant int?"); 1180 return GetSamplerConstant(cast<ConstantInt>(Initializer)->getZExtValue()); 1181 } 1182 // Sampler is a function argument 1183 auto BV = transValue(Arg, BB); 1184 assert(BV && BV->getType() == transType(RT)); 1185 return BV; 1186 } 1187 1188 SPIRVValue * 1189 LLVMToSPIRV::transSpcvCast(CallInst* CI, SPIRVBasicBlock *BB) { 1190 return oclTransSpvcCastSampler(CI, BB); 1191 } 1192 1193 SPIRVValue * 1194 LLVMToSPIRV::transCallInst(CallInst *CI, SPIRVBasicBlock *BB) { 1195 SPIRVExtInstSetKind ExtSetKind = SPIRVEIS_Count; 1196 SPIRVWord ExtOp = SPIRVWORD_MAX; 1197 llvm::Function* F = CI->getCalledFunction(); 1198 auto MangledName = F->getName(); 1199 std::string DemangledName; 1200 1201 if (MangledName.startswith(SPCV_CAST)) 1202 return transSpcvCast(CI, BB); 1203 1204 if (MangledName.startswith("llvm.memcpy")) { 1205 std::vector<SPIRVWord> MemoryAccess; 1206 1207 if (isa<ConstantInt>(CI->getOperand(4)) && 1208 dyn_cast<ConstantInt>(CI->getOperand(4)) 1209 ->getZExtValue() == 1) 1210 MemoryAccess.push_back(MemoryAccessVolatileMask); 1211 if (isa<ConstantInt>(CI->getOperand(3))) { 1212 MemoryAccess.push_back(MemoryAccessAlignedMask); 1213 MemoryAccess.push_back(dyn_cast<ConstantInt>(CI->getOperand(3)) 1214 ->getZExtValue()); 1215 } 1216 1217 return BM->addCopyMemorySizedInst( 1218 transValue(CI->getOperand(0), BB), 1219 transValue(CI->getOperand(1), BB), 1220 transValue(CI->getOperand(2), BB), 1221 MemoryAccess, 1222 BB); 1223 } 1224 1225 if (oclIsBuiltin(MangledName, &DemangledName) || 1226 isDecoratedSPIRVFunc(F, &DemangledName)) 1227 if (auto BV = transBuiltinToInst(DemangledName, MangledName, CI, BB)) 1228 return BV; 1229 1230 SmallVector<std::string, 2> Dec; 1231 if (isBuiltinTransToExtInst(CI->getCalledFunction(), &ExtSetKind, 1232 &ExtOp, &Dec)) 1233 return addDecorations(BM->addExtInst( 1234 transType(CI->getType()), 1235 ExtSetId, 1236 ExtOp, 1237 transArguments(CI, BB, SPIRVEntry::create_unique(ExtSetKind, ExtOp).get()), 1238 BB), Dec); 1239 1240 return BM->addCallInst( 1241 transFunctionDecl(CI->getCalledFunction()), 1242 transArguments(CI, BB, SPIRVEntry::create_unique(OpFunctionCall).get()), 1243 BB); 1244 } 1245 1246 bool 1247 LLVMToSPIRV::transAddressingMode() { 1248 Triple TargetTriple(M->getTargetTriple()); 1249 Triple::ArchType Arch = TargetTriple.getArch(); 1250 1251 SPIRVCKRT(Arch == Triple::spir || Arch == Triple::spir64, 1252 InvalidTargetTriple, 1253 "Actual target triple is " + M->getTargetTriple()); 1254 1255 if (Arch == Triple::spir) 1256 BM->setAddressingModel(AddressingModelPhysical32); 1257 else 1258 BM->setAddressingModel(AddressingModelPhysical64); 1259 // Physical addressing model requires Addresses capability 1260 BM->addCapability(CapabilityAddresses); 1261 return true; 1262 } 1263 std::vector<SPIRVValue*> 1264 LLVMToSPIRV::transValue(const std::vector<Value *> &Args, SPIRVBasicBlock* BB) { 1265 std::vector<SPIRVValue*> BArgs; 1266 for (auto &I: Args) 1267 BArgs.push_back(transValue(I, BB)); 1268 return BArgs; 1269 } 1270 1271 std::vector<SPIRVValue*> 1272 LLVMToSPIRV::transArguments(CallInst *CI, SPIRVBasicBlock *BB) { 1273 return transValue(getArguments(CI), BB); 1274 } 1275 1276 std::vector<SPIRVWord> 1277 LLVMToSPIRV::transValue(const std::vector<Value *> &Args, SPIRVBasicBlock* BB, 1278 SPIRVEntry *Entry) { 1279 std::vector<SPIRVWord> Operands; 1280 for (size_t I = 0, E = Args.size(); I != E; ++I) { 1281 Operands.push_back(Entry->isOperandLiteral(I) ? 1282 cast<ConstantInt>(Args[I])->getZExtValue() : 1283 transValue(Args[I], BB)->getId()); 1284 } 1285 return Operands; 1286 } 1287 1288 std::vector<SPIRVWord> 1289 LLVMToSPIRV::transArguments(CallInst *CI, SPIRVBasicBlock *BB, SPIRVEntry *Entry) { 1290 return transValue(getArguments(CI), BB, Entry); 1291 } 1292 1293 SPIRVWord 1294 LLVMToSPIRV::transFunctionControlMask(CallInst *CI) { 1295 SPIRVWord FCM = 0; 1296 SPIRSPIRVFuncCtlMaskMap::foreach([&](Attribute::AttrKind Attr, 1297 SPIRVFunctionControlMaskKind Mask){ 1298 if (CI->hasFnAttr(Attr)) 1299 FCM |= Mask; 1300 }); 1301 return FCM; 1302 } 1303 1304 SPIRVWord 1305 LLVMToSPIRV::transFunctionControlMask(Function *F) { 1306 SPIRVWord FCM = 0; 1307 SPIRSPIRVFuncCtlMaskMap::foreach([&](Attribute::AttrKind Attr, 1308 SPIRVFunctionControlMaskKind Mask){ 1309 if (F->hasFnAttribute(Attr)) 1310 FCM |= Mask; 1311 }); 1312 return FCM; 1313 } 1314 1315 bool 1316 LLVMToSPIRV::transGlobalVariables() { 1317 for (auto I = M->global_begin(), 1318 E = M->global_end(); I != E; ++I) { 1319 if (!transValue(static_cast<GlobalVariable*>(I), nullptr)) 1320 return false; 1321 } 1322 return true; 1323 } 1324 1325 void 1326 LLVMToSPIRV::mutateFuncArgType(const std::map<unsigned, Type*>& ChangedType, 1327 Function* F) { 1328 for (auto &I : ChangedType) { 1329 for (auto UI = F->user_begin(), UE = F->user_end(); UI != UE; ++UI) { 1330 auto Call = dyn_cast<CallInst>(*UI); 1331 if (!Call) 1332 continue; 1333 auto Arg = Call->getArgOperand(I.first); 1334 auto OrigTy = Arg->getType(); 1335 if (OrigTy == I.second) 1336 continue; 1337 SPIRVDBG(dbgs() << "[mutate arg type] " << *Call << ", " << *Arg << '\n'); 1338 auto CastF = M->getOrInsertFunction(SPCV_CAST, I.second, OrigTy, nullptr); 1339 std::vector<Value *> Args; 1340 Args.push_back(Arg); 1341 auto Cast = CallInst::Create(CastF, Args, "", Call); 1342 Call->replaceUsesOfWith(Arg, Cast); 1343 SPIRVDBG(dbgs() << "[mutate arg type] -> " << *Cast << '\n'); 1344 } 1345 } 1346 } 1347 1348 void 1349 LLVMToSPIRV::transFunction(Function *I) { 1350 transFunctionDecl(I); 1351 // Creating all basic blocks before creating any instruction. 1352 for (Function::iterator FI = I->begin(), FE = I->end(); FI != FE; ++FI) { 1353 transValue(static_cast<BasicBlock*>(FI), nullptr); 1354 } 1355 for (Function::iterator FI = I->begin(), FE = I->end(); FI != FE; ++FI) { 1356 SPIRVBasicBlock* BB = static_cast<SPIRVBasicBlock*>(transValue(static_cast<BasicBlock*>(FI), nullptr)); 1357 for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; 1358 ++BI) { 1359 transValue(static_cast<Instruction*>(BI), BB, false); 1360 } 1361 } 1362 } 1363 1364 bool 1365 LLVMToSPIRV::translate() { 1366 BM->setGeneratorVer(kTranslatorVer); 1367 1368 if (!transSourceLanguage()) 1369 return false; 1370 if (!transExtension()) 1371 return false; 1372 if (!transBuiltinSet()) 1373 return false; 1374 if (!transAddressingMode()) 1375 return false; 1376 if (!transGlobalVariables()) 1377 return false; 1378 1379 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) { 1380 Function *F = static_cast<Function*>(I); 1381 auto FT = F->getFunctionType(); 1382 std::map<unsigned, Type *> ChangedType; 1383 oclGetMutatedArgumentTypesByBuiltin(FT, ChangedType, F); 1384 mutateFuncArgType(ChangedType, F); 1385 } 1386 1387 // SPIR-V logical layout requires all function declarations go before 1388 // function definitions. 1389 std::vector<Function *> Decls, Defs; 1390 for (Module::iterator I1 = M->begin(), E = M->end(); I1 != E; ++I1) { 1391 auto I = static_cast<Function*>(I1); 1392 if (isBuiltinTransToInst(I) || isBuiltinTransToExtInst(I) 1393 || I->getName().startswith(SPCV_CAST) || 1394 I->getName().startswith(LLVM_MEMCPY)) 1395 continue; 1396 if (I->isDeclaration()) 1397 Decls.push_back(I); 1398 else 1399 Defs.push_back(I); 1400 } 1401 for (auto I:Decls) 1402 transFunctionDecl(I); 1403 for (auto I:Defs) 1404 transFunction(I); 1405 1406 if (!transOCLKernelMetadata()) 1407 return false; 1408 if (!transExecutionMode()) 1409 return false; 1410 1411 BM->optimizeDecorates(); 1412 BM->resolveUnknownStructFields(); 1413 BM->createForwardPointers(); 1414 return true; 1415 } 1416 1417 llvm::IntegerType* LLVMToSPIRV::getSizetType() { 1418 return IntegerType::getIntNTy(M->getContext(), 1419 M->getDataLayout().getPointerSizeInBits()); 1420 } 1421 1422 void 1423 LLVMToSPIRV::oclGetMutatedArgumentTypesByBuiltin( 1424 llvm::FunctionType* FT, std::map<unsigned, Type*>& ChangedType, 1425 Function* F) { 1426 auto Name = F->getName(); 1427 std::string Demangled; 1428 if (!oclIsBuiltin(Name, &Demangled)) 1429 return; 1430 if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos) 1431 return; 1432 if (FT->getParamType(1)->isIntegerTy()) 1433 ChangedType[1] = getSamplerType(F->getParent()); 1434 } 1435 1436 SPIRVInstruction * 1437 LLVMToSPIRV::transBuiltinToInst(const std::string& DemangledName, 1438 const std::string &MangledName, CallInst* CI, SPIRVBasicBlock* BB) { 1439 SmallVector<std::string, 2> Dec; 1440 auto OC = getSPIRVFuncOC(DemangledName, &Dec); 1441 1442 if (OC == OpNop) 1443 return nullptr; 1444 1445 auto Inst = transBuiltinToInstWithoutDecoration(OC, CI, BB); 1446 addDecorations(Inst, Dec); 1447 return Inst; 1448 } 1449 1450 bool 1451 LLVMToSPIRV::transExecutionMode() { 1452 if (auto NMD = SPIRVMDWalker(*M).getNamedMD(kSPIRVMD::ExecutionMode)) { 1453 while (!NMD.atEnd()) { 1454 unsigned EMode = ~0U; 1455 Function *F = nullptr; 1456 auto N = NMD.nextOp(); /* execution mode MDNode */ 1457 N.get(F).get(EMode); 1458 1459 SPIRVFunction *BF = static_cast<SPIRVFunction *>(getTranslatedValue(F)); 1460 assert(BF && "Invalid kernel function"); 1461 if (!BF) 1462 return false; 1463 1464 switch (EMode) { 1465 case spv::ExecutionModeContractionOff: 1466 case spv::ExecutionModeInitializer: 1467 case spv::ExecutionModeFinalizer: 1468 BF->addExecutionMode(new SPIRVExecutionMode(BF, 1469 static_cast<ExecutionMode>(EMode))); 1470 break; 1471 case spv::ExecutionModeLocalSize: 1472 case spv::ExecutionModeLocalSizeHint: { 1473 unsigned X, Y, Z; 1474 N.get(X).get(Y).get(Z); 1475 BF->addExecutionMode(new SPIRVExecutionMode(BF, 1476 static_cast<ExecutionMode>(EMode), X, Y, Z)); 1477 } 1478 break; 1479 case spv::ExecutionModeVecTypeHint: 1480 case spv::ExecutionModeSubgroupSize: 1481 case spv::ExecutionModeSubgroupsPerWorkgroup: { 1482 unsigned X; 1483 N.get(X); 1484 BF->addExecutionMode(new SPIRVExecutionMode(BF, 1485 static_cast<ExecutionMode>(EMode), X)); 1486 } 1487 break; 1488 default: 1489 llvm_unreachable("invalid execution mode"); 1490 } 1491 } 1492 } 1493 return true; 1494 } 1495 1496 bool 1497 LLVMToSPIRV::transOCLKernelMetadata() { 1498 NamedMDNode *KernelMDs = M->getNamedMetadata(SPIR_MD_KERNELS); 1499 std::vector<std::string> argAccessQual; 1500 if (!KernelMDs) 1501 return true; 1502 1503 for (unsigned I = 0, E = KernelMDs->getNumOperands(); I < E; ++I) { 1504 MDNode *KernelMD = KernelMDs->getOperand(I); 1505 if (KernelMD->getNumOperands() == 0) 1506 continue; 1507 Function *Kernel = mdconst::dyn_extract<Function>(KernelMD->getOperand(0)); 1508 1509 SPIRVFunction *BF = static_cast<SPIRVFunction *>(getTranslatedValue(Kernel)); 1510 assert(BF && "Kernel function should be translated first"); 1511 assert(Kernel && oclIsKernel(Kernel) 1512 && "Invalid kernel calling convention or metadata"); 1513 for (unsigned MI = 1, ME = KernelMD->getNumOperands(); MI < ME; ++MI) { 1514 MDNode *MD = dyn_cast<MDNode>(KernelMD->getOperand(MI)); 1515 if (!MD) 1516 continue; 1517 MDString *NameMD = dyn_cast<MDString>(MD->getOperand(0)); 1518 if (!NameMD) 1519 continue; 1520 StringRef Name = NameMD->getString(); 1521 if (Name == SPIR_MD_KERNEL_ARG_TYPE_QUAL) { 1522 foreachKernelArgMD(MD, BF, 1523 [](const std::string &Str, SPIRVFunctionParameter *BA){ 1524 if (Str.find("volatile") != std::string::npos) 1525 BA->addDecorate(new SPIRVDecorate(DecorationVolatile, BA)); 1526 if (Str.find("restrict") != std::string::npos) 1527 BA->addDecorate(new SPIRVDecorate(DecorationFuncParamAttr, 1528 BA, FunctionParameterAttributeNoAlias)); 1529 if (Str.find("const") != std::string::npos) 1530 BA->addDecorate(new SPIRVDecorate(DecorationFuncParamAttr, 1531 BA, FunctionParameterAttributeNoWrite)); 1532 }); 1533 } else if (Name == SPIR_MD_KERNEL_ARG_NAME) { 1534 foreachKernelArgMD(MD, BF, 1535 [=](const std::string &Str, SPIRVFunctionParameter *BA){ 1536 BM->setName(BA, Str); 1537 }); 1538 } 1539 } 1540 } 1541 return true; 1542 } 1543 1544 bool 1545 LLVMToSPIRV::transSourceLanguage() { 1546 auto Src = getSPIRVSource(M); 1547 SrcLang = std::get<0>(Src); 1548 SrcLangVer = std::get<1>(Src); 1549 BM->setSourceLanguage(static_cast<SourceLanguage>(SrcLang), SrcLangVer); 1550 return true; 1551 } 1552 1553 bool 1554 LLVMToSPIRV::transExtension() { 1555 if (auto N = SPIRVMDWalker(*M).getNamedMD(kSPIRVMD::Extension)) { 1556 while (!N.atEnd()) { 1557 std::string S; 1558 N.nextOp().get(S); 1559 assert(!S.empty() && "Invalid extension"); 1560 BM->getExtension().insert(S); 1561 } 1562 } 1563 if (auto N = SPIRVMDWalker(*M).getNamedMD(kSPIRVMD::SourceExtension)) { 1564 while (!N.atEnd()) { 1565 std::string S; 1566 N.nextOp().get(S); 1567 assert(!S.empty() && "Invalid extension"); 1568 BM->getSourceExtension().insert(S); 1569 } 1570 } 1571 for (auto &I:map<SPIRVCapabilityKind>(rmap<OclExt::Kind>(BM->getExtension()))) 1572 BM->addCapability(I); 1573 1574 return true; 1575 } 1576 1577 void 1578 LLVMToSPIRV::dumpUsers(Value* V) { 1579 SPIRVDBG(dbgs() << "Users of " << *V << " :\n"); 1580 for (auto UI = V->user_begin(), UE = V->user_end(); 1581 UI != UE; ++UI) 1582 SPIRVDBG(dbgs() << " " << **UI << '\n'); 1583 } 1584 1585 Op 1586 LLVMToSPIRV::transBoolOpCode(SPIRVValue* Opn, Op OC) { 1587 if (!Opn->getType()->isTypeVectorOrScalarBool()) 1588 return OC; 1589 IntBoolOpMap::find(OC, &OC); 1590 return OC; 1591 } 1592 1593 SPIRVInstruction * 1594 LLVMToSPIRV::transBuiltinToInstWithoutDecoration(Op OC, 1595 CallInst* CI, SPIRVBasicBlock* BB) { 1596 if (isGroupOpCode(OC)) 1597 BM->addCapability(CapabilityGroups); 1598 switch (OC) { 1599 case OpControlBarrier: { 1600 auto BArgs = transValue(getArguments(CI), BB); 1601 return BM->addControlBarrierInst( 1602 BArgs[0], BArgs[1], BArgs[2], BB); 1603 } 1604 break; 1605 case OpGroupAsyncCopy: { 1606 auto BArgs = transValue(getArguments(CI), BB); 1607 return BM->addAsyncGroupCopy(BArgs[0], BArgs[1], BArgs[2], BArgs[3], 1608 BArgs[4], BArgs[5], BB); 1609 } 1610 break; 1611 default: { 1612 if (isCvtOpCode(OC) && OC != OpGenericCastToPtrExplicit) { 1613 return BM->addUnaryInst(OC, transType(CI->getType()), 1614 transValue(CI->getArgOperand(0), BB), BB); 1615 } else if (isCmpOpCode(OC)) { 1616 assert(CI && CI->getNumArgOperands() == 2 && "Invalid call inst"); 1617 auto ResultTy = CI->getType(); 1618 Type *BoolTy = IntegerType::getInt1Ty(M->getContext()); 1619 auto IsVector = ResultTy->isVectorTy(); 1620 if (IsVector) 1621 BoolTy = VectorType::get(BoolTy, ResultTy->getVectorNumElements()); 1622 auto BBT = transType(BoolTy); 1623 auto Cmp = BM->addCmpInst(OC, BBT, 1624 transValue(CI->getArgOperand(0), BB), 1625 transValue(CI->getArgOperand(1), BB), BB); 1626 auto Zero = transValue(Constant::getNullValue(ResultTy), BB); 1627 auto One = transValue( 1628 IsVector ? Constant::getAllOnesValue(ResultTy) : getInt32(M, 1), BB); 1629 return BM->addSelectInst(Cmp, One, Zero, BB); 1630 } else if (isBinaryOpCode(OC)) { 1631 assert(CI && CI->getNumArgOperands() == 2 && "Invalid call inst"); 1632 return BM->addBinaryInst(OC, transType(CI->getType()), 1633 transValue(CI->getArgOperand(0), BB), 1634 transValue(CI->getArgOperand(1), BB), BB); 1635 } else if (CI->getNumArgOperands() == 1 && 1636 !CI->getType()->isVoidTy() && 1637 !hasExecScope(OC) && 1638 !isAtomicOpCode(OC)) { 1639 return BM->addUnaryInst(OC, transType(CI->getType()), 1640 transValue(CI->getArgOperand(0), BB), BB); 1641 } else { 1642 auto Args = getArguments(CI); 1643 SPIRVType *SPRetTy = nullptr; 1644 Type *RetTy = CI->getType(); 1645 auto F = CI->getCalledFunction(); 1646 if (!RetTy->isVoidTy()) { 1647 SPRetTy = transType(RetTy); 1648 } else if (Args.size() > 0 && F->arg_begin()->hasStructRetAttr()) { 1649 SPRetTy = transType(F->arg_begin()->getType()->getPointerElementType()); 1650 Args.erase(Args.begin()); 1651 } 1652 auto SPI = BM->addInstTemplate(OC, BB, SPRetTy); 1653 std::vector<SPIRVWord> SPArgs; 1654 for (size_t I = 0, E = Args.size(); I != E; ++I) { 1655 assert((!isFunctionPointerType(Args[I]->getType()) || 1656 isa<Function>(Args[I])) && 1657 "Invalid function pointer argument"); 1658 SPArgs.push_back(SPI->isOperandLiteral(I) ? 1659 cast<ConstantInt>(Args[I])->getZExtValue() : 1660 transValue(Args[I], BB)->getId()); 1661 } 1662 SPI->setOpWordsAndValidate(SPArgs); 1663 if (!SPRetTy || !SPRetTy->isTypeStruct()) 1664 return SPI; 1665 std::vector<SPIRVWord> Mem; 1666 SPIRVDBG(spvdbgs() << *SPI << '\n'); 1667 return BM->addStoreInst(transValue(CI->getArgOperand(0), BB), SPI, 1668 Mem, BB); 1669 } 1670 } 1671 } 1672 return nullptr; 1673 } 1674 1675 1676 SPIRVId 1677 LLVMToSPIRV::addInt32(int I) { 1678 return transValue(getInt32(M, I), nullptr, false)->getId(); 1679 } 1680 1681 SPIRV::SPIRVLinkageTypeKind 1682 LLVMToSPIRV::transLinkageType(const GlobalValue* GV) { 1683 if(GV->isDeclarationForLinker()) 1684 return SPIRVLinkageTypeKind::LinkageTypeImport; 1685 if(GV->hasInternalLinkage() || GV->hasPrivateLinkage()) 1686 return SPIRVLinkageTypeKind::LinkageTypeInternal; 1687 return SPIRVLinkageTypeKind::LinkageTypeExport; 1688 } 1689 } // end of SPIRV namespace 1690 1691 char LLVMToSPIRV::ID = 0; 1692 1693 INITIALIZE_PASS_BEGIN(LLVMToSPIRV, "llvmtospv", "Translate LLVM to SPIR-V", 1694 false, false) 1695 INITIALIZE_PASS_DEPENDENCY(OCLTypeToSPIRV) 1696 INITIALIZE_PASS_END(LLVMToSPIRV, "llvmtospv", "Translate LLVM to SPIR-V", 1697 false, false) 1698 1699 ModulePass *llvm::createLLVMToSPIRV(SPIRVModule *SMod) { 1700 return new LLVMToSPIRV(SMod); 1701 } 1702 1703 void 1704 addPassesForSPIRV(legacy::PassManager &PassMgr) { 1705 if (SPIRVMemToReg) 1706 PassMgr.add(createPromoteMemoryToRegisterPass()); 1707 PassMgr.add(createTransOCLMD()); 1708 PassMgr.add(createOCL21ToSPIRV()); 1709 PassMgr.add(createSPIRVLowerOCLBlocks()); 1710 PassMgr.add(createOCLTypeToSPIRV()); 1711 PassMgr.add(createOCL20ToSPIRV()); 1712 PassMgr.add(createSPIRVRegularizeLLVM()); 1713 PassMgr.add(createSPIRVLowerConstExpr()); 1714 PassMgr.add(createSPIRVLowerBool()); 1715 } 1716 1717 bool 1718 llvm::WriteSPIRV(Module *M, llvm::raw_ostream &OS, std::string &ErrMsg) { 1719 std::unique_ptr<SPIRVModule> BM(SPIRVModule::createSPIRVModule()); 1720 legacy::PassManager PassMgr; 1721 addPassesForSPIRV(PassMgr); 1722 PassMgr.add(createLLVMToSPIRV(BM.get())); 1723 PassMgr.run(*M); 1724 1725 if (BM->getError(ErrMsg) != SPIRVEC_Success) 1726 return false; 1727 OS << *BM; 1728 return true; 1729 } 1730 1731 bool 1732 llvm::RegularizeLLVMForSPIRV(Module *M, std::string &ErrMsg) { 1733 std::unique_ptr<SPIRVModule> BM(SPIRVModule::createSPIRVModule()); 1734 legacy::PassManager PassMgr; 1735 addPassesForSPIRV(PassMgr); 1736 PassMgr.run(*M); 1737 return true; 1738 } 1739