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     SmallVector<int32_t> staticIndices;
1007     SmallVector<Value> dynamicIndices;
1008     Type sourceElementType = processType(gep->getSourceElementType());
1009     SmallVector<unsigned> staticIndexPositions;
1010     GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions);
1011 
1012     for (const auto &en :
1013          llvm::enumerate(llvm::drop_begin(gep->operand_values()))) {
1014       llvm::Value *operand = en.value();
1015       if (llvm::find(staticIndexPositions, en.index()) ==
1016           staticIndexPositions.end()) {
1017         staticIndices.push_back(GEPOp::kDynamicIndex);
1018         dynamicIndices.push_back(processValue(operand));
1019         if (!dynamicIndices.back())
1020           return failure();
1021       } else {
1022         auto *constantInt = cast<llvm::ConstantInt>(operand);
1023         staticIndices.push_back(
1024             static_cast<int32_t>(constantInt->getValue().getZExtValue()));
1025       }
1026     }
1027 
1028     Type type = processType(inst->getType());
1029     if (!type)
1030       return failure();
1031     instMap[inst] = b.create<GEPOp>(loc, type, sourceElementType, basePtr,
1032                                     dynamicIndices, staticIndices);
1033     return success();
1034   }
1035   case llvm::Instruction::InsertValue: {
1036     auto *ivInst = cast<llvm::InsertValueInst>(inst);
1037     Value inserted = processValue(ivInst->getInsertedValueOperand());
1038     if (!inserted)
1039       return failure();
1040     Value aggOperand = processValue(ivInst->getAggregateOperand());
1041     if (!aggOperand)
1042       return failure();
1043 
1044     SmallVector<int32_t> idxValues;
1045     for (unsigned idx : ivInst->getIndices())
1046       idxValues.push_back(static_cast<int32_t>(idx));
1047     ArrayAttr indices = b.getI32ArrayAttr(idxValues);
1048 
1049     instMap[inst] = b.create<InsertValueOp>(loc, aggOperand, inserted, indices);
1050     return success();
1051   }
1052   case llvm::Instruction::ExtractValue: {
1053     auto *evInst = cast<llvm::ExtractValueInst>(inst);
1054     Value aggOperand = processValue(evInst->getAggregateOperand());
1055     if (!aggOperand)
1056       return failure();
1057 
1058     Type type = processType(inst->getType());
1059     if (!type)
1060       return failure();
1061 
1062     SmallVector<int32_t> idxValues;
1063     for (unsigned idx : evInst->getIndices())
1064       idxValues.push_back(static_cast<int32_t>(idx));
1065     ArrayAttr indices = b.getI32ArrayAttr(idxValues);
1066 
1067     instMap[inst] = b.create<ExtractValueOp>(loc, type, aggOperand, indices);
1068     return success();
1069   }
1070   case llvm::Instruction::ShuffleVector: {
1071     auto *svInst = cast<llvm::ShuffleVectorInst>(inst);
1072     Value vec1 = processValue(svInst->getOperand(0));
1073     if (!vec1)
1074       return failure();
1075     Value vec2 = processValue(svInst->getOperand(1));
1076     if (!vec2)
1077       return failure();
1078 
1079     ArrayAttr mask = b.getI32ArrayAttr(svInst->getShuffleMask());
1080 
1081     instMap[inst] = b.create<ShuffleVectorOp>(loc, vec1, vec2, mask);
1082     return success();
1083   }
1084   }
1085 }
1086 
1087 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) {
1088   if (!f->hasPersonalityFn())
1089     return nullptr;
1090 
1091   llvm::Constant *pf = f->getPersonalityFn();
1092 
1093   // If it directly has a name, we can use it.
1094   if (pf->hasName())
1095     return SymbolRefAttr::get(b.getContext(), pf->getName());
1096 
1097   // If it doesn't have a name, currently, only function pointers that are
1098   // bitcast to i8* are parsed.
1099   if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) {
1100     if (ce->getOpcode() == llvm::Instruction::BitCast &&
1101         ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) {
1102       if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0)))
1103         return SymbolRefAttr::get(b.getContext(), func->getName());
1104     }
1105   }
1106   return FlatSymbolRefAttr();
1107 }
1108 
1109 LogicalResult Importer::processFunction(llvm::Function *f) {
1110   blocks.clear();
1111   instMap.clear();
1112   unknownInstMap.clear();
1113 
1114   auto functionType =
1115       processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>();
1116   if (!functionType)
1117     return failure();
1118 
1119   b.setInsertionPoint(module.getBody(), getFuncInsertPt());
1120   LLVMFuncOp fop =
1121       b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType,
1122                            convertLinkageFromLLVM(f->getLinkage()));
1123 
1124   if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f))
1125     fop->setAttr(b.getStringAttr("personality"), personality);
1126   else if (f->hasPersonalityFn())
1127     emitWarning(UnknownLoc::get(context),
1128                 "could not deduce personality, skipping it");
1129 
1130   if (f->hasGC())
1131     fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC()));
1132 
1133   if (f->isDeclaration())
1134     return success();
1135 
1136   // Eagerly create all blocks.
1137   SmallVector<Block *, 4> blockList;
1138   for (llvm::BasicBlock &bb : *f) {
1139     blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end()));
1140     blocks[&bb] = blockList.back();
1141   }
1142   currentEntryBlock = blockList[0];
1143 
1144   // Add function arguments to the entry block.
1145   for (const auto &kv : llvm::enumerate(f->args())) {
1146     instMap[&kv.value()] = blockList[0]->addArgument(
1147         functionType.getParamType(kv.index()), fop.getLoc());
1148   }
1149 
1150   for (auto bbs : llvm::zip(*f, blockList)) {
1151     if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs))))
1152       return failure();
1153   }
1154 
1155   // Now that all instructions are guaranteed to have been visited, ensure
1156   // any unknown uses we encountered are remapped.
1157   for (auto &llvmAndUnknown : unknownInstMap) {
1158     assert(instMap.count(llvmAndUnknown.first));
1159     Value newValue = instMap[llvmAndUnknown.first];
1160     Value oldValue = llvmAndUnknown.second->getResult(0);
1161     oldValue.replaceAllUsesWith(newValue);
1162     llvmAndUnknown.second->erase();
1163   }
1164   return success();
1165 }
1166 
1167 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) {
1168   b.setInsertionPointToStart(block);
1169   for (llvm::Instruction &inst : *bb) {
1170     if (failed(processInstruction(&inst)))
1171       return failure();
1172   }
1173   return success();
1174 }
1175 
1176 OwningOpRef<ModuleOp>
1177 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule,
1178                               MLIRContext *context) {
1179   context->loadDialect<LLVMDialect>();
1180   context->loadDialect<DLTIDialect>();
1181   OwningOpRef<ModuleOp> module(ModuleOp::create(
1182       FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0)));
1183 
1184   DataLayoutSpecInterface dlSpec =
1185       translateDataLayout(llvmModule->getDataLayout(), context);
1186   if (!dlSpec) {
1187     emitError(UnknownLoc::get(context), "can't translate data layout");
1188     return {};
1189   }
1190 
1191   module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec);
1192 
1193   Importer deserializer(context, module.get());
1194   for (llvm::GlobalVariable &gv : llvmModule->globals()) {
1195     if (!deserializer.processGlobal(&gv))
1196       return {};
1197   }
1198   for (llvm::Function &f : llvmModule->functions()) {
1199     if (failed(deserializer.processFunction(&f)))
1200       return {};
1201   }
1202 
1203   return module;
1204 }
1205 
1206 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the
1207 // LLVM dialect.
1208 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr,
1209                                               MLIRContext *context) {
1210   llvm::SMDiagnostic err;
1211   llvm::LLVMContext llvmContext;
1212   std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR(
1213       *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext);
1214   if (!llvmModule) {
1215     std::string errStr;
1216     llvm::raw_string_ostream errStream(errStr);
1217     err.print(/*ProgName=*/"", errStream);
1218     emitError(UnknownLoc::get(context)) << errStream.str();
1219     return {};
1220   }
1221   return translateLLVMIRToModule(std::move(llvmModule), context);
1222 }
1223 
1224 namespace mlir {
1225 void registerFromLLVMIRTranslation() {
1226   TranslateToMLIRRegistration fromLLVM(
1227       "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) {
1228         return ::translateLLVMIRToModule(sourceMgr, context);
1229       });
1230 }
1231 } // namespace mlir
1232