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