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 auto *type = c->getType(); 351 FloatType floatTy; 352 if (type->isBFloatTy()) 353 floatTy = FloatType::getBF16(context); 354 else 355 floatTy = getDLFloatType(*context, type->getScalarSizeInBits()); 356 assert(floatTy && "unsupported floating point type"); 357 return b.getFloatAttr(floatTy, c->getValueAPF()); 358 } 359 if (auto *f = dyn_cast<llvm::Function>(value)) 360 return SymbolRefAttr::get(b.getContext(), f->getName()); 361 362 // Convert constant data to a dense elements attribute. 363 if (auto *cd = dyn_cast<llvm::ConstantDataSequential>(value)) { 364 Type type = processType(cd->getElementType()); 365 if (!type) 366 return nullptr; 367 368 auto attrType = getStdTypeForAttr(processType(cd->getType())) 369 .dyn_cast_or_null<ShapedType>(); 370 if (!attrType) 371 return nullptr; 372 373 if (type.isa<IntegerType>()) { 374 SmallVector<APInt, 8> values; 375 values.reserve(cd->getNumElements()); 376 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 377 values.push_back(cd->getElementAsAPInt(i)); 378 return DenseElementsAttr::get(attrType, values); 379 } 380 381 if (type.isa<Float32Type, Float64Type>()) { 382 SmallVector<APFloat, 8> values; 383 values.reserve(cd->getNumElements()); 384 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 385 values.push_back(cd->getElementAsAPFloat(i)); 386 return DenseElementsAttr::get(attrType, values); 387 } 388 389 return nullptr; 390 } 391 392 // Unpack constant aggregates to create dense elements attribute whenever 393 // possible. Return nullptr (failure) otherwise. 394 if (isa<llvm::ConstantAggregate>(value)) { 395 auto outerType = getStdTypeForAttr(processType(value->getType())) 396 .dyn_cast_or_null<ShapedType>(); 397 if (!outerType) 398 return nullptr; 399 400 SmallVector<Attribute, 8> values; 401 SmallVector<int64_t, 8> shape; 402 403 for (unsigned i = 0, e = value->getNumOperands(); i < e; ++i) { 404 auto nested = getConstantAsAttr(value->getAggregateElement(i)) 405 .dyn_cast_or_null<DenseElementsAttr>(); 406 if (!nested) 407 return nullptr; 408 409 values.append(nested.value_begin<Attribute>(), 410 nested.value_end<Attribute>()); 411 } 412 413 return DenseElementsAttr::get(outerType, values); 414 } 415 416 return nullptr; 417 } 418 419 GlobalOp Importer::processGlobal(llvm::GlobalVariable *gv) { 420 auto it = globals.find(gv); 421 if (it != globals.end()) 422 return it->second; 423 424 OpBuilder b(module.getBody(), getGlobalInsertPt()); 425 Attribute valueAttr; 426 if (gv->hasInitializer()) 427 valueAttr = getConstantAsAttr(gv->getInitializer()); 428 Type type = processType(gv->getValueType()); 429 if (!type) 430 return nullptr; 431 432 uint64_t alignment = 0; 433 llvm::MaybeAlign maybeAlign = gv->getAlign(); 434 if (maybeAlign.hasValue()) { 435 llvm::Align align = maybeAlign.getValue(); 436 alignment = align.value(); 437 } 438 439 GlobalOp op = b.create<GlobalOp>( 440 UnknownLoc::get(context), type, gv->isConstant(), 441 convertLinkageFromLLVM(gv->getLinkage()), gv->getName(), valueAttr, 442 alignment, /*addr_space=*/gv->getAddressSpace(), 443 /*dso_local=*/gv->isDSOLocal(), /*thread_local=*/gv->isThreadLocal()); 444 445 if (gv->hasInitializer() && !valueAttr) { 446 Region &r = op.getInitializerRegion(); 447 currentEntryBlock = b.createBlock(&r); 448 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 449 Value v = processConstant(gv->getInitializer()); 450 if (!v) 451 return nullptr; 452 b.create<ReturnOp>(op.getLoc(), ArrayRef<Value>({v})); 453 } 454 if (gv->hasAtLeastLocalUnnamedAddr()) 455 op.setUnnamedAddrAttr(UnnamedAddrAttr::get( 456 context, convertUnnamedAddrFromLLVM(gv->getUnnamedAddr()))); 457 if (gv->hasSection()) 458 op.setSectionAttr(b.getStringAttr(gv->getSection())); 459 460 return globals[gv] = op; 461 } 462 463 Value Importer::processConstant(llvm::Constant *c) { 464 OpBuilder bEntry(currentEntryBlock, currentEntryBlock->begin()); 465 if (Attribute attr = getConstantAsAttr(c)) { 466 // These constants can be represented as attributes. 467 OpBuilder b(currentEntryBlock, currentEntryBlock->begin()); 468 Type type = processType(c->getType()); 469 if (!type) 470 return nullptr; 471 if (auto symbolRef = attr.dyn_cast<FlatSymbolRefAttr>()) 472 return bEntry.create<AddressOfOp>(unknownLoc, type, symbolRef.getValue()); 473 return bEntry.create<ConstantOp>(unknownLoc, type, attr); 474 } 475 if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) { 476 Type type = processType(cn->getType()); 477 if (!type) 478 return nullptr; 479 return bEntry.create<NullOp>(unknownLoc, type); 480 } 481 if (auto *gv = dyn_cast<llvm::GlobalVariable>(c)) 482 return bEntry.create<AddressOfOp>(UnknownLoc::get(context), 483 processGlobal(gv)); 484 485 if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) { 486 llvm::Instruction *i = ce->getAsInstruction(); 487 OpBuilder::InsertionGuard guard(b); 488 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 489 if (failed(processInstruction(i))) 490 return nullptr; 491 assert(instMap.count(i)); 492 493 // If we don't remove entry of `i` here, it's totally possible that the 494 // next time llvm::ConstantExpr::getAsInstruction is called again, which 495 // always allocates a new Instruction, memory address of the newly 496 // created Instruction might be the same as `i`. Making processInstruction 497 // falsely believe that the new Instruction has been processed before 498 // and raised an assertion error. 499 Value value = instMap[i]; 500 instMap.erase(i); 501 // Remove this zombie LLVM instruction now, leaving us only with the MLIR 502 // op. 503 i->deleteValue(); 504 return value; 505 } 506 if (auto *ue = dyn_cast<llvm::UndefValue>(c)) { 507 Type type = processType(ue->getType()); 508 if (!type) 509 return nullptr; 510 return bEntry.create<UndefOp>(UnknownLoc::get(context), type); 511 } 512 513 if (isa<llvm::ConstantAggregate>(c) || isa<llvm::ConstantAggregateZero>(c)) { 514 unsigned numElements = c->getNumOperands(); 515 std::function<llvm::Constant *(unsigned)> getElement = 516 [&](unsigned index) -> llvm::Constant * { 517 return c->getAggregateElement(index); 518 }; 519 // llvm::ConstantAggregateZero doesn't take any operand 520 // so its getNumOperands is always zero. 521 if (auto *caz = dyn_cast<llvm::ConstantAggregateZero>(c)) { 522 numElements = caz->getElementCount().getFixedValue(); 523 // We want to capture the pointer rather than reference 524 // to the pointer since the latter will become dangling upon 525 // exiting the scope. 526 getElement = [=](unsigned index) -> llvm::Constant * { 527 return caz->getElementValue(index); 528 }; 529 } 530 531 // Generate a llvm.undef as the root value first. 532 Type rootType = processType(c->getType()); 533 if (!rootType) 534 return nullptr; 535 Value root = bEntry.create<UndefOp>(unknownLoc, rootType); 536 for (unsigned i = 0; i < numElements; ++i) { 537 llvm::Constant *element = getElement(i); 538 Value elementValue = processConstant(element); 539 if (!elementValue) 540 return nullptr; 541 ArrayAttr indexAttr = bEntry.getI32ArrayAttr({static_cast<int32_t>(i)}); 542 root = bEntry.create<InsertValueOp>(UnknownLoc::get(context), rootType, 543 root, elementValue, indexAttr); 544 } 545 return root; 546 } 547 548 emitError(unknownLoc) << "unhandled constant: " << diag(*c); 549 return nullptr; 550 } 551 552 Value Importer::processValue(llvm::Value *value) { 553 auto it = instMap.find(value); 554 if (it != instMap.end()) 555 return it->second; 556 557 // We don't expect to see instructions in dominator order. If we haven't seen 558 // this instruction yet, create an unknown op and remap it later. 559 if (isa<llvm::Instruction>(value)) { 560 Type type = processType(value->getType()); 561 if (!type) 562 return nullptr; 563 unknownInstMap[value] = 564 b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"), 565 /*operands=*/{}, type); 566 return unknownInstMap[value]->getResult(0); 567 } 568 569 if (auto *c = dyn_cast<llvm::Constant>(value)) 570 return processConstant(c); 571 572 emitError(unknownLoc) << "unhandled value: " << diag(*value); 573 return nullptr; 574 } 575 576 /// Return the MLIR OperationName for the given LLVM opcode. 577 static StringRef lookupOperationNameFromOpcode(unsigned opcode) { 578 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered 579 // as in llvm/IR/Instructions.def to aid comprehension and spot missing 580 // instructions. 581 #define INST(llvm_n, mlir_n) \ 582 { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() } 583 static const DenseMap<unsigned, StringRef> opcMap = { 584 // Ret is handled specially. 585 // Br is handled specially. 586 // Switch is handled specially. 587 // FIXME: indirectbr 588 // FIXME: invoke 589 INST(Resume, Resume), 590 // FIXME: unreachable 591 // FIXME: cleanupret 592 // FIXME: catchret 593 // FIXME: catchswitch 594 // FIXME: callbr 595 // FIXME: fneg 596 INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub), 597 INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv), 598 INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem), 599 INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And), 600 INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load), 601 INST(Store, Store), 602 // Getelementptr is handled specially. 603 INST(Ret, Return), INST(Fence, Fence), 604 // FIXME: atomiccmpxchg 605 // FIXME: atomicrmw 606 INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt), 607 INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP), 608 INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt), 609 INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr), 610 INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast), 611 // FIXME: cleanuppad 612 // FIXME: catchpad 613 // ICmp is handled specially. 614 // FCmp is handled specially. 615 // PHI is handled specially. 616 INST(Freeze, Freeze), INST(Call, Call), 617 // FIXME: select 618 // FIXME: vaarg 619 INST(ExtractElement, ExtractElement), INST(InsertElement, InsertElement), 620 // ShuffleVector is handled specially. 621 // InsertValue is handled specially. 622 // ExtractValue is handled specially. 623 // FIXME: landingpad 624 }; 625 #undef INST 626 627 return opcMap.lookup(opcode); 628 } 629 630 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 631 switch (p) { 632 default: 633 llvm_unreachable("incorrect comparison predicate"); 634 case llvm::CmpInst::Predicate::ICMP_EQ: 635 return LLVM::ICmpPredicate::eq; 636 case llvm::CmpInst::Predicate::ICMP_NE: 637 return LLVM::ICmpPredicate::ne; 638 case llvm::CmpInst::Predicate::ICMP_SLT: 639 return LLVM::ICmpPredicate::slt; 640 case llvm::CmpInst::Predicate::ICMP_SLE: 641 return LLVM::ICmpPredicate::sle; 642 case llvm::CmpInst::Predicate::ICMP_SGT: 643 return LLVM::ICmpPredicate::sgt; 644 case llvm::CmpInst::Predicate::ICMP_SGE: 645 return LLVM::ICmpPredicate::sge; 646 case llvm::CmpInst::Predicate::ICMP_ULT: 647 return LLVM::ICmpPredicate::ult; 648 case llvm::CmpInst::Predicate::ICMP_ULE: 649 return LLVM::ICmpPredicate::ule; 650 case llvm::CmpInst::Predicate::ICMP_UGT: 651 return LLVM::ICmpPredicate::ugt; 652 case llvm::CmpInst::Predicate::ICMP_UGE: 653 return LLVM::ICmpPredicate::uge; 654 } 655 llvm_unreachable("incorrect integer comparison predicate"); 656 } 657 658 static FCmpPredicate getFCmpPredicate(llvm::CmpInst::Predicate p) { 659 switch (p) { 660 default: 661 llvm_unreachable("incorrect comparison predicate"); 662 case llvm::CmpInst::Predicate::FCMP_FALSE: 663 return LLVM::FCmpPredicate::_false; 664 case llvm::CmpInst::Predicate::FCMP_TRUE: 665 return LLVM::FCmpPredicate::_true; 666 case llvm::CmpInst::Predicate::FCMP_OEQ: 667 return LLVM::FCmpPredicate::oeq; 668 case llvm::CmpInst::Predicate::FCMP_ONE: 669 return LLVM::FCmpPredicate::one; 670 case llvm::CmpInst::Predicate::FCMP_OLT: 671 return LLVM::FCmpPredicate::olt; 672 case llvm::CmpInst::Predicate::FCMP_OLE: 673 return LLVM::FCmpPredicate::ole; 674 case llvm::CmpInst::Predicate::FCMP_OGT: 675 return LLVM::FCmpPredicate::ogt; 676 case llvm::CmpInst::Predicate::FCMP_OGE: 677 return LLVM::FCmpPredicate::oge; 678 case llvm::CmpInst::Predicate::FCMP_ORD: 679 return LLVM::FCmpPredicate::ord; 680 case llvm::CmpInst::Predicate::FCMP_ULT: 681 return LLVM::FCmpPredicate::ult; 682 case llvm::CmpInst::Predicate::FCMP_ULE: 683 return LLVM::FCmpPredicate::ule; 684 case llvm::CmpInst::Predicate::FCMP_UGT: 685 return LLVM::FCmpPredicate::ugt; 686 case llvm::CmpInst::Predicate::FCMP_UGE: 687 return LLVM::FCmpPredicate::uge; 688 case llvm::CmpInst::Predicate::FCMP_UNO: 689 return LLVM::FCmpPredicate::uno; 690 case llvm::CmpInst::Predicate::FCMP_UEQ: 691 return LLVM::FCmpPredicate::ueq; 692 case llvm::CmpInst::Predicate::FCMP_UNE: 693 return LLVM::FCmpPredicate::une; 694 } 695 llvm_unreachable("incorrect floating point comparison predicate"); 696 } 697 698 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 699 switch (ordering) { 700 case llvm::AtomicOrdering::NotAtomic: 701 return LLVM::AtomicOrdering::not_atomic; 702 case llvm::AtomicOrdering::Unordered: 703 return LLVM::AtomicOrdering::unordered; 704 case llvm::AtomicOrdering::Monotonic: 705 return LLVM::AtomicOrdering::monotonic; 706 case llvm::AtomicOrdering::Acquire: 707 return LLVM::AtomicOrdering::acquire; 708 case llvm::AtomicOrdering::Release: 709 return LLVM::AtomicOrdering::release; 710 case llvm::AtomicOrdering::AcquireRelease: 711 return LLVM::AtomicOrdering::acq_rel; 712 case llvm::AtomicOrdering::SequentiallyConsistent: 713 return LLVM::AtomicOrdering::seq_cst; 714 } 715 llvm_unreachable("incorrect atomic ordering"); 716 } 717 718 // `br` branches to `target`. Return the branch arguments to `br`, in the 719 // same order of the PHIs in `target`. 720 LogicalResult 721 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 722 SmallVectorImpl<Value> &blockArguments) { 723 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 724 auto *pn = cast<llvm::PHINode>(&*inst); 725 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 726 if (!value) 727 return failure(); 728 blockArguments.push_back(value); 729 } 730 return success(); 731 } 732 733 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 734 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 735 // flags and call / operand attributes are not supported. 736 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 737 assert(!instMap.count(inst) && 738 "processInstruction must be called only once per instruction!"); 739 switch (inst->getOpcode()) { 740 default: 741 return emitError(loc) << "unknown instruction: " << diag(*inst); 742 case llvm::Instruction::Add: 743 case llvm::Instruction::FAdd: 744 case llvm::Instruction::Sub: 745 case llvm::Instruction::FSub: 746 case llvm::Instruction::Mul: 747 case llvm::Instruction::FMul: 748 case llvm::Instruction::UDiv: 749 case llvm::Instruction::SDiv: 750 case llvm::Instruction::FDiv: 751 case llvm::Instruction::URem: 752 case llvm::Instruction::SRem: 753 case llvm::Instruction::FRem: 754 case llvm::Instruction::Shl: 755 case llvm::Instruction::LShr: 756 case llvm::Instruction::AShr: 757 case llvm::Instruction::And: 758 case llvm::Instruction::Or: 759 case llvm::Instruction::Xor: 760 case llvm::Instruction::Load: 761 case llvm::Instruction::Store: 762 case llvm::Instruction::Ret: 763 case llvm::Instruction::Resume: 764 case llvm::Instruction::Trunc: 765 case llvm::Instruction::ZExt: 766 case llvm::Instruction::SExt: 767 case llvm::Instruction::FPToUI: 768 case llvm::Instruction::FPToSI: 769 case llvm::Instruction::UIToFP: 770 case llvm::Instruction::SIToFP: 771 case llvm::Instruction::FPTrunc: 772 case llvm::Instruction::FPExt: 773 case llvm::Instruction::PtrToInt: 774 case llvm::Instruction::IntToPtr: 775 case llvm::Instruction::AddrSpaceCast: 776 case llvm::Instruction::Freeze: 777 case llvm::Instruction::BitCast: 778 case llvm::Instruction::ExtractElement: 779 case llvm::Instruction::InsertElement: { 780 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 781 SmallVector<Value, 4> ops; 782 ops.reserve(inst->getNumOperands()); 783 for (auto *op : inst->operand_values()) { 784 Value value = processValue(op); 785 if (!value) 786 return failure(); 787 ops.push_back(value); 788 } 789 state.addOperands(ops); 790 if (!inst->getType()->isVoidTy()) { 791 Type type = processType(inst->getType()); 792 if (!type) 793 return failure(); 794 state.addTypes(type); 795 } 796 Operation *op = b.create(state); 797 if (!inst->getType()->isVoidTy()) 798 instMap[inst] = op->getResult(0); 799 return success(); 800 } 801 case llvm::Instruction::Alloca: { 802 Value size = processValue(inst->getOperand(0)); 803 if (!size) 804 return failure(); 805 806 auto *allocaInst = cast<llvm::AllocaInst>(inst); 807 instMap[inst] = 808 b.create<AllocaOp>(loc, processType(inst->getType()), 809 processType(allocaInst->getAllocatedType()), size, 810 allocaInst->getAlign().value()); 811 return success(); 812 } 813 case llvm::Instruction::ICmp: { 814 Value lhs = processValue(inst->getOperand(0)); 815 Value rhs = processValue(inst->getOperand(1)); 816 if (!lhs || !rhs) 817 return failure(); 818 instMap[inst] = b.create<ICmpOp>( 819 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 820 rhs); 821 return success(); 822 } 823 case llvm::Instruction::FCmp: { 824 Value lhs = processValue(inst->getOperand(0)); 825 Value rhs = processValue(inst->getOperand(1)); 826 if (!lhs || !rhs) 827 return failure(); 828 instMap[inst] = b.create<FCmpOp>( 829 loc, b.getI1Type(), 830 getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs); 831 return success(); 832 } 833 case llvm::Instruction::Br: { 834 auto *brInst = cast<llvm::BranchInst>(inst); 835 OperationState state(loc, 836 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 837 if (brInst->isConditional()) { 838 Value condition = processValue(brInst->getCondition()); 839 if (!condition) 840 return failure(); 841 state.addOperands(condition); 842 } 843 844 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 845 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 846 auto *succ = brInst->getSuccessor(i); 847 SmallVector<Value, 4> blockArguments; 848 if (failed(processBranchArgs(brInst, succ, blockArguments))) 849 return failure(); 850 state.addSuccessors(blocks[succ]); 851 state.addOperands(blockArguments); 852 operandSegmentSizes[i + 1] = blockArguments.size(); 853 } 854 855 if (brInst->isConditional()) { 856 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 857 b.getI32VectorAttr(operandSegmentSizes)); 858 } 859 860 b.create(state); 861 return success(); 862 } 863 case llvm::Instruction::Switch: { 864 auto *swInst = cast<llvm::SwitchInst>(inst); 865 // Process the condition value. 866 Value condition = processValue(swInst->getCondition()); 867 if (!condition) 868 return failure(); 869 870 SmallVector<Value> defaultBlockArgs; 871 // Process the default case. 872 llvm::BasicBlock *defaultBB = swInst->getDefaultDest(); 873 if (failed(processBranchArgs(swInst, defaultBB, defaultBlockArgs))) 874 return failure(); 875 876 // Process the cases. 877 unsigned numCases = swInst->getNumCases(); 878 SmallVector<SmallVector<Value>> caseOperands(numCases); 879 SmallVector<ValueRange> caseOperandRefs(numCases); 880 SmallVector<int32_t> caseValues(numCases); 881 SmallVector<Block *> caseBlocks(numCases); 882 for (const auto &en : llvm::enumerate(swInst->cases())) { 883 const llvm::SwitchInst::CaseHandle &caseHandle = en.value(); 884 unsigned i = en.index(); 885 llvm::BasicBlock *succBB = caseHandle.getCaseSuccessor(); 886 if (failed(processBranchArgs(swInst, succBB, caseOperands[i]))) 887 return failure(); 888 caseOperandRefs[i] = caseOperands[i]; 889 caseValues[i] = caseHandle.getCaseValue()->getSExtValue(); 890 caseBlocks[i] = blocks[succBB]; 891 } 892 893 b.create<SwitchOp>(loc, condition, blocks[defaultBB], defaultBlockArgs, 894 caseValues, caseBlocks, caseOperandRefs); 895 return success(); 896 } 897 case llvm::Instruction::PHI: { 898 Type type = processType(inst->getType()); 899 if (!type) 900 return failure(); 901 instMap[inst] = b.getInsertionBlock()->addArgument( 902 type, processDebugLoc(inst->getDebugLoc(), inst)); 903 return success(); 904 } 905 case llvm::Instruction::Call: { 906 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 907 SmallVector<Value, 4> ops; 908 ops.reserve(inst->getNumOperands()); 909 for (auto &op : ci->args()) { 910 Value arg = processValue(op.get()); 911 if (!arg) 912 return failure(); 913 ops.push_back(arg); 914 } 915 916 SmallVector<Type, 2> tys; 917 if (!ci->getType()->isVoidTy()) { 918 Type type = processType(inst->getType()); 919 if (!type) 920 return failure(); 921 tys.push_back(type); 922 } 923 Operation *op; 924 if (llvm::Function *callee = ci->getCalledFunction()) { 925 op = b.create<CallOp>( 926 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 927 } else { 928 Value calledValue = processValue(ci->getCalledOperand()); 929 if (!calledValue) 930 return failure(); 931 ops.insert(ops.begin(), calledValue); 932 op = b.create<CallOp>(loc, tys, ops); 933 } 934 if (!ci->getType()->isVoidTy()) 935 instMap[inst] = op->getResult(0); 936 return success(); 937 } 938 case llvm::Instruction::LandingPad: { 939 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 940 SmallVector<Value, 4> ops; 941 942 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 943 ops.push_back(processConstant(lpi->getClause(i))); 944 945 Type ty = processType(lpi->getType()); 946 if (!ty) 947 return failure(); 948 949 instMap[inst] = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 950 return success(); 951 } 952 case llvm::Instruction::Invoke: { 953 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 954 955 SmallVector<Type, 2> tys; 956 if (!ii->getType()->isVoidTy()) 957 tys.push_back(processType(inst->getType())); 958 959 SmallVector<Value, 4> ops; 960 ops.reserve(inst->getNumOperands() + 1); 961 for (auto &op : ii->args()) 962 ops.push_back(processValue(op.get())); 963 964 SmallVector<Value, 4> normalArgs, unwindArgs; 965 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 966 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 967 968 Operation *op; 969 if (llvm::Function *callee = ii->getCalledFunction()) { 970 op = b.create<InvokeOp>( 971 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 972 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 973 unwindArgs); 974 } else { 975 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 976 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 977 normalArgs, blocks[ii->getUnwindDest()], 978 unwindArgs); 979 } 980 981 if (!ii->getType()->isVoidTy()) 982 instMap[inst] = op->getResult(0); 983 return success(); 984 } 985 case llvm::Instruction::Fence: { 986 StringRef syncscope; 987 SmallVector<StringRef, 4> ssNs; 988 llvm::LLVMContext &llvmContext = inst->getContext(); 989 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 990 llvmContext.getSyncScopeNames(ssNs); 991 int fenceSyncScopeID = fence->getSyncScopeID(); 992 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 993 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 994 syncscope = ssNs[i]; 995 break; 996 } 997 } 998 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 999 syncscope); 1000 return success(); 1001 } 1002 case llvm::Instruction::GetElementPtr: { 1003 // FIXME: Support inbounds GEPs. 1004 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 1005 Value basePtr = processValue(gep->getOperand(0)); 1006 Type sourceElementType = processType(gep->getSourceElementType()); 1007 1008 SmallVector<Value> indices; 1009 for (llvm::Value *operand : llvm::drop_begin(gep->operand_values())) { 1010 indices.push_back(processValue(operand)); 1011 if (!indices.back()) 1012 return failure(); 1013 } 1014 // Treat every indices as dynamic since GEPOp::build will refine those 1015 // indices into static attributes later. One small downside of this 1016 // approach is that many unused `llvm.mlir.constant` would be emitted 1017 // at first place. 1018 SmallVector<int32_t> structIndices(indices.size(), 1019 LLVM::GEPOp::kDynamicIndex); 1020 1021 Type type = processType(inst->getType()); 1022 if (!type) 1023 return failure(); 1024 instMap[inst] = b.create<GEPOp>(loc, type, sourceElementType, basePtr, 1025 indices, structIndices); 1026 return success(); 1027 } 1028 case llvm::Instruction::InsertValue: { 1029 auto *ivInst = cast<llvm::InsertValueInst>(inst); 1030 Value inserted = processValue(ivInst->getInsertedValueOperand()); 1031 if (!inserted) 1032 return failure(); 1033 Value aggOperand = processValue(ivInst->getAggregateOperand()); 1034 if (!aggOperand) 1035 return failure(); 1036 1037 SmallVector<int32_t> idxValues; 1038 for (unsigned idx : ivInst->getIndices()) 1039 idxValues.push_back(static_cast<int32_t>(idx)); 1040 ArrayAttr indices = b.getI32ArrayAttr(idxValues); 1041 1042 instMap[inst] = b.create<InsertValueOp>(loc, aggOperand, inserted, indices); 1043 return success(); 1044 } 1045 case llvm::Instruction::ExtractValue: { 1046 auto *evInst = cast<llvm::ExtractValueInst>(inst); 1047 Value aggOperand = processValue(evInst->getAggregateOperand()); 1048 if (!aggOperand) 1049 return failure(); 1050 1051 Type type = processType(inst->getType()); 1052 if (!type) 1053 return failure(); 1054 1055 SmallVector<int32_t> idxValues; 1056 for (unsigned idx : evInst->getIndices()) 1057 idxValues.push_back(static_cast<int32_t>(idx)); 1058 ArrayAttr indices = b.getI32ArrayAttr(idxValues); 1059 1060 instMap[inst] = b.create<ExtractValueOp>(loc, type, aggOperand, indices); 1061 return success(); 1062 } 1063 case llvm::Instruction::ShuffleVector: { 1064 auto *svInst = cast<llvm::ShuffleVectorInst>(inst); 1065 Value vec1 = processValue(svInst->getOperand(0)); 1066 if (!vec1) 1067 return failure(); 1068 Value vec2 = processValue(svInst->getOperand(1)); 1069 if (!vec2) 1070 return failure(); 1071 1072 ArrayAttr mask = b.getI32ArrayAttr(svInst->getShuffleMask()); 1073 1074 instMap[inst] = b.create<ShuffleVectorOp>(loc, vec1, vec2, mask); 1075 return success(); 1076 } 1077 } 1078 } 1079 1080 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 1081 if (!f->hasPersonalityFn()) 1082 return nullptr; 1083 1084 llvm::Constant *pf = f->getPersonalityFn(); 1085 1086 // If it directly has a name, we can use it. 1087 if (pf->hasName()) 1088 return SymbolRefAttr::get(b.getContext(), pf->getName()); 1089 1090 // If it doesn't have a name, currently, only function pointers that are 1091 // bitcast to i8* are parsed. 1092 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 1093 if (ce->getOpcode() == llvm::Instruction::BitCast && 1094 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 1095 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 1096 return SymbolRefAttr::get(b.getContext(), func->getName()); 1097 } 1098 } 1099 return FlatSymbolRefAttr(); 1100 } 1101 1102 LogicalResult Importer::processFunction(llvm::Function *f) { 1103 blocks.clear(); 1104 instMap.clear(); 1105 unknownInstMap.clear(); 1106 1107 auto functionType = 1108 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 1109 if (!functionType) 1110 return failure(); 1111 1112 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 1113 LLVMFuncOp fop = 1114 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 1115 convertLinkageFromLLVM(f->getLinkage())); 1116 1117 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 1118 fop->setAttr(b.getStringAttr("personality"), personality); 1119 else if (f->hasPersonalityFn()) 1120 emitWarning(UnknownLoc::get(context), 1121 "could not deduce personality, skipping it"); 1122 1123 if (f->hasGC()) 1124 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 1125 1126 if (f->isDeclaration()) 1127 return success(); 1128 1129 // Eagerly create all blocks. 1130 SmallVector<Block *, 4> blockList; 1131 for (llvm::BasicBlock &bb : *f) { 1132 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 1133 blocks[&bb] = blockList.back(); 1134 } 1135 currentEntryBlock = blockList[0]; 1136 1137 // Add function arguments to the entry block. 1138 for (const auto &kv : llvm::enumerate(f->args())) { 1139 instMap[&kv.value()] = blockList[0]->addArgument( 1140 functionType.getParamType(kv.index()), fop.getLoc()); 1141 } 1142 1143 for (auto bbs : llvm::zip(*f, blockList)) { 1144 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 1145 return failure(); 1146 } 1147 1148 // Now that all instructions are guaranteed to have been visited, ensure 1149 // any unknown uses we encountered are remapped. 1150 for (auto &llvmAndUnknown : unknownInstMap) { 1151 assert(instMap.count(llvmAndUnknown.first)); 1152 Value newValue = instMap[llvmAndUnknown.first]; 1153 Value oldValue = llvmAndUnknown.second->getResult(0); 1154 oldValue.replaceAllUsesWith(newValue); 1155 llvmAndUnknown.second->erase(); 1156 } 1157 return success(); 1158 } 1159 1160 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 1161 b.setInsertionPointToStart(block); 1162 for (llvm::Instruction &inst : *bb) { 1163 if (failed(processInstruction(&inst))) 1164 return failure(); 1165 } 1166 return success(); 1167 } 1168 1169 OwningOpRef<ModuleOp> 1170 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 1171 MLIRContext *context) { 1172 context->loadDialect<LLVMDialect>(); 1173 context->loadDialect<DLTIDialect>(); 1174 OwningOpRef<ModuleOp> module(ModuleOp::create( 1175 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 1176 1177 DataLayoutSpecInterface dlSpec = 1178 translateDataLayout(llvmModule->getDataLayout(), context); 1179 if (!dlSpec) { 1180 emitError(UnknownLoc::get(context), "can't translate data layout"); 1181 return {}; 1182 } 1183 1184 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 1185 1186 Importer deserializer(context, module.get()); 1187 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 1188 if (!deserializer.processGlobal(&gv)) 1189 return {}; 1190 } 1191 for (llvm::Function &f : llvmModule->functions()) { 1192 if (failed(deserializer.processFunction(&f))) 1193 return {}; 1194 } 1195 1196 return module; 1197 } 1198 1199 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 1200 // LLVM dialect. 1201 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1202 MLIRContext *context) { 1203 llvm::SMDiagnostic err; 1204 llvm::LLVMContext llvmContext; 1205 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1206 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1207 if (!llvmModule) { 1208 std::string errStr; 1209 llvm::raw_string_ostream errStream(errStr); 1210 err.print(/*ProgName=*/"", errStream); 1211 emitError(UnknownLoc::get(context)) << errStream.str(); 1212 return {}; 1213 } 1214 return translateLLVMIRToModule(std::move(llvmModule), context); 1215 } 1216 1217 namespace mlir { 1218 void registerFromLLVMIRTranslation() { 1219 TranslateToMLIRRegistration fromLLVM( 1220 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1221 return ::translateLLVMIRToModule(sourceMgr, context); 1222 }); 1223 } 1224 } // namespace mlir 1225