1 //===- ConvertFromLLVMIR.cpp - MLIR to LLVM IR conversion -----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a translation between LLVM IR and the MLIR LLVM dialect. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "mlir/Target/LLVMIR/Import.h" 14 15 #include "mlir/Dialect/DLTI/DLTI.h" 16 #include "mlir/Dialect/LLVMIR/LLVMDialect.h" 17 #include "mlir/IR/Builders.h" 18 #include "mlir/IR/BuiltinOps.h" 19 #include "mlir/IR/BuiltinTypes.h" 20 #include "mlir/IR/MLIRContext.h" 21 #include "mlir/Interfaces/DataLayoutInterfaces.h" 22 #include "mlir/Target/LLVMIR/TypeFromLLVM.h" 23 #include "mlir/Tools/mlir-translate/Translation.h" 24 25 #include "llvm/ADT/StringSet.h" 26 #include "llvm/ADT/TypeSwitch.h" 27 #include "llvm/IR/Attributes.h" 28 #include "llvm/IR/Constants.h" 29 #include "llvm/IR/DerivedTypes.h" 30 #include "llvm/IR/Function.h" 31 #include "llvm/IR/InlineAsm.h" 32 #include "llvm/IR/Instructions.h" 33 #include "llvm/IR/Type.h" 34 #include "llvm/IRReader/IRReader.h" 35 #include "llvm/Support/Error.h" 36 #include "llvm/Support/SourceMgr.h" 37 38 using namespace mlir; 39 using namespace mlir::LLVM; 40 41 #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsFromLLVM.inc" 42 43 // Utility to print an LLVM value as a string for passing to emitError(). 44 // FIXME: Diagnostic should be able to natively handle types that have 45 // operator << (raw_ostream&) defined. 46 static std::string diag(llvm::Value &v) { 47 std::string s; 48 llvm::raw_string_ostream os(s); 49 os << v; 50 return os.str(); 51 } 52 53 /// Creates an attribute containing ABI and preferred alignment numbers parsed 54 /// a string. The string may be either "abi:preferred" or just "abi". In the 55 /// latter case, the prefrred alignment is considered equal to ABI alignment. 56 static DenseIntElementsAttr parseDataLayoutAlignment(MLIRContext &ctx, 57 StringRef spec) { 58 auto i32 = IntegerType::get(&ctx, 32); 59 60 StringRef abiString, preferredString; 61 std::tie(abiString, preferredString) = spec.split(':'); 62 int abi, preferred; 63 if (abiString.getAsInteger(/*Radix=*/10, abi)) 64 return nullptr; 65 66 if (preferredString.empty()) 67 preferred = abi; 68 else if (preferredString.getAsInteger(/*Radix=*/10, preferred)) 69 return nullptr; 70 71 return DenseIntElementsAttr::get(VectorType::get({2}, i32), {abi, preferred}); 72 } 73 74 /// Returns a supported MLIR floating point type of the given bit width or null 75 /// if the bit width is not supported. 76 static FloatType getDLFloatType(MLIRContext &ctx, int32_t bitwidth) { 77 switch (bitwidth) { 78 case 16: 79 return FloatType::getF16(&ctx); 80 case 32: 81 return FloatType::getF32(&ctx); 82 case 64: 83 return FloatType::getF64(&ctx); 84 case 80: 85 return FloatType::getF80(&ctx); 86 case 128: 87 return FloatType::getF128(&ctx); 88 default: 89 return nullptr; 90 } 91 } 92 93 DataLayoutSpecInterface 94 mlir::translateDataLayout(const llvm::DataLayout &dataLayout, 95 MLIRContext *context) { 96 assert(context && "expected MLIR context"); 97 std::string layoutstr = dataLayout.getStringRepresentation(); 98 99 // Remaining unhandled default layout defaults 100 // e (little endian if not set) 101 // p[n]:64:64:64 (non zero address spaces have 64-bit properties) 102 std::string append = 103 "p:64:64:64-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f64:" 104 "64:64-f128:128:128-v64:64:64-v128:128:128-a:0:64"; 105 if (layoutstr.empty()) 106 layoutstr = append; 107 else 108 layoutstr = layoutstr + "-" + append; 109 110 StringRef layout(layoutstr); 111 112 SmallVector<DataLayoutEntryInterface> entries; 113 StringSet<> seen; 114 while (!layout.empty()) { 115 // Split at '-'. 116 std::pair<StringRef, StringRef> split = layout.split('-'); 117 StringRef current; 118 std::tie(current, layout) = split; 119 120 // Split at ':'. 121 StringRef kind, spec; 122 std::tie(kind, spec) = current.split(':'); 123 if (seen.contains(kind)) 124 continue; 125 seen.insert(kind); 126 127 char symbol = kind.front(); 128 StringRef parameter = kind.substr(1); 129 130 if (symbol == 'i' || symbol == 'f') { 131 unsigned bitwidth; 132 if (parameter.getAsInteger(/*Radix=*/10, bitwidth)) 133 return nullptr; 134 DenseIntElementsAttr params = parseDataLayoutAlignment(*context, spec); 135 if (!params) 136 return nullptr; 137 auto entry = DataLayoutEntryAttr::get( 138 symbol == 'i' ? static_cast<Type>(IntegerType::get(context, bitwidth)) 139 : getDLFloatType(*context, bitwidth), 140 params); 141 entries.emplace_back(entry); 142 } else if (symbol == 'e' || symbol == 'E') { 143 auto value = StringAttr::get( 144 context, symbol == 'e' ? DLTIDialect::kDataLayoutEndiannessLittle 145 : DLTIDialect::kDataLayoutEndiannessBig); 146 auto entry = DataLayoutEntryAttr::get( 147 StringAttr::get(context, DLTIDialect::kDataLayoutEndiannessKey), 148 value); 149 entries.emplace_back(entry); 150 } 151 } 152 153 return DataLayoutSpecAttr::get(context, entries); 154 } 155 156 // Handles importing globals and functions from an LLVM module. 157 namespace { 158 class Importer { 159 public: 160 Importer(MLIRContext *context, ModuleOp module) 161 : b(context), context(context), module(module), 162 unknownLoc(FileLineColLoc::get(context, "imported-bitcode", 0, 0)), 163 typeTranslator(*context) { 164 b.setInsertionPointToStart(module.getBody()); 165 } 166 167 /// Imports `f` into the current module. 168 LogicalResult processFunction(llvm::Function *f); 169 170 /// Imports GV as a GlobalOp, creating it if it doesn't exist. 171 GlobalOp processGlobal(llvm::GlobalVariable *gv); 172 173 private: 174 /// Returns personality of `f` as a FlatSymbolRefAttr. 175 FlatSymbolRefAttr getPersonalityAsAttr(llvm::Function *f); 176 /// Imports `bb` into `block`, which must be initially empty. 177 LogicalResult processBasicBlock(llvm::BasicBlock *bb, Block *block); 178 /// Imports `inst` and populates instMap[inst] with the imported Value. 179 LogicalResult processInstruction(llvm::Instruction *inst); 180 /// Creates an LLVM-compatible MLIR type for `type`. 181 Type processType(llvm::Type *type); 182 /// `value` is an SSA-use. Return the remapped version of `value` or a 183 /// placeholder that will be remapped later if this is an instruction that 184 /// has not yet been visited. 185 Value processValue(llvm::Value *value); 186 /// Create the most accurate Location possible using a llvm::DebugLoc and 187 /// possibly an llvm::Instruction to narrow the Location if debug information 188 /// is unavailable. 189 Location processDebugLoc(const llvm::DebugLoc &loc, 190 llvm::Instruction *inst = nullptr); 191 /// `br` branches to `target`. Append the block arguments to attach to the 192 /// generated branch op to `blockArguments`. These should be in the same order 193 /// as the PHIs in `target`. 194 LogicalResult processBranchArgs(llvm::Instruction *br, 195 llvm::BasicBlock *target, 196 SmallVectorImpl<Value> &blockArguments); 197 /// Returns the builtin type equivalent to be used in attributes for the given 198 /// LLVM IR dialect type. 199 Type getStdTypeForAttr(Type type); 200 /// Return `value` as an attribute to attach to a GlobalOp. 201 Attribute getConstantAsAttr(llvm::Constant *value); 202 /// Return `c` as an MLIR Value. This could either be a ConstantOp, or 203 /// an expanded sequence of ops in the current function's entry block (for 204 /// ConstantExprs or ConstantGEPs). 205 Value processConstant(llvm::Constant *c); 206 207 /// The current builder, pointing at where the next Instruction should be 208 /// generated. 209 OpBuilder b; 210 /// The current context. 211 MLIRContext *context; 212 /// The current module being created. 213 ModuleOp module; 214 /// The entry block of the current function being processed. 215 Block *currentEntryBlock = nullptr; 216 217 /// Globals are inserted before the first function, if any. 218 Block::iterator getGlobalInsertPt() { 219 auto it = module.getBody()->begin(); 220 auto endIt = module.getBody()->end(); 221 while (it != endIt && !isa<LLVMFuncOp>(it)) 222 ++it; 223 return it; 224 } 225 226 /// Functions are always inserted before the module terminator. 227 Block::iterator getFuncInsertPt() { 228 return std::prev(module.getBody()->end()); 229 } 230 231 /// Remapped blocks, for the current function. 232 DenseMap<llvm::BasicBlock *, Block *> blocks; 233 /// Remapped values. These are function-local. 234 DenseMap<llvm::Value *, Value> instMap; 235 /// Instructions that had not been defined when first encountered as a use. 236 /// Maps to the dummy Operation that was created in processValue(). 237 DenseMap<llvm::Value *, Operation *> unknownInstMap; 238 /// Uniquing map of GlobalVariables. 239 DenseMap<llvm::GlobalVariable *, GlobalOp> globals; 240 /// Cached FileLineColLoc::get("imported-bitcode", 0, 0). 241 Location unknownLoc; 242 /// The stateful type translator (contains named structs). 243 LLVM::TypeFromLLVMIRTranslator typeTranslator; 244 }; 245 } // namespace 246 247 Location Importer::processDebugLoc(const llvm::DebugLoc &loc, 248 llvm::Instruction *inst) { 249 if (!loc && inst) { 250 std::string s; 251 llvm::raw_string_ostream os(s); 252 os << "llvm-imported-inst-%"; 253 inst->printAsOperand(os, /*PrintType=*/false); 254 return FileLineColLoc::get(context, os.str(), 0, 0); 255 } 256 if (!loc) { 257 return unknownLoc; 258 } 259 // FIXME: Obtain the filename from DILocationInfo. 260 return FileLineColLoc::get(context, "imported-bitcode", loc.getLine(), 261 loc.getCol()); 262 } 263 264 Type Importer::processType(llvm::Type *type) { 265 if (Type result = typeTranslator.translateType(type)) 266 return result; 267 268 // FIXME: Diagnostic should be able to natively handle types that have 269 // operator<<(raw_ostream&) defined. 270 std::string s; 271 llvm::raw_string_ostream os(s); 272 os << *type; 273 emitError(unknownLoc) << "unhandled type: " << os.str(); 274 return nullptr; 275 } 276 277 // We only need integers, floats, doubles, and vectors and tensors thereof for 278 // attributes. Scalar and vector types are converted to the standard 279 // equivalents. Array types are converted to ranked tensors; nested array types 280 // are converted to multi-dimensional tensors or vectors, depending on the 281 // innermost type being a scalar or a vector. 282 Type Importer::getStdTypeForAttr(Type type) { 283 if (!type) 284 return nullptr; 285 286 if (type.isa<IntegerType, FloatType>()) 287 return type; 288 289 // LLVM vectors can only contain scalars. 290 if (LLVM::isCompatibleVectorType(type)) { 291 auto numElements = LLVM::getVectorNumElements(type); 292 if (numElements.isScalable()) { 293 emitError(unknownLoc) << "scalable vectors not supported"; 294 return nullptr; 295 } 296 Type elementType = getStdTypeForAttr(LLVM::getVectorElementType(type)); 297 if (!elementType) 298 return nullptr; 299 return VectorType::get(numElements.getKnownMinValue(), elementType); 300 } 301 302 // LLVM arrays can contain other arrays or vectors. 303 if (auto arrayType = type.dyn_cast<LLVMArrayType>()) { 304 // Recover the nested array shape. 305 SmallVector<int64_t, 4> shape; 306 shape.push_back(arrayType.getNumElements()); 307 while (arrayType.getElementType().isa<LLVMArrayType>()) { 308 arrayType = arrayType.getElementType().cast<LLVMArrayType>(); 309 shape.push_back(arrayType.getNumElements()); 310 } 311 312 // If the innermost type is a vector, use the multi-dimensional vector as 313 // attribute type. 314 if (LLVM::isCompatibleVectorType(arrayType.getElementType())) { 315 auto numElements = LLVM::getVectorNumElements(arrayType.getElementType()); 316 if (numElements.isScalable()) { 317 emitError(unknownLoc) << "scalable vectors not supported"; 318 return nullptr; 319 } 320 shape.push_back(numElements.getKnownMinValue()); 321 322 Type elementType = getStdTypeForAttr( 323 LLVM::getVectorElementType(arrayType.getElementType())); 324 if (!elementType) 325 return nullptr; 326 return VectorType::get(shape, elementType); 327 } 328 329 // Otherwise use a tensor. 330 Type elementType = getStdTypeForAttr(arrayType.getElementType()); 331 if (!elementType) 332 return nullptr; 333 return RankedTensorType::get(shape, elementType); 334 } 335 336 return nullptr; 337 } 338 339 // Get the given constant as an attribute. Not all constants can be represented 340 // as attributes. 341 Attribute Importer::getConstantAsAttr(llvm::Constant *value) { 342 if (auto *ci = dyn_cast<llvm::ConstantInt>(value)) 343 return b.getIntegerAttr( 344 IntegerType::get(context, ci->getType()->getBitWidth()), 345 ci->getValue()); 346 if (auto *c = dyn_cast<llvm::ConstantDataArray>(value)) 347 if (c->isString()) 348 return b.getStringAttr(c->getAsString()); 349 if (auto *c = dyn_cast<llvm::ConstantFP>(value)) { 350 if (c->getType()->isDoubleTy()) 351 return b.getFloatAttr(FloatType::getF64(context), c->getValueAPF()); 352 if (c->getType()->isFloatingPointTy()) 353 return b.getFloatAttr(FloatType::getF32(context), c->getValueAPF()); 354 } 355 if (auto *f = dyn_cast<llvm::Function>(value)) 356 return SymbolRefAttr::get(b.getContext(), f->getName()); 357 358 // Convert constant data to a dense elements attribute. 359 if (auto *cd = dyn_cast<llvm::ConstantDataSequential>(value)) { 360 Type type = processType(cd->getElementType()); 361 if (!type) 362 return nullptr; 363 364 auto attrType = getStdTypeForAttr(processType(cd->getType())) 365 .dyn_cast_or_null<ShapedType>(); 366 if (!attrType) 367 return nullptr; 368 369 if (type.isa<IntegerType>()) { 370 SmallVector<APInt, 8> values; 371 values.reserve(cd->getNumElements()); 372 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 373 values.push_back(cd->getElementAsAPInt(i)); 374 return DenseElementsAttr::get(attrType, values); 375 } 376 377 if (type.isa<Float32Type, Float64Type>()) { 378 SmallVector<APFloat, 8> values; 379 values.reserve(cd->getNumElements()); 380 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 381 values.push_back(cd->getElementAsAPFloat(i)); 382 return DenseElementsAttr::get(attrType, values); 383 } 384 385 return nullptr; 386 } 387 388 // Unpack constant aggregates to create dense elements attribute whenever 389 // possible. Return nullptr (failure) otherwise. 390 if (isa<llvm::ConstantAggregate>(value)) { 391 auto outerType = getStdTypeForAttr(processType(value->getType())) 392 .dyn_cast_or_null<ShapedType>(); 393 if (!outerType) 394 return nullptr; 395 396 SmallVector<Attribute, 8> values; 397 SmallVector<int64_t, 8> shape; 398 399 for (unsigned i = 0, e = value->getNumOperands(); i < e; ++i) { 400 auto nested = getConstantAsAttr(value->getAggregateElement(i)) 401 .dyn_cast_or_null<DenseElementsAttr>(); 402 if (!nested) 403 return nullptr; 404 405 values.append(nested.value_begin<Attribute>(), 406 nested.value_end<Attribute>()); 407 } 408 409 return DenseElementsAttr::get(outerType, values); 410 } 411 412 return nullptr; 413 } 414 415 GlobalOp Importer::processGlobal(llvm::GlobalVariable *gv) { 416 auto it = globals.find(gv); 417 if (it != globals.end()) 418 return it->second; 419 420 OpBuilder b(module.getBody(), getGlobalInsertPt()); 421 Attribute valueAttr; 422 if (gv->hasInitializer()) 423 valueAttr = getConstantAsAttr(gv->getInitializer()); 424 Type type = processType(gv->getValueType()); 425 if (!type) 426 return nullptr; 427 428 uint64_t alignment = 0; 429 llvm::MaybeAlign maybeAlign = gv->getAlign(); 430 if (maybeAlign.hasValue()) { 431 llvm::Align align = maybeAlign.getValue(); 432 alignment = align.value(); 433 } 434 435 GlobalOp op = b.create<GlobalOp>( 436 UnknownLoc::get(context), type, gv->isConstant(), 437 convertLinkageFromLLVM(gv->getLinkage()), gv->getName(), valueAttr, 438 alignment, /*addr_space=*/gv->getAddressSpace(), 439 /*dso_local=*/gv->isDSOLocal(), /*thread_local=*/gv->isThreadLocal()); 440 441 if (gv->hasInitializer() && !valueAttr) { 442 Region &r = op.getInitializerRegion(); 443 currentEntryBlock = b.createBlock(&r); 444 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 445 Value v = processConstant(gv->getInitializer()); 446 if (!v) 447 return nullptr; 448 b.create<ReturnOp>(op.getLoc(), ArrayRef<Value>({v})); 449 } 450 if (gv->hasAtLeastLocalUnnamedAddr()) 451 op.setUnnamedAddrAttr(UnnamedAddrAttr::get( 452 context, convertUnnamedAddrFromLLVM(gv->getUnnamedAddr()))); 453 if (gv->hasSection()) 454 op.setSectionAttr(b.getStringAttr(gv->getSection())); 455 456 return globals[gv] = op; 457 } 458 459 Value Importer::processConstant(llvm::Constant *c) { 460 OpBuilder bEntry(currentEntryBlock, currentEntryBlock->begin()); 461 if (Attribute attr = getConstantAsAttr(c)) { 462 // These constants can be represented as attributes. 463 OpBuilder b(currentEntryBlock, currentEntryBlock->begin()); 464 Type type = processType(c->getType()); 465 if (!type) 466 return nullptr; 467 if (auto symbolRef = attr.dyn_cast<FlatSymbolRefAttr>()) 468 return instMap[c] = bEntry.create<AddressOfOp>(unknownLoc, type, 469 symbolRef.getValue()); 470 return instMap[c] = bEntry.create<ConstantOp>(unknownLoc, type, attr); 471 } 472 if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) { 473 Type type = processType(cn->getType()); 474 if (!type) 475 return nullptr; 476 return instMap[c] = bEntry.create<NullOp>(unknownLoc, type); 477 } 478 if (auto *gv = dyn_cast<llvm::GlobalVariable>(c)) 479 return bEntry.create<AddressOfOp>(UnknownLoc::get(context), 480 processGlobal(gv)); 481 482 if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) { 483 llvm::Instruction *i = ce->getAsInstruction(); 484 OpBuilder::InsertionGuard guard(b); 485 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 486 if (failed(processInstruction(i))) 487 return nullptr; 488 assert(instMap.count(i)); 489 490 // Remove this zombie LLVM instruction now, leaving us only with the MLIR 491 // op. 492 i->deleteValue(); 493 return instMap[c] = instMap[i]; 494 } 495 if (auto *ue = dyn_cast<llvm::UndefValue>(c)) { 496 Type type = processType(ue->getType()); 497 if (!type) 498 return nullptr; 499 return instMap[c] = bEntry.create<UndefOp>(UnknownLoc::get(context), type); 500 } 501 emitError(unknownLoc) << "unhandled constant: " << diag(*c); 502 return nullptr; 503 } 504 505 Value Importer::processValue(llvm::Value *value) { 506 auto it = instMap.find(value); 507 if (it != instMap.end()) 508 return it->second; 509 510 // We don't expect to see instructions in dominator order. If we haven't seen 511 // this instruction yet, create an unknown op and remap it later. 512 if (isa<llvm::Instruction>(value)) { 513 Type type = processType(value->getType()); 514 if (!type) 515 return nullptr; 516 unknownInstMap[value] = 517 b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"), 518 /*operands=*/{}, type); 519 return unknownInstMap[value]->getResult(0); 520 } 521 522 if (auto *c = dyn_cast<llvm::Constant>(value)) 523 return processConstant(c); 524 525 emitError(unknownLoc) << "unhandled value: " << diag(*value); 526 return nullptr; 527 } 528 529 /// Return the MLIR OperationName for the given LLVM opcode. 530 static StringRef lookupOperationNameFromOpcode(unsigned opcode) { 531 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered 532 // as in llvm/IR/Instructions.def to aid comprehension and spot missing 533 // instructions. 534 #define INST(llvm_n, mlir_n) \ 535 { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() } 536 static const DenseMap<unsigned, StringRef> opcMap = { 537 // Ret is handled specially. 538 // Br is handled specially. 539 // FIXME: switch 540 // FIXME: indirectbr 541 // FIXME: invoke 542 INST(Resume, Resume), 543 // FIXME: unreachable 544 // FIXME: cleanupret 545 // FIXME: catchret 546 // FIXME: catchswitch 547 // FIXME: callbr 548 // FIXME: fneg 549 INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub), 550 INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv), 551 INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem), 552 INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And), 553 INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load), 554 INST(Store, Store), 555 // Getelementptr is handled specially. 556 INST(Ret, Return), INST(Fence, Fence), 557 // FIXME: atomiccmpxchg 558 // FIXME: atomicrmw 559 INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt), 560 INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP), 561 INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt), 562 INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr), 563 INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast), 564 // FIXME: cleanuppad 565 // FIXME: catchpad 566 // ICmp is handled specially. 567 // FIXME: fcmp 568 // PHI is handled specially. 569 INST(Freeze, Freeze), INST(Call, Call), 570 // FIXME: select 571 // FIXME: vaarg 572 // FIXME: extractelement 573 // FIXME: insertelement 574 // FIXME: shufflevector 575 // FIXME: extractvalue 576 // FIXME: insertvalue 577 // FIXME: landingpad 578 }; 579 #undef INST 580 581 return opcMap.lookup(opcode); 582 } 583 584 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 585 switch (p) { 586 default: 587 llvm_unreachable("incorrect comparison predicate"); 588 case llvm::CmpInst::Predicate::ICMP_EQ: 589 return LLVM::ICmpPredicate::eq; 590 case llvm::CmpInst::Predicate::ICMP_NE: 591 return LLVM::ICmpPredicate::ne; 592 case llvm::CmpInst::Predicate::ICMP_SLT: 593 return LLVM::ICmpPredicate::slt; 594 case llvm::CmpInst::Predicate::ICMP_SLE: 595 return LLVM::ICmpPredicate::sle; 596 case llvm::CmpInst::Predicate::ICMP_SGT: 597 return LLVM::ICmpPredicate::sgt; 598 case llvm::CmpInst::Predicate::ICMP_SGE: 599 return LLVM::ICmpPredicate::sge; 600 case llvm::CmpInst::Predicate::ICMP_ULT: 601 return LLVM::ICmpPredicate::ult; 602 case llvm::CmpInst::Predicate::ICMP_ULE: 603 return LLVM::ICmpPredicate::ule; 604 case llvm::CmpInst::Predicate::ICMP_UGT: 605 return LLVM::ICmpPredicate::ugt; 606 case llvm::CmpInst::Predicate::ICMP_UGE: 607 return LLVM::ICmpPredicate::uge; 608 } 609 llvm_unreachable("incorrect comparison predicate"); 610 } 611 612 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 613 switch (ordering) { 614 case llvm::AtomicOrdering::NotAtomic: 615 return LLVM::AtomicOrdering::not_atomic; 616 case llvm::AtomicOrdering::Unordered: 617 return LLVM::AtomicOrdering::unordered; 618 case llvm::AtomicOrdering::Monotonic: 619 return LLVM::AtomicOrdering::monotonic; 620 case llvm::AtomicOrdering::Acquire: 621 return LLVM::AtomicOrdering::acquire; 622 case llvm::AtomicOrdering::Release: 623 return LLVM::AtomicOrdering::release; 624 case llvm::AtomicOrdering::AcquireRelease: 625 return LLVM::AtomicOrdering::acq_rel; 626 case llvm::AtomicOrdering::SequentiallyConsistent: 627 return LLVM::AtomicOrdering::seq_cst; 628 } 629 llvm_unreachable("incorrect atomic ordering"); 630 } 631 632 // `br` branches to `target`. Return the branch arguments to `br`, in the 633 // same order of the PHIs in `target`. 634 LogicalResult 635 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 636 SmallVectorImpl<Value> &blockArguments) { 637 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 638 auto *pn = cast<llvm::PHINode>(&*inst); 639 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 640 if (!value) 641 return failure(); 642 blockArguments.push_back(value); 643 } 644 return success(); 645 } 646 647 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 648 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 649 // flags and call / operand attributes are not supported. 650 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 651 Value &v = instMap[inst]; 652 assert(!v && "processInstruction must be called only once per instruction!"); 653 switch (inst->getOpcode()) { 654 default: 655 return emitError(loc) << "unknown instruction: " << diag(*inst); 656 case llvm::Instruction::Add: 657 case llvm::Instruction::FAdd: 658 case llvm::Instruction::Sub: 659 case llvm::Instruction::FSub: 660 case llvm::Instruction::Mul: 661 case llvm::Instruction::FMul: 662 case llvm::Instruction::UDiv: 663 case llvm::Instruction::SDiv: 664 case llvm::Instruction::FDiv: 665 case llvm::Instruction::URem: 666 case llvm::Instruction::SRem: 667 case llvm::Instruction::FRem: 668 case llvm::Instruction::Shl: 669 case llvm::Instruction::LShr: 670 case llvm::Instruction::AShr: 671 case llvm::Instruction::And: 672 case llvm::Instruction::Or: 673 case llvm::Instruction::Xor: 674 case llvm::Instruction::Alloca: 675 case llvm::Instruction::Load: 676 case llvm::Instruction::Store: 677 case llvm::Instruction::Ret: 678 case llvm::Instruction::Resume: 679 case llvm::Instruction::Trunc: 680 case llvm::Instruction::ZExt: 681 case llvm::Instruction::SExt: 682 case llvm::Instruction::FPToUI: 683 case llvm::Instruction::FPToSI: 684 case llvm::Instruction::UIToFP: 685 case llvm::Instruction::SIToFP: 686 case llvm::Instruction::FPTrunc: 687 case llvm::Instruction::FPExt: 688 case llvm::Instruction::PtrToInt: 689 case llvm::Instruction::IntToPtr: 690 case llvm::Instruction::AddrSpaceCast: 691 case llvm::Instruction::Freeze: 692 case llvm::Instruction::BitCast: { 693 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 694 SmallVector<Value, 4> ops; 695 ops.reserve(inst->getNumOperands()); 696 for (auto *op : inst->operand_values()) { 697 Value value = processValue(op); 698 if (!value) 699 return failure(); 700 ops.push_back(value); 701 } 702 state.addOperands(ops); 703 if (!inst->getType()->isVoidTy()) { 704 Type type = processType(inst->getType()); 705 if (!type) 706 return failure(); 707 state.addTypes(type); 708 } 709 Operation *op = b.create(state); 710 if (!inst->getType()->isVoidTy()) 711 v = op->getResult(0); 712 return success(); 713 } 714 case llvm::Instruction::ICmp: { 715 Value lhs = processValue(inst->getOperand(0)); 716 Value rhs = processValue(inst->getOperand(1)); 717 if (!lhs || !rhs) 718 return failure(); 719 v = b.create<ICmpOp>( 720 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 721 rhs); 722 return success(); 723 } 724 case llvm::Instruction::Br: { 725 auto *brInst = cast<llvm::BranchInst>(inst); 726 OperationState state(loc, 727 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 728 if (brInst->isConditional()) { 729 Value condition = processValue(brInst->getCondition()); 730 if (!condition) 731 return failure(); 732 state.addOperands(condition); 733 } 734 735 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 736 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 737 auto *succ = brInst->getSuccessor(i); 738 SmallVector<Value, 4> blockArguments; 739 if (failed(processBranchArgs(brInst, succ, blockArguments))) 740 return failure(); 741 state.addSuccessors(blocks[succ]); 742 state.addOperands(blockArguments); 743 operandSegmentSizes[i + 1] = blockArguments.size(); 744 } 745 746 if (brInst->isConditional()) { 747 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 748 b.getI32VectorAttr(operandSegmentSizes)); 749 } 750 751 b.create(state); 752 return success(); 753 } 754 case llvm::Instruction::PHI: { 755 Type type = processType(inst->getType()); 756 if (!type) 757 return failure(); 758 v = b.getInsertionBlock()->addArgument( 759 type, processDebugLoc(inst->getDebugLoc(), inst)); 760 return success(); 761 } 762 case llvm::Instruction::Call: { 763 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 764 SmallVector<Value, 4> ops; 765 ops.reserve(inst->getNumOperands()); 766 for (auto &op : ci->args()) { 767 Value arg = processValue(op.get()); 768 if (!arg) 769 return failure(); 770 ops.push_back(arg); 771 } 772 773 SmallVector<Type, 2> tys; 774 if (!ci->getType()->isVoidTy()) { 775 Type type = processType(inst->getType()); 776 if (!type) 777 return failure(); 778 tys.push_back(type); 779 } 780 Operation *op; 781 if (llvm::Function *callee = ci->getCalledFunction()) { 782 op = b.create<CallOp>( 783 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 784 } else { 785 Value calledValue = processValue(ci->getCalledOperand()); 786 if (!calledValue) 787 return failure(); 788 ops.insert(ops.begin(), calledValue); 789 op = b.create<CallOp>(loc, tys, ops); 790 } 791 if (!ci->getType()->isVoidTy()) 792 v = op->getResult(0); 793 return success(); 794 } 795 case llvm::Instruction::LandingPad: { 796 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 797 SmallVector<Value, 4> ops; 798 799 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 800 ops.push_back(processConstant(lpi->getClause(i))); 801 802 Type ty = processType(lpi->getType()); 803 if (!ty) 804 return failure(); 805 806 v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 807 return success(); 808 } 809 case llvm::Instruction::Invoke: { 810 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 811 812 SmallVector<Type, 2> tys; 813 if (!ii->getType()->isVoidTy()) 814 tys.push_back(processType(inst->getType())); 815 816 SmallVector<Value, 4> ops; 817 ops.reserve(inst->getNumOperands() + 1); 818 for (auto &op : ii->args()) 819 ops.push_back(processValue(op.get())); 820 821 SmallVector<Value, 4> normalArgs, unwindArgs; 822 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 823 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 824 825 Operation *op; 826 if (llvm::Function *callee = ii->getCalledFunction()) { 827 op = b.create<InvokeOp>( 828 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 829 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 830 unwindArgs); 831 } else { 832 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 833 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 834 normalArgs, blocks[ii->getUnwindDest()], 835 unwindArgs); 836 } 837 838 if (!ii->getType()->isVoidTy()) 839 v = op->getResult(0); 840 return success(); 841 } 842 case llvm::Instruction::Fence: { 843 StringRef syncscope; 844 SmallVector<StringRef, 4> ssNs; 845 llvm::LLVMContext &llvmContext = inst->getContext(); 846 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 847 llvmContext.getSyncScopeNames(ssNs); 848 int fenceSyncScopeID = fence->getSyncScopeID(); 849 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 850 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 851 syncscope = ssNs[i]; 852 break; 853 } 854 } 855 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 856 syncscope); 857 return success(); 858 } 859 case llvm::Instruction::GetElementPtr: { 860 // FIXME: Support inbounds GEPs. 861 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 862 SmallVector<Value, 4> ops; 863 for (auto *op : gep->operand_values()) { 864 Value value = processValue(op); 865 if (!value) 866 return failure(); 867 ops.push_back(value); 868 } 869 Type type = processType(inst->getType()); 870 if (!type) 871 return failure(); 872 v = b.create<GEPOp>(loc, type, ops[0], 873 llvm::makeArrayRef(ops).drop_front()); 874 return success(); 875 } 876 } 877 } 878 879 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 880 if (!f->hasPersonalityFn()) 881 return nullptr; 882 883 llvm::Constant *pf = f->getPersonalityFn(); 884 885 // If it directly has a name, we can use it. 886 if (pf->hasName()) 887 return SymbolRefAttr::get(b.getContext(), pf->getName()); 888 889 // If it doesn't have a name, currently, only function pointers that are 890 // bitcast to i8* are parsed. 891 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 892 if (ce->getOpcode() == llvm::Instruction::BitCast && 893 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 894 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 895 return SymbolRefAttr::get(b.getContext(), func->getName()); 896 } 897 } 898 return FlatSymbolRefAttr(); 899 } 900 901 LogicalResult Importer::processFunction(llvm::Function *f) { 902 blocks.clear(); 903 instMap.clear(); 904 unknownInstMap.clear(); 905 906 auto functionType = 907 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 908 if (!functionType) 909 return failure(); 910 911 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 912 LLVMFuncOp fop = 913 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 914 convertLinkageFromLLVM(f->getLinkage())); 915 916 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 917 fop->setAttr(b.getStringAttr("personality"), personality); 918 else if (f->hasPersonalityFn()) 919 emitWarning(UnknownLoc::get(context), 920 "could not deduce personality, skipping it"); 921 922 if (f->hasGC()) 923 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 924 925 if (f->isDeclaration()) 926 return success(); 927 928 // Eagerly create all blocks. 929 SmallVector<Block *, 4> blockList; 930 for (llvm::BasicBlock &bb : *f) { 931 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 932 blocks[&bb] = blockList.back(); 933 } 934 currentEntryBlock = blockList[0]; 935 936 // Add function arguments to the entry block. 937 for (const auto &kv : llvm::enumerate(f->args())) { 938 instMap[&kv.value()] = blockList[0]->addArgument( 939 functionType.getParamType(kv.index()), fop.getLoc()); 940 } 941 942 for (auto bbs : llvm::zip(*f, blockList)) { 943 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 944 return failure(); 945 } 946 947 // Now that all instructions are guaranteed to have been visited, ensure 948 // any unknown uses we encountered are remapped. 949 for (auto &llvmAndUnknown : unknownInstMap) { 950 assert(instMap.count(llvmAndUnknown.first)); 951 Value newValue = instMap[llvmAndUnknown.first]; 952 Value oldValue = llvmAndUnknown.second->getResult(0); 953 oldValue.replaceAllUsesWith(newValue); 954 llvmAndUnknown.second->erase(); 955 } 956 return success(); 957 } 958 959 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 960 b.setInsertionPointToStart(block); 961 for (llvm::Instruction &inst : *bb) { 962 if (failed(processInstruction(&inst))) 963 return failure(); 964 } 965 return success(); 966 } 967 968 OwningOpRef<ModuleOp> 969 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 970 MLIRContext *context) { 971 context->loadDialect<LLVMDialect>(); 972 context->loadDialect<DLTIDialect>(); 973 OwningOpRef<ModuleOp> module(ModuleOp::create( 974 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 975 976 DataLayoutSpecInterface dlSpec = 977 translateDataLayout(llvmModule->getDataLayout(), context); 978 if (!dlSpec) { 979 emitError(UnknownLoc::get(context), "can't translate data layout"); 980 return {}; 981 } 982 983 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 984 985 Importer deserializer(context, module.get()); 986 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 987 if (!deserializer.processGlobal(&gv)) 988 return {}; 989 } 990 for (llvm::Function &f : llvmModule->functions()) { 991 if (failed(deserializer.processFunction(&f))) 992 return {}; 993 } 994 995 return module; 996 } 997 998 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 999 // LLVM dialect. 1000 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1001 MLIRContext *context) { 1002 llvm::SMDiagnostic err; 1003 llvm::LLVMContext llvmContext; 1004 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1005 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1006 if (!llvmModule) { 1007 std::string errStr; 1008 llvm::raw_string_ostream errStream(errStr); 1009 err.print(/*ProgName=*/"", errStream); 1010 emitError(UnknownLoc::get(context)) << errStream.str(); 1011 return {}; 1012 } 1013 return translateLLVMIRToModule(std::move(llvmModule), context); 1014 } 1015 1016 namespace mlir { 1017 void registerFromLLVMIRTranslation() { 1018 TranslateToMLIRRegistration fromLLVM( 1019 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1020 return ::translateLLVMIRToModule(sourceMgr, context); 1021 }); 1022 } 1023 } // namespace mlir 1024