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       // FIXME: extractelement
620       // FIXME: insertelement
621       // FIXME: shufflevector
622       // FIXME: extractvalue
623       // FIXME: insertvalue
624       // FIXME: landingpad
625   };
626 #undef INST
627 
628   return opcMap.lookup(opcode);
629 }
630 
631 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) {
632   switch (p) {
633   default:
634     llvm_unreachable("incorrect comparison predicate");
635   case llvm::CmpInst::Predicate::ICMP_EQ:
636     return LLVM::ICmpPredicate::eq;
637   case llvm::CmpInst::Predicate::ICMP_NE:
638     return LLVM::ICmpPredicate::ne;
639   case llvm::CmpInst::Predicate::ICMP_SLT:
640     return LLVM::ICmpPredicate::slt;
641   case llvm::CmpInst::Predicate::ICMP_SLE:
642     return LLVM::ICmpPredicate::sle;
643   case llvm::CmpInst::Predicate::ICMP_SGT:
644     return LLVM::ICmpPredicate::sgt;
645   case llvm::CmpInst::Predicate::ICMP_SGE:
646     return LLVM::ICmpPredicate::sge;
647   case llvm::CmpInst::Predicate::ICMP_ULT:
648     return LLVM::ICmpPredicate::ult;
649   case llvm::CmpInst::Predicate::ICMP_ULE:
650     return LLVM::ICmpPredicate::ule;
651   case llvm::CmpInst::Predicate::ICMP_UGT:
652     return LLVM::ICmpPredicate::ugt;
653   case llvm::CmpInst::Predicate::ICMP_UGE:
654     return LLVM::ICmpPredicate::uge;
655   }
656   llvm_unreachable("incorrect integer comparison predicate");
657 }
658 
659 static FCmpPredicate getFCmpPredicate(llvm::CmpInst::Predicate p) {
660   switch (p) {
661   default:
662     llvm_unreachable("incorrect comparison predicate");
663   case llvm::CmpInst::Predicate::FCMP_FALSE:
664     return LLVM::FCmpPredicate::_false;
665   case llvm::CmpInst::Predicate::FCMP_TRUE:
666     return LLVM::FCmpPredicate::_true;
667   case llvm::CmpInst::Predicate::FCMP_OEQ:
668     return LLVM::FCmpPredicate::oeq;
669   case llvm::CmpInst::Predicate::FCMP_ONE:
670     return LLVM::FCmpPredicate::one;
671   case llvm::CmpInst::Predicate::FCMP_OLT:
672     return LLVM::FCmpPredicate::olt;
673   case llvm::CmpInst::Predicate::FCMP_OLE:
674     return LLVM::FCmpPredicate::ole;
675   case llvm::CmpInst::Predicate::FCMP_OGT:
676     return LLVM::FCmpPredicate::ogt;
677   case llvm::CmpInst::Predicate::FCMP_OGE:
678     return LLVM::FCmpPredicate::oge;
679   case llvm::CmpInst::Predicate::FCMP_ORD:
680     return LLVM::FCmpPredicate::ord;
681   case llvm::CmpInst::Predicate::FCMP_ULT:
682     return LLVM::FCmpPredicate::ult;
683   case llvm::CmpInst::Predicate::FCMP_ULE:
684     return LLVM::FCmpPredicate::ule;
685   case llvm::CmpInst::Predicate::FCMP_UGT:
686     return LLVM::FCmpPredicate::ugt;
687   case llvm::CmpInst::Predicate::FCMP_UGE:
688     return LLVM::FCmpPredicate::uge;
689   case llvm::CmpInst::Predicate::FCMP_UNO:
690     return LLVM::FCmpPredicate::uno;
691   case llvm::CmpInst::Predicate::FCMP_UEQ:
692     return LLVM::FCmpPredicate::ueq;
693   case llvm::CmpInst::Predicate::FCMP_UNE:
694     return LLVM::FCmpPredicate::une;
695   }
696   llvm_unreachable("incorrect floating point comparison predicate");
697 }
698 
699 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) {
700   switch (ordering) {
701   case llvm::AtomicOrdering::NotAtomic:
702     return LLVM::AtomicOrdering::not_atomic;
703   case llvm::AtomicOrdering::Unordered:
704     return LLVM::AtomicOrdering::unordered;
705   case llvm::AtomicOrdering::Monotonic:
706     return LLVM::AtomicOrdering::monotonic;
707   case llvm::AtomicOrdering::Acquire:
708     return LLVM::AtomicOrdering::acquire;
709   case llvm::AtomicOrdering::Release:
710     return LLVM::AtomicOrdering::release;
711   case llvm::AtomicOrdering::AcquireRelease:
712     return LLVM::AtomicOrdering::acq_rel;
713   case llvm::AtomicOrdering::SequentiallyConsistent:
714     return LLVM::AtomicOrdering::seq_cst;
715   }
716   llvm_unreachable("incorrect atomic ordering");
717 }
718 
719 // `br` branches to `target`. Return the branch arguments to `br`, in the
720 // same order of the PHIs in `target`.
721 LogicalResult
722 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target,
723                             SmallVectorImpl<Value> &blockArguments) {
724   for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) {
725     auto *pn = cast<llvm::PHINode>(&*inst);
726     Value value = processValue(pn->getIncomingValueForBlock(br->getParent()));
727     if (!value)
728       return failure();
729     blockArguments.push_back(value);
730   }
731   return success();
732 }
733 
734 LogicalResult Importer::processInstruction(llvm::Instruction *inst) {
735   // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math
736   // flags and call / operand attributes are not supported.
737   Location loc = processDebugLoc(inst->getDebugLoc(), inst);
738   Value &v = instMap[inst];
739   assert(!v && "processInstruction must be called only once per instruction!");
740   switch (inst->getOpcode()) {
741   default:
742     return emitError(loc) << "unknown instruction: " << diag(*inst);
743   case llvm::Instruction::Add:
744   case llvm::Instruction::FAdd:
745   case llvm::Instruction::Sub:
746   case llvm::Instruction::FSub:
747   case llvm::Instruction::Mul:
748   case llvm::Instruction::FMul:
749   case llvm::Instruction::UDiv:
750   case llvm::Instruction::SDiv:
751   case llvm::Instruction::FDiv:
752   case llvm::Instruction::URem:
753   case llvm::Instruction::SRem:
754   case llvm::Instruction::FRem:
755   case llvm::Instruction::Shl:
756   case llvm::Instruction::LShr:
757   case llvm::Instruction::AShr:
758   case llvm::Instruction::And:
759   case llvm::Instruction::Or:
760   case llvm::Instruction::Xor:
761   case llvm::Instruction::Load:
762   case llvm::Instruction::Store:
763   case llvm::Instruction::Ret:
764   case llvm::Instruction::Resume:
765   case llvm::Instruction::Trunc:
766   case llvm::Instruction::ZExt:
767   case llvm::Instruction::SExt:
768   case llvm::Instruction::FPToUI:
769   case llvm::Instruction::FPToSI:
770   case llvm::Instruction::UIToFP:
771   case llvm::Instruction::SIToFP:
772   case llvm::Instruction::FPTrunc:
773   case llvm::Instruction::FPExt:
774   case llvm::Instruction::PtrToInt:
775   case llvm::Instruction::IntToPtr:
776   case llvm::Instruction::AddrSpaceCast:
777   case llvm::Instruction::Freeze:
778   case llvm::Instruction::BitCast: {
779     OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode()));
780     SmallVector<Value, 4> ops;
781     ops.reserve(inst->getNumOperands());
782     for (auto *op : inst->operand_values()) {
783       Value value = processValue(op);
784       if (!value)
785         return failure();
786       ops.push_back(value);
787     }
788     state.addOperands(ops);
789     if (!inst->getType()->isVoidTy()) {
790       Type type = processType(inst->getType());
791       if (!type)
792         return failure();
793       state.addTypes(type);
794     }
795     Operation *op = b.create(state);
796     if (!inst->getType()->isVoidTy())
797       v = op->getResult(0);
798     return success();
799   }
800   case llvm::Instruction::Alloca: {
801     Value size = processValue(inst->getOperand(0));
802     if (!size)
803       return failure();
804 
805     auto *allocaInst = cast<llvm::AllocaInst>(inst);
806     v = b.create<AllocaOp>(loc, processType(inst->getType()),
807                            processType(allocaInst->getAllocatedType()), size,
808                            allocaInst->getAlign().value());
809     return success();
810   }
811   case llvm::Instruction::ICmp: {
812     Value lhs = processValue(inst->getOperand(0));
813     Value rhs = processValue(inst->getOperand(1));
814     if (!lhs || !rhs)
815       return failure();
816     v = b.create<ICmpOp>(
817         loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs,
818         rhs);
819     return success();
820   }
821   case llvm::Instruction::FCmp: {
822     Value lhs = processValue(inst->getOperand(0));
823     Value rhs = processValue(inst->getOperand(1));
824     if (!lhs || !rhs)
825       return failure();
826     instMap[inst] = b.create<FCmpOp>(
827         loc, b.getI1Type(),
828         getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs);
829     return success();
830   }
831   case llvm::Instruction::Br: {
832     auto *brInst = cast<llvm::BranchInst>(inst);
833     OperationState state(loc,
834                          brInst->isConditional() ? "llvm.cond_br" : "llvm.br");
835     if (brInst->isConditional()) {
836       Value condition = processValue(brInst->getCondition());
837       if (!condition)
838         return failure();
839       state.addOperands(condition);
840     }
841 
842     std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0};
843     for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) {
844       auto *succ = brInst->getSuccessor(i);
845       SmallVector<Value, 4> blockArguments;
846       if (failed(processBranchArgs(brInst, succ, blockArguments)))
847         return failure();
848       state.addSuccessors(blocks[succ]);
849       state.addOperands(blockArguments);
850       operandSegmentSizes[i + 1] = blockArguments.size();
851     }
852 
853     if (brInst->isConditional()) {
854       state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(),
855                          b.getI32VectorAttr(operandSegmentSizes));
856     }
857 
858     b.create(state);
859     return success();
860   }
861   case llvm::Instruction::Switch: {
862     auto *swInst = cast<llvm::SwitchInst>(inst);
863     // Process the condition value.
864     Value condition = processValue(swInst->getCondition());
865     if (!condition)
866       return failure();
867 
868     SmallVector<Value> defaultBlockArgs;
869     // Process the default case.
870     llvm::BasicBlock *defaultBB = swInst->getDefaultDest();
871     if (failed(processBranchArgs(swInst, defaultBB, defaultBlockArgs)))
872       return failure();
873 
874     // Process the cases.
875     unsigned numCases = swInst->getNumCases();
876     SmallVector<SmallVector<Value>> caseOperands(numCases);
877     SmallVector<ValueRange> caseOperandRefs(numCases);
878     SmallVector<int32_t> caseValues(numCases);
879     SmallVector<Block *> caseBlocks(numCases);
880     for (const auto &en : llvm::enumerate(swInst->cases())) {
881       const llvm::SwitchInst::CaseHandle &caseHandle = en.value();
882       unsigned i = en.index();
883       llvm::BasicBlock *succBB = caseHandle.getCaseSuccessor();
884       if (failed(processBranchArgs(swInst, succBB, caseOperands[i])))
885         return failure();
886       caseOperandRefs[i] = caseOperands[i];
887       caseValues[i] = caseHandle.getCaseValue()->getSExtValue();
888       caseBlocks[i] = blocks[succBB];
889     }
890 
891     b.create<SwitchOp>(loc, condition, blocks[defaultBB], defaultBlockArgs,
892                        caseValues, caseBlocks, caseOperandRefs);
893     return success();
894   }
895   case llvm::Instruction::PHI: {
896     Type type = processType(inst->getType());
897     if (!type)
898       return failure();
899     v = b.getInsertionBlock()->addArgument(
900         type, processDebugLoc(inst->getDebugLoc(), inst));
901     return success();
902   }
903   case llvm::Instruction::Call: {
904     llvm::CallInst *ci = cast<llvm::CallInst>(inst);
905     SmallVector<Value, 4> ops;
906     ops.reserve(inst->getNumOperands());
907     for (auto &op : ci->args()) {
908       Value arg = processValue(op.get());
909       if (!arg)
910         return failure();
911       ops.push_back(arg);
912     }
913 
914     SmallVector<Type, 2> tys;
915     if (!ci->getType()->isVoidTy()) {
916       Type type = processType(inst->getType());
917       if (!type)
918         return failure();
919       tys.push_back(type);
920     }
921     Operation *op;
922     if (llvm::Function *callee = ci->getCalledFunction()) {
923       op = b.create<CallOp>(
924           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops);
925     } else {
926       Value calledValue = processValue(ci->getCalledOperand());
927       if (!calledValue)
928         return failure();
929       ops.insert(ops.begin(), calledValue);
930       op = b.create<CallOp>(loc, tys, ops);
931     }
932     if (!ci->getType()->isVoidTy())
933       v = op->getResult(0);
934     return success();
935   }
936   case llvm::Instruction::LandingPad: {
937     llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst);
938     SmallVector<Value, 4> ops;
939 
940     for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++)
941       ops.push_back(processConstant(lpi->getClause(i)));
942 
943     Type ty = processType(lpi->getType());
944     if (!ty)
945       return failure();
946 
947     v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops);
948     return success();
949   }
950   case llvm::Instruction::Invoke: {
951     llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst);
952 
953     SmallVector<Type, 2> tys;
954     if (!ii->getType()->isVoidTy())
955       tys.push_back(processType(inst->getType()));
956 
957     SmallVector<Value, 4> ops;
958     ops.reserve(inst->getNumOperands() + 1);
959     for (auto &op : ii->args())
960       ops.push_back(processValue(op.get()));
961 
962     SmallVector<Value, 4> normalArgs, unwindArgs;
963     (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs);
964     (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs);
965 
966     Operation *op;
967     if (llvm::Function *callee = ii->getCalledFunction()) {
968       op = b.create<InvokeOp>(
969           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops,
970           blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()],
971           unwindArgs);
972     } else {
973       ops.insert(ops.begin(), processValue(ii->getCalledOperand()));
974       op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()],
975                               normalArgs, blocks[ii->getUnwindDest()],
976                               unwindArgs);
977     }
978 
979     if (!ii->getType()->isVoidTy())
980       v = op->getResult(0);
981     return success();
982   }
983   case llvm::Instruction::Fence: {
984     StringRef syncscope;
985     SmallVector<StringRef, 4> ssNs;
986     llvm::LLVMContext &llvmContext = inst->getContext();
987     llvm::FenceInst *fence = cast<llvm::FenceInst>(inst);
988     llvmContext.getSyncScopeNames(ssNs);
989     int fenceSyncScopeID = fence->getSyncScopeID();
990     for (unsigned i = 0, e = ssNs.size(); i != e; i++) {
991       if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) {
992         syncscope = ssNs[i];
993         break;
994       }
995     }
996     b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()),
997                       syncscope);
998     return success();
999   }
1000   case llvm::Instruction::GetElementPtr: {
1001     // FIXME: Support inbounds GEPs.
1002     llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst);
1003     Value basePtr = processValue(gep->getOperand(0));
1004     SmallVector<int32_t> staticIndices;
1005     SmallVector<Value> dynamicIndices;
1006     Type sourceElementType = processType(gep->getSourceElementType());
1007     SmallVector<unsigned> staticIndexPositions;
1008     GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions);
1009 
1010     for (const auto &en :
1011          llvm::enumerate(llvm::drop_begin(gep->operand_values()))) {
1012       llvm::Value *operand = en.value();
1013       if (llvm::find(staticIndexPositions, en.index()) ==
1014           staticIndexPositions.end()) {
1015         staticIndices.push_back(GEPOp::kDynamicIndex);
1016         dynamicIndices.push_back(processValue(operand));
1017         if (!dynamicIndices.back())
1018           return failure();
1019       } else {
1020         auto *constantInt = cast<llvm::ConstantInt>(operand);
1021         staticIndices.push_back(
1022             static_cast<int32_t>(constantInt->getValue().getZExtValue()));
1023       }
1024     }
1025 
1026     Type type = processType(inst->getType());
1027     if (!type)
1028       return failure();
1029     v = b.create<GEPOp>(loc, type, sourceElementType, basePtr, dynamicIndices,
1030                         staticIndices);
1031     return success();
1032   }
1033   }
1034 }
1035 
1036 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) {
1037   if (!f->hasPersonalityFn())
1038     return nullptr;
1039 
1040   llvm::Constant *pf = f->getPersonalityFn();
1041 
1042   // If it directly has a name, we can use it.
1043   if (pf->hasName())
1044     return SymbolRefAttr::get(b.getContext(), pf->getName());
1045 
1046   // If it doesn't have a name, currently, only function pointers that are
1047   // bitcast to i8* are parsed.
1048   if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) {
1049     if (ce->getOpcode() == llvm::Instruction::BitCast &&
1050         ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) {
1051       if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0)))
1052         return SymbolRefAttr::get(b.getContext(), func->getName());
1053     }
1054   }
1055   return FlatSymbolRefAttr();
1056 }
1057 
1058 LogicalResult Importer::processFunction(llvm::Function *f) {
1059   blocks.clear();
1060   instMap.clear();
1061   unknownInstMap.clear();
1062 
1063   auto functionType =
1064       processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>();
1065   if (!functionType)
1066     return failure();
1067 
1068   b.setInsertionPoint(module.getBody(), getFuncInsertPt());
1069   LLVMFuncOp fop =
1070       b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType,
1071                            convertLinkageFromLLVM(f->getLinkage()));
1072 
1073   if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f))
1074     fop->setAttr(b.getStringAttr("personality"), personality);
1075   else if (f->hasPersonalityFn())
1076     emitWarning(UnknownLoc::get(context),
1077                 "could not deduce personality, skipping it");
1078 
1079   if (f->hasGC())
1080     fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC()));
1081 
1082   if (f->isDeclaration())
1083     return success();
1084 
1085   // Eagerly create all blocks.
1086   SmallVector<Block *, 4> blockList;
1087   for (llvm::BasicBlock &bb : *f) {
1088     blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end()));
1089     blocks[&bb] = blockList.back();
1090   }
1091   currentEntryBlock = blockList[0];
1092 
1093   // Add function arguments to the entry block.
1094   for (const auto &kv : llvm::enumerate(f->args())) {
1095     instMap[&kv.value()] = blockList[0]->addArgument(
1096         functionType.getParamType(kv.index()), fop.getLoc());
1097   }
1098 
1099   for (auto bbs : llvm::zip(*f, blockList)) {
1100     if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs))))
1101       return failure();
1102   }
1103 
1104   // Now that all instructions are guaranteed to have been visited, ensure
1105   // any unknown uses we encountered are remapped.
1106   for (auto &llvmAndUnknown : unknownInstMap) {
1107     assert(instMap.count(llvmAndUnknown.first));
1108     Value newValue = instMap[llvmAndUnknown.first];
1109     Value oldValue = llvmAndUnknown.second->getResult(0);
1110     oldValue.replaceAllUsesWith(newValue);
1111     llvmAndUnknown.second->erase();
1112   }
1113   return success();
1114 }
1115 
1116 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) {
1117   b.setInsertionPointToStart(block);
1118   for (llvm::Instruction &inst : *bb) {
1119     if (failed(processInstruction(&inst)))
1120       return failure();
1121   }
1122   return success();
1123 }
1124 
1125 OwningOpRef<ModuleOp>
1126 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule,
1127                               MLIRContext *context) {
1128   context->loadDialect<LLVMDialect>();
1129   context->loadDialect<DLTIDialect>();
1130   OwningOpRef<ModuleOp> module(ModuleOp::create(
1131       FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0)));
1132 
1133   DataLayoutSpecInterface dlSpec =
1134       translateDataLayout(llvmModule->getDataLayout(), context);
1135   if (!dlSpec) {
1136     emitError(UnknownLoc::get(context), "can't translate data layout");
1137     return {};
1138   }
1139 
1140   module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec);
1141 
1142   Importer deserializer(context, module.get());
1143   for (llvm::GlobalVariable &gv : llvmModule->globals()) {
1144     if (!deserializer.processGlobal(&gv))
1145       return {};
1146   }
1147   for (llvm::Function &f : llvmModule->functions()) {
1148     if (failed(deserializer.processFunction(&f)))
1149       return {};
1150   }
1151 
1152   return module;
1153 }
1154 
1155 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the
1156 // LLVM dialect.
1157 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr,
1158                                               MLIRContext *context) {
1159   llvm::SMDiagnostic err;
1160   llvm::LLVMContext llvmContext;
1161   std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR(
1162       *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext);
1163   if (!llvmModule) {
1164     std::string errStr;
1165     llvm::raw_string_ostream errStream(errStr);
1166     err.print(/*ProgName=*/"", errStream);
1167     emitError(UnknownLoc::get(context)) << errStream.str();
1168     return {};
1169   }
1170   return translateLLVMIRToModule(std::move(llvmModule), context);
1171 }
1172 
1173 namespace mlir {
1174 void registerFromLLVMIRTranslation() {
1175   TranslateToMLIRRegistration fromLLVM(
1176       "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) {
1177         return ::translateLLVMIRToModule(sourceMgr, context);
1178       });
1179 }
1180 } // namespace mlir
1181