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 = 436 b.create<GlobalOp>(UnknownLoc::get(context), type, gv->isConstant(), 437 convertLinkageFromLLVM(gv->getLinkage()), 438 gv->getName(), valueAttr, alignment); 439 440 if (gv->hasInitializer() && !valueAttr) { 441 Region &r = op.getInitializerRegion(); 442 currentEntryBlock = b.createBlock(&r); 443 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 444 Value v = processConstant(gv->getInitializer()); 445 if (!v) 446 return nullptr; 447 b.create<ReturnOp>(op.getLoc(), ArrayRef<Value>({v})); 448 } 449 if (gv->hasAtLeastLocalUnnamedAddr()) 450 op.setUnnamedAddrAttr(UnnamedAddrAttr::get( 451 context, convertUnnamedAddrFromLLVM(gv->getUnnamedAddr()))); 452 if (gv->hasSection()) 453 op.setSectionAttr(b.getStringAttr(gv->getSection())); 454 455 return globals[gv] = op; 456 } 457 458 Value Importer::processConstant(llvm::Constant *c) { 459 OpBuilder bEntry(currentEntryBlock, currentEntryBlock->begin()); 460 if (Attribute attr = getConstantAsAttr(c)) { 461 // These constants can be represented as attributes. 462 OpBuilder b(currentEntryBlock, currentEntryBlock->begin()); 463 Type type = processType(c->getType()); 464 if (!type) 465 return nullptr; 466 if (auto symbolRef = attr.dyn_cast<FlatSymbolRefAttr>()) 467 return instMap[c] = bEntry.create<AddressOfOp>(unknownLoc, type, 468 symbolRef.getValue()); 469 return instMap[c] = bEntry.create<ConstantOp>(unknownLoc, type, attr); 470 } 471 if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) { 472 Type type = processType(cn->getType()); 473 if (!type) 474 return nullptr; 475 return instMap[c] = bEntry.create<NullOp>(unknownLoc, type); 476 } 477 if (auto *gv = dyn_cast<llvm::GlobalVariable>(c)) 478 return bEntry.create<AddressOfOp>(UnknownLoc::get(context), 479 processGlobal(gv)); 480 481 if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) { 482 llvm::Instruction *i = ce->getAsInstruction(); 483 OpBuilder::InsertionGuard guard(b); 484 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 485 if (failed(processInstruction(i))) 486 return nullptr; 487 assert(instMap.count(i)); 488 489 // Remove this zombie LLVM instruction now, leaving us only with the MLIR 490 // op. 491 i->deleteValue(); 492 return instMap[c] = instMap[i]; 493 } 494 if (auto *ue = dyn_cast<llvm::UndefValue>(c)) { 495 Type type = processType(ue->getType()); 496 if (!type) 497 return nullptr; 498 return instMap[c] = bEntry.create<UndefOp>(UnknownLoc::get(context), type); 499 } 500 emitError(unknownLoc) << "unhandled constant: " << diag(*c); 501 return nullptr; 502 } 503 504 Value Importer::processValue(llvm::Value *value) { 505 auto it = instMap.find(value); 506 if (it != instMap.end()) 507 return it->second; 508 509 // We don't expect to see instructions in dominator order. If we haven't seen 510 // this instruction yet, create an unknown op and remap it later. 511 if (isa<llvm::Instruction>(value)) { 512 Type type = processType(value->getType()); 513 if (!type) 514 return nullptr; 515 unknownInstMap[value] = 516 b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"), 517 /*operands=*/{}, type); 518 return unknownInstMap[value]->getResult(0); 519 } 520 521 if (auto *c = dyn_cast<llvm::Constant>(value)) 522 return processConstant(c); 523 524 emitError(unknownLoc) << "unhandled value: " << diag(*value); 525 return nullptr; 526 } 527 528 /// Return the MLIR OperationName for the given LLVM opcode. 529 static StringRef lookupOperationNameFromOpcode(unsigned opcode) { 530 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered 531 // as in llvm/IR/Instructions.def to aid comprehension and spot missing 532 // instructions. 533 #define INST(llvm_n, mlir_n) \ 534 { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() } 535 static const DenseMap<unsigned, StringRef> opcMap = { 536 // Ret is handled specially. 537 // Br is handled specially. 538 // FIXME: switch 539 // FIXME: indirectbr 540 // FIXME: invoke 541 INST(Resume, Resume), 542 // FIXME: unreachable 543 // FIXME: cleanupret 544 // FIXME: catchret 545 // FIXME: catchswitch 546 // FIXME: callbr 547 // FIXME: fneg 548 INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub), 549 INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv), 550 INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem), 551 INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And), 552 INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load), 553 INST(Store, Store), 554 // Getelementptr is handled specially. 555 INST(Ret, Return), INST(Fence, Fence), 556 // FIXME: atomiccmpxchg 557 // FIXME: atomicrmw 558 INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt), 559 INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP), 560 INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt), 561 INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr), 562 INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast), 563 // FIXME: cleanuppad 564 // FIXME: catchpad 565 // ICmp is handled specially. 566 // FIXME: fcmp 567 // PHI is handled specially. 568 INST(Freeze, Freeze), INST(Call, Call), 569 // FIXME: select 570 // FIXME: vaarg 571 // FIXME: extractelement 572 // FIXME: insertelement 573 // FIXME: shufflevector 574 // FIXME: extractvalue 575 // FIXME: insertvalue 576 // FIXME: landingpad 577 }; 578 #undef INST 579 580 return opcMap.lookup(opcode); 581 } 582 583 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 584 switch (p) { 585 default: 586 llvm_unreachable("incorrect comparison predicate"); 587 case llvm::CmpInst::Predicate::ICMP_EQ: 588 return LLVM::ICmpPredicate::eq; 589 case llvm::CmpInst::Predicate::ICMP_NE: 590 return LLVM::ICmpPredicate::ne; 591 case llvm::CmpInst::Predicate::ICMP_SLT: 592 return LLVM::ICmpPredicate::slt; 593 case llvm::CmpInst::Predicate::ICMP_SLE: 594 return LLVM::ICmpPredicate::sle; 595 case llvm::CmpInst::Predicate::ICMP_SGT: 596 return LLVM::ICmpPredicate::sgt; 597 case llvm::CmpInst::Predicate::ICMP_SGE: 598 return LLVM::ICmpPredicate::sge; 599 case llvm::CmpInst::Predicate::ICMP_ULT: 600 return LLVM::ICmpPredicate::ult; 601 case llvm::CmpInst::Predicate::ICMP_ULE: 602 return LLVM::ICmpPredicate::ule; 603 case llvm::CmpInst::Predicate::ICMP_UGT: 604 return LLVM::ICmpPredicate::ugt; 605 case llvm::CmpInst::Predicate::ICMP_UGE: 606 return LLVM::ICmpPredicate::uge; 607 } 608 llvm_unreachable("incorrect comparison predicate"); 609 } 610 611 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 612 switch (ordering) { 613 case llvm::AtomicOrdering::NotAtomic: 614 return LLVM::AtomicOrdering::not_atomic; 615 case llvm::AtomicOrdering::Unordered: 616 return LLVM::AtomicOrdering::unordered; 617 case llvm::AtomicOrdering::Monotonic: 618 return LLVM::AtomicOrdering::monotonic; 619 case llvm::AtomicOrdering::Acquire: 620 return LLVM::AtomicOrdering::acquire; 621 case llvm::AtomicOrdering::Release: 622 return LLVM::AtomicOrdering::release; 623 case llvm::AtomicOrdering::AcquireRelease: 624 return LLVM::AtomicOrdering::acq_rel; 625 case llvm::AtomicOrdering::SequentiallyConsistent: 626 return LLVM::AtomicOrdering::seq_cst; 627 } 628 llvm_unreachable("incorrect atomic ordering"); 629 } 630 631 // `br` branches to `target`. Return the branch arguments to `br`, in the 632 // same order of the PHIs in `target`. 633 LogicalResult 634 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 635 SmallVectorImpl<Value> &blockArguments) { 636 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 637 auto *pn = cast<llvm::PHINode>(&*inst); 638 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 639 if (!value) 640 return failure(); 641 blockArguments.push_back(value); 642 } 643 return success(); 644 } 645 646 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 647 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 648 // flags and call / operand attributes are not supported. 649 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 650 Value &v = instMap[inst]; 651 assert(!v && "processInstruction must be called only once per instruction!"); 652 switch (inst->getOpcode()) { 653 default: 654 return emitError(loc) << "unknown instruction: " << diag(*inst); 655 case llvm::Instruction::Add: 656 case llvm::Instruction::FAdd: 657 case llvm::Instruction::Sub: 658 case llvm::Instruction::FSub: 659 case llvm::Instruction::Mul: 660 case llvm::Instruction::FMul: 661 case llvm::Instruction::UDiv: 662 case llvm::Instruction::SDiv: 663 case llvm::Instruction::FDiv: 664 case llvm::Instruction::URem: 665 case llvm::Instruction::SRem: 666 case llvm::Instruction::FRem: 667 case llvm::Instruction::Shl: 668 case llvm::Instruction::LShr: 669 case llvm::Instruction::AShr: 670 case llvm::Instruction::And: 671 case llvm::Instruction::Or: 672 case llvm::Instruction::Xor: 673 case llvm::Instruction::Alloca: 674 case llvm::Instruction::Load: 675 case llvm::Instruction::Store: 676 case llvm::Instruction::Ret: 677 case llvm::Instruction::Resume: 678 case llvm::Instruction::Trunc: 679 case llvm::Instruction::ZExt: 680 case llvm::Instruction::SExt: 681 case llvm::Instruction::FPToUI: 682 case llvm::Instruction::FPToSI: 683 case llvm::Instruction::UIToFP: 684 case llvm::Instruction::SIToFP: 685 case llvm::Instruction::FPTrunc: 686 case llvm::Instruction::FPExt: 687 case llvm::Instruction::PtrToInt: 688 case llvm::Instruction::IntToPtr: 689 case llvm::Instruction::AddrSpaceCast: 690 case llvm::Instruction::Freeze: 691 case llvm::Instruction::BitCast: { 692 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 693 SmallVector<Value, 4> ops; 694 ops.reserve(inst->getNumOperands()); 695 for (auto *op : inst->operand_values()) { 696 Value value = processValue(op); 697 if (!value) 698 return failure(); 699 ops.push_back(value); 700 } 701 state.addOperands(ops); 702 if (!inst->getType()->isVoidTy()) { 703 Type type = processType(inst->getType()); 704 if (!type) 705 return failure(); 706 state.addTypes(type); 707 } 708 Operation *op = b.create(state); 709 if (!inst->getType()->isVoidTy()) 710 v = op->getResult(0); 711 return success(); 712 } 713 case llvm::Instruction::ICmp: { 714 Value lhs = processValue(inst->getOperand(0)); 715 Value rhs = processValue(inst->getOperand(1)); 716 if (!lhs || !rhs) 717 return failure(); 718 v = b.create<ICmpOp>( 719 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 720 rhs); 721 return success(); 722 } 723 case llvm::Instruction::Br: { 724 auto *brInst = cast<llvm::BranchInst>(inst); 725 OperationState state(loc, 726 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 727 if (brInst->isConditional()) { 728 Value condition = processValue(brInst->getCondition()); 729 if (!condition) 730 return failure(); 731 state.addOperands(condition); 732 } 733 734 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 735 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 736 auto *succ = brInst->getSuccessor(i); 737 SmallVector<Value, 4> blockArguments; 738 if (failed(processBranchArgs(brInst, succ, blockArguments))) 739 return failure(); 740 state.addSuccessors(blocks[succ]); 741 state.addOperands(blockArguments); 742 operandSegmentSizes[i + 1] = blockArguments.size(); 743 } 744 745 if (brInst->isConditional()) { 746 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 747 b.getI32VectorAttr(operandSegmentSizes)); 748 } 749 750 b.create(state); 751 return success(); 752 } 753 case llvm::Instruction::PHI: { 754 Type type = processType(inst->getType()); 755 if (!type) 756 return failure(); 757 v = b.getInsertionBlock()->addArgument( 758 type, processDebugLoc(inst->getDebugLoc(), inst)); 759 return success(); 760 } 761 case llvm::Instruction::Call: { 762 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 763 SmallVector<Value, 4> ops; 764 ops.reserve(inst->getNumOperands()); 765 for (auto &op : ci->args()) { 766 Value arg = processValue(op.get()); 767 if (!arg) 768 return failure(); 769 ops.push_back(arg); 770 } 771 772 SmallVector<Type, 2> tys; 773 if (!ci->getType()->isVoidTy()) { 774 Type type = processType(inst->getType()); 775 if (!type) 776 return failure(); 777 tys.push_back(type); 778 } 779 Operation *op; 780 if (llvm::Function *callee = ci->getCalledFunction()) { 781 op = b.create<CallOp>( 782 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 783 } else { 784 Value calledValue = processValue(ci->getCalledOperand()); 785 if (!calledValue) 786 return failure(); 787 ops.insert(ops.begin(), calledValue); 788 op = b.create<CallOp>(loc, tys, ops); 789 } 790 if (!ci->getType()->isVoidTy()) 791 v = op->getResult(0); 792 return success(); 793 } 794 case llvm::Instruction::LandingPad: { 795 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 796 SmallVector<Value, 4> ops; 797 798 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 799 ops.push_back(processConstant(lpi->getClause(i))); 800 801 Type ty = processType(lpi->getType()); 802 if (!ty) 803 return failure(); 804 805 v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 806 return success(); 807 } 808 case llvm::Instruction::Invoke: { 809 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 810 811 SmallVector<Type, 2> tys; 812 if (!ii->getType()->isVoidTy()) 813 tys.push_back(processType(inst->getType())); 814 815 SmallVector<Value, 4> ops; 816 ops.reserve(inst->getNumOperands() + 1); 817 for (auto &op : ii->args()) 818 ops.push_back(processValue(op.get())); 819 820 SmallVector<Value, 4> normalArgs, unwindArgs; 821 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 822 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 823 824 Operation *op; 825 if (llvm::Function *callee = ii->getCalledFunction()) { 826 op = b.create<InvokeOp>( 827 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 828 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 829 unwindArgs); 830 } else { 831 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 832 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 833 normalArgs, blocks[ii->getUnwindDest()], 834 unwindArgs); 835 } 836 837 if (!ii->getType()->isVoidTy()) 838 v = op->getResult(0); 839 return success(); 840 } 841 case llvm::Instruction::Fence: { 842 StringRef syncscope; 843 SmallVector<StringRef, 4> ssNs; 844 llvm::LLVMContext &llvmContext = inst->getContext(); 845 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 846 llvmContext.getSyncScopeNames(ssNs); 847 int fenceSyncScopeID = fence->getSyncScopeID(); 848 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 849 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 850 syncscope = ssNs[i]; 851 break; 852 } 853 } 854 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 855 syncscope); 856 return success(); 857 } 858 case llvm::Instruction::GetElementPtr: { 859 // FIXME: Support inbounds GEPs. 860 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 861 SmallVector<Value, 4> ops; 862 for (auto *op : gep->operand_values()) { 863 Value value = processValue(op); 864 if (!value) 865 return failure(); 866 ops.push_back(value); 867 } 868 Type type = processType(inst->getType()); 869 if (!type) 870 return failure(); 871 v = b.create<GEPOp>(loc, type, ops[0], 872 llvm::makeArrayRef(ops).drop_front()); 873 return success(); 874 } 875 } 876 } 877 878 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 879 if (!f->hasPersonalityFn()) 880 return nullptr; 881 882 llvm::Constant *pf = f->getPersonalityFn(); 883 884 // If it directly has a name, we can use it. 885 if (pf->hasName()) 886 return SymbolRefAttr::get(b.getContext(), pf->getName()); 887 888 // If it doesn't have a name, currently, only function pointers that are 889 // bitcast to i8* are parsed. 890 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 891 if (ce->getOpcode() == llvm::Instruction::BitCast && 892 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 893 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 894 return SymbolRefAttr::get(b.getContext(), func->getName()); 895 } 896 } 897 return FlatSymbolRefAttr(); 898 } 899 900 LogicalResult Importer::processFunction(llvm::Function *f) { 901 blocks.clear(); 902 instMap.clear(); 903 unknownInstMap.clear(); 904 905 auto functionType = 906 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 907 if (!functionType) 908 return failure(); 909 910 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 911 LLVMFuncOp fop = 912 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 913 convertLinkageFromLLVM(f->getLinkage())); 914 915 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 916 fop->setAttr(b.getStringAttr("personality"), personality); 917 else if (f->hasPersonalityFn()) 918 emitWarning(UnknownLoc::get(context), 919 "could not deduce personality, skipping it"); 920 921 if (f->hasGC()) 922 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 923 924 if (f->isDeclaration()) 925 return success(); 926 927 // Eagerly create all blocks. 928 SmallVector<Block *, 4> blockList; 929 for (llvm::BasicBlock &bb : *f) { 930 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 931 blocks[&bb] = blockList.back(); 932 } 933 currentEntryBlock = blockList[0]; 934 935 // Add function arguments to the entry block. 936 for (const auto &kv : llvm::enumerate(f->args())) { 937 instMap[&kv.value()] = blockList[0]->addArgument( 938 functionType.getParamType(kv.index()), fop.getLoc()); 939 } 940 941 for (auto bbs : llvm::zip(*f, blockList)) { 942 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 943 return failure(); 944 } 945 946 // Now that all instructions are guaranteed to have been visited, ensure 947 // any unknown uses we encountered are remapped. 948 for (auto &llvmAndUnknown : unknownInstMap) { 949 assert(instMap.count(llvmAndUnknown.first)); 950 Value newValue = instMap[llvmAndUnknown.first]; 951 Value oldValue = llvmAndUnknown.second->getResult(0); 952 oldValue.replaceAllUsesWith(newValue); 953 llvmAndUnknown.second->erase(); 954 } 955 return success(); 956 } 957 958 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 959 b.setInsertionPointToStart(block); 960 for (llvm::Instruction &inst : *bb) { 961 if (failed(processInstruction(&inst))) 962 return failure(); 963 } 964 return success(); 965 } 966 967 OwningOpRef<ModuleOp> 968 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 969 MLIRContext *context) { 970 context->loadDialect<LLVMDialect>(); 971 context->loadDialect<DLTIDialect>(); 972 OwningOpRef<ModuleOp> module(ModuleOp::create( 973 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 974 975 DataLayoutSpecInterface dlSpec = 976 translateDataLayout(llvmModule->getDataLayout(), context); 977 if (!dlSpec) { 978 emitError(UnknownLoc::get(context), "can't translate data layout"); 979 return {}; 980 } 981 982 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 983 984 Importer deserializer(context, module.get()); 985 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 986 if (!deserializer.processGlobal(&gv)) 987 return {}; 988 } 989 for (llvm::Function &f : llvmModule->functions()) { 990 if (failed(deserializer.processFunction(&f))) 991 return {}; 992 } 993 994 return module; 995 } 996 997 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 998 // LLVM dialect. 999 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1000 MLIRContext *context) { 1001 llvm::SMDiagnostic err; 1002 llvm::LLVMContext llvmContext; 1003 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1004 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1005 if (!llvmModule) { 1006 std::string errStr; 1007 llvm::raw_string_ostream errStream(errStr); 1008 err.print(/*ProgName=*/"", errStream); 1009 emitError(UnknownLoc::get(context)) << errStream.str(); 1010 return {}; 1011 } 1012 return translateLLVMIRToModule(std::move(llvmModule), context); 1013 } 1014 1015 namespace mlir { 1016 void registerFromLLVMIRTranslation() { 1017 TranslateToMLIRRegistration fromLLVM( 1018 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1019 return ::translateLLVMIRToModule(sourceMgr, context); 1020 }); 1021 } 1022 } // namespace mlir 1023