1 //===- ConvertFromLLVMIR.cpp - MLIR to LLVM IR conversion -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a translation between LLVM IR and the MLIR LLVM dialect.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "mlir/Target/LLVMIR/Import.h"
14 
15 #include "mlir/Dialect/DLTI/DLTI.h"
16 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
17 #include "mlir/IR/Builders.h"
18 #include "mlir/IR/BuiltinOps.h"
19 #include "mlir/IR/BuiltinTypes.h"
20 #include "mlir/IR/MLIRContext.h"
21 #include "mlir/Interfaces/DataLayoutInterfaces.h"
22 #include "mlir/Target/LLVMIR/TypeFromLLVM.h"
23 #include "mlir/Tools/mlir-translate/Translation.h"
24 
25 #include "llvm/ADT/StringSet.h"
26 #include "llvm/ADT/TypeSwitch.h"
27 #include "llvm/IR/Attributes.h"
28 #include "llvm/IR/Constants.h"
29 #include "llvm/IR/DerivedTypes.h"
30 #include "llvm/IR/Function.h"
31 #include "llvm/IR/InlineAsm.h"
32 #include "llvm/IR/Instructions.h"
33 #include "llvm/IR/Type.h"
34 #include "llvm/IRReader/IRReader.h"
35 #include "llvm/Support/Error.h"
36 #include "llvm/Support/SourceMgr.h"
37 
38 using namespace mlir;
39 using namespace mlir::LLVM;
40 
41 #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsFromLLVM.inc"
42 
43 // Utility to print an LLVM value as a string for passing to emitError().
44 // FIXME: Diagnostic should be able to natively handle types that have
45 // operator << (raw_ostream&) defined.
46 static std::string diag(llvm::Value &v) {
47   std::string s;
48   llvm::raw_string_ostream os(s);
49   os << v;
50   return os.str();
51 }
52 
53 /// Creates an attribute containing ABI and preferred alignment numbers parsed
54 /// a string. The string may be either "abi:preferred" or just "abi". In the
55 /// latter case, the prefrred alignment is considered equal to ABI alignment.
56 static DenseIntElementsAttr parseDataLayoutAlignment(MLIRContext &ctx,
57                                                      StringRef spec) {
58   auto i32 = IntegerType::get(&ctx, 32);
59 
60   StringRef abiString, preferredString;
61   std::tie(abiString, preferredString) = spec.split(':');
62   int abi, preferred;
63   if (abiString.getAsInteger(/*Radix=*/10, abi))
64     return nullptr;
65 
66   if (preferredString.empty())
67     preferred = abi;
68   else if (preferredString.getAsInteger(/*Radix=*/10, preferred))
69     return nullptr;
70 
71   return DenseIntElementsAttr::get(VectorType::get({2}, i32), {abi, preferred});
72 }
73 
74 /// Returns a supported MLIR floating point type of the given bit width or null
75 /// if the bit width is not supported.
76 static FloatType getDLFloatType(MLIRContext &ctx, int32_t bitwidth) {
77   switch (bitwidth) {
78   case 16:
79     return FloatType::getF16(&ctx);
80   case 32:
81     return FloatType::getF32(&ctx);
82   case 64:
83     return FloatType::getF64(&ctx);
84   case 80:
85     return FloatType::getF80(&ctx);
86   case 128:
87     return FloatType::getF128(&ctx);
88   default:
89     return nullptr;
90   }
91 }
92 
93 DataLayoutSpecInterface
94 mlir::translateDataLayout(const llvm::DataLayout &dataLayout,
95                           MLIRContext *context) {
96   assert(context && "expected MLIR context");
97   std::string layoutstr = dataLayout.getStringRepresentation();
98 
99   // Remaining unhandled default layout defaults
100   // e (little endian if not set)
101   // p[n]:64:64:64 (non zero address spaces have 64-bit properties)
102   std::string append =
103       "p:64:64:64-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f64:"
104       "64:64-f128:128:128-v64:64:64-v128:128:128-a:0:64";
105   if (layoutstr.empty())
106     layoutstr = append;
107   else
108     layoutstr = layoutstr + "-" + append;
109 
110   StringRef layout(layoutstr);
111 
112   SmallVector<DataLayoutEntryInterface> entries;
113   StringSet<> seen;
114   while (!layout.empty()) {
115     // Split at '-'.
116     std::pair<StringRef, StringRef> split = layout.split('-');
117     StringRef current;
118     std::tie(current, layout) = split;
119 
120     // Split at ':'.
121     StringRef kind, spec;
122     std::tie(kind, spec) = current.split(':');
123     if (seen.contains(kind))
124       continue;
125     seen.insert(kind);
126 
127     char symbol = kind.front();
128     StringRef parameter = kind.substr(1);
129 
130     if (symbol == 'i' || symbol == 'f') {
131       unsigned bitwidth;
132       if (parameter.getAsInteger(/*Radix=*/10, bitwidth))
133         return nullptr;
134       DenseIntElementsAttr params = parseDataLayoutAlignment(*context, spec);
135       if (!params)
136         return nullptr;
137       auto entry = DataLayoutEntryAttr::get(
138           symbol == 'i' ? static_cast<Type>(IntegerType::get(context, bitwidth))
139                         : getDLFloatType(*context, bitwidth),
140           params);
141       entries.emplace_back(entry);
142     } else if (symbol == 'e' || symbol == 'E') {
143       auto value = StringAttr::get(
144           context, symbol == 'e' ? DLTIDialect::kDataLayoutEndiannessLittle
145                                  : DLTIDialect::kDataLayoutEndiannessBig);
146       auto entry = DataLayoutEntryAttr::get(
147           StringAttr::get(context, DLTIDialect::kDataLayoutEndiannessKey),
148           value);
149       entries.emplace_back(entry);
150     }
151   }
152 
153   return DataLayoutSpecAttr::get(context, entries);
154 }
155 
156 // Handles importing globals and functions from an LLVM module.
157 namespace {
158 class Importer {
159 public:
160   Importer(MLIRContext *context, ModuleOp module)
161       : b(context), context(context), module(module),
162         unknownLoc(FileLineColLoc::get(context, "imported-bitcode", 0, 0)),
163         typeTranslator(*context) {
164     b.setInsertionPointToStart(module.getBody());
165   }
166 
167   /// Imports `f` into the current module.
168   LogicalResult processFunction(llvm::Function *f);
169 
170   /// Imports GV as a GlobalOp, creating it if it doesn't exist.
171   GlobalOp processGlobal(llvm::GlobalVariable *gv);
172 
173 private:
174   /// Returns personality of `f` as a FlatSymbolRefAttr.
175   FlatSymbolRefAttr getPersonalityAsAttr(llvm::Function *f);
176   /// Imports `bb` into `block`, which must be initially empty.
177   LogicalResult processBasicBlock(llvm::BasicBlock *bb, Block *block);
178   /// Imports `inst` and populates instMap[inst] with the imported Value.
179   LogicalResult processInstruction(llvm::Instruction *inst);
180   /// Creates an LLVM-compatible MLIR type for `type`.
181   Type processType(llvm::Type *type);
182   /// `value` is an SSA-use. Return the remapped version of `value` or a
183   /// placeholder that will be remapped later if this is an instruction that
184   /// has not yet been visited.
185   Value processValue(llvm::Value *value);
186   /// Create the most accurate Location possible using a llvm::DebugLoc and
187   /// possibly an llvm::Instruction to narrow the Location if debug information
188   /// is unavailable.
189   Location processDebugLoc(const llvm::DebugLoc &loc,
190                            llvm::Instruction *inst = nullptr);
191   /// `br` branches to `target`. Append the block arguments to attach to the
192   /// generated branch op to `blockArguments`. These should be in the same order
193   /// as the PHIs in `target`.
194   LogicalResult processBranchArgs(llvm::Instruction *br,
195                                   llvm::BasicBlock *target,
196                                   SmallVectorImpl<Value> &blockArguments);
197   /// Returns the builtin type equivalent to be used in attributes for the given
198   /// LLVM IR dialect type.
199   Type getStdTypeForAttr(Type type);
200   /// Return `value` as an attribute to attach to a GlobalOp.
201   Attribute getConstantAsAttr(llvm::Constant *value);
202   /// Return `c` as an MLIR Value. This could either be a ConstantOp, or
203   /// an expanded sequence of ops in the current function's entry block (for
204   /// ConstantExprs or ConstantGEPs).
205   Value processConstant(llvm::Constant *c);
206 
207   /// The current builder, pointing at where the next Instruction should be
208   /// generated.
209   OpBuilder b;
210   /// The current context.
211   MLIRContext *context;
212   /// The current module being created.
213   ModuleOp module;
214   /// The entry block of the current function being processed.
215   Block *currentEntryBlock = nullptr;
216 
217   /// Globals are inserted before the first function, if any.
218   Block::iterator getGlobalInsertPt() {
219     auto it = module.getBody()->begin();
220     auto endIt = module.getBody()->end();
221     while (it != endIt && !isa<LLVMFuncOp>(it))
222       ++it;
223     return it;
224   }
225 
226   /// Functions are always inserted before the module terminator.
227   Block::iterator getFuncInsertPt() {
228     return std::prev(module.getBody()->end());
229   }
230 
231   /// Remapped blocks, for the current function.
232   DenseMap<llvm::BasicBlock *, Block *> blocks;
233   /// Remapped values. These are function-local.
234   DenseMap<llvm::Value *, Value> instMap;
235   /// Instructions that had not been defined when first encountered as a use.
236   /// Maps to the dummy Operation that was created in processValue().
237   DenseMap<llvm::Value *, Operation *> unknownInstMap;
238   /// Uniquing map of GlobalVariables.
239   DenseMap<llvm::GlobalVariable *, GlobalOp> globals;
240   /// Cached FileLineColLoc::get("imported-bitcode", 0, 0).
241   Location unknownLoc;
242   /// The stateful type translator (contains named structs).
243   LLVM::TypeFromLLVMIRTranslator typeTranslator;
244 };
245 } // namespace
246 
247 Location Importer::processDebugLoc(const llvm::DebugLoc &loc,
248                                    llvm::Instruction *inst) {
249   if (!loc && inst) {
250     std::string s;
251     llvm::raw_string_ostream os(s);
252     os << "llvm-imported-inst-%";
253     inst->printAsOperand(os, /*PrintType=*/false);
254     return FileLineColLoc::get(context, os.str(), 0, 0);
255   }
256   if (!loc) {
257     return unknownLoc;
258   }
259   // FIXME: Obtain the filename from DILocationInfo.
260   return FileLineColLoc::get(context, "imported-bitcode", loc.getLine(),
261                              loc.getCol());
262 }
263 
264 Type Importer::processType(llvm::Type *type) {
265   if (Type result = typeTranslator.translateType(type))
266     return result;
267 
268   // FIXME: Diagnostic should be able to natively handle types that have
269   // operator<<(raw_ostream&) defined.
270   std::string s;
271   llvm::raw_string_ostream os(s);
272   os << *type;
273   emitError(unknownLoc) << "unhandled type: " << os.str();
274   return nullptr;
275 }
276 
277 // We only need integers, floats, doubles, and vectors and tensors thereof for
278 // attributes. Scalar and vector types are converted to the standard
279 // equivalents. Array types are converted to ranked tensors; nested array types
280 // are converted to multi-dimensional tensors or vectors, depending on the
281 // innermost type being a scalar or a vector.
282 Type Importer::getStdTypeForAttr(Type type) {
283   if (!type)
284     return nullptr;
285 
286   if (type.isa<IntegerType, FloatType>())
287     return type;
288 
289   // LLVM vectors can only contain scalars.
290   if (LLVM::isCompatibleVectorType(type)) {
291     auto numElements = LLVM::getVectorNumElements(type);
292     if (numElements.isScalable()) {
293       emitError(unknownLoc) << "scalable vectors not supported";
294       return nullptr;
295     }
296     Type elementType = getStdTypeForAttr(LLVM::getVectorElementType(type));
297     if (!elementType)
298       return nullptr;
299     return VectorType::get(numElements.getKnownMinValue(), elementType);
300   }
301 
302   // LLVM arrays can contain other arrays or vectors.
303   if (auto arrayType = type.dyn_cast<LLVMArrayType>()) {
304     // Recover the nested array shape.
305     SmallVector<int64_t, 4> shape;
306     shape.push_back(arrayType.getNumElements());
307     while (arrayType.getElementType().isa<LLVMArrayType>()) {
308       arrayType = arrayType.getElementType().cast<LLVMArrayType>();
309       shape.push_back(arrayType.getNumElements());
310     }
311 
312     // If the innermost type is a vector, use the multi-dimensional vector as
313     // attribute type.
314     if (LLVM::isCompatibleVectorType(arrayType.getElementType())) {
315       auto numElements = LLVM::getVectorNumElements(arrayType.getElementType());
316       if (numElements.isScalable()) {
317         emitError(unknownLoc) << "scalable vectors not supported";
318         return nullptr;
319       }
320       shape.push_back(numElements.getKnownMinValue());
321 
322       Type elementType = getStdTypeForAttr(
323           LLVM::getVectorElementType(arrayType.getElementType()));
324       if (!elementType)
325         return nullptr;
326       return VectorType::get(shape, elementType);
327     }
328 
329     // Otherwise use a tensor.
330     Type elementType = getStdTypeForAttr(arrayType.getElementType());
331     if (!elementType)
332       return nullptr;
333     return RankedTensorType::get(shape, elementType);
334   }
335 
336   return nullptr;
337 }
338 
339 // Get the given constant as an attribute. Not all constants can be represented
340 // as attributes.
341 Attribute Importer::getConstantAsAttr(llvm::Constant *value) {
342   if (auto *ci = dyn_cast<llvm::ConstantInt>(value))
343     return b.getIntegerAttr(
344         IntegerType::get(context, ci->getType()->getBitWidth()),
345         ci->getValue());
346   if (auto *c = dyn_cast<llvm::ConstantDataArray>(value))
347     if (c->isString())
348       return b.getStringAttr(c->getAsString());
349   if (auto *c = dyn_cast<llvm::ConstantFP>(value)) {
350     auto *type = c->getType();
351     FloatType floatTy;
352     if (type->isBFloatTy())
353       floatTy = FloatType::getBF16(context);
354     else
355       floatTy = getDLFloatType(*context, type->getScalarSizeInBits());
356     assert(floatTy && "unsupported floating point type");
357     return b.getFloatAttr(floatTy, c->getValueAPF());
358   }
359   if (auto *f = dyn_cast<llvm::Function>(value))
360     return SymbolRefAttr::get(b.getContext(), f->getName());
361 
362   // Convert constant data to a dense elements attribute.
363   if (auto *cd = dyn_cast<llvm::ConstantDataSequential>(value)) {
364     Type type = processType(cd->getElementType());
365     if (!type)
366       return nullptr;
367 
368     auto attrType = getStdTypeForAttr(processType(cd->getType()))
369                         .dyn_cast_or_null<ShapedType>();
370     if (!attrType)
371       return nullptr;
372 
373     if (type.isa<IntegerType>()) {
374       SmallVector<APInt, 8> values;
375       values.reserve(cd->getNumElements());
376       for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i)
377         values.push_back(cd->getElementAsAPInt(i));
378       return DenseElementsAttr::get(attrType, values);
379     }
380 
381     if (type.isa<Float32Type, Float64Type>()) {
382       SmallVector<APFloat, 8> values;
383       values.reserve(cd->getNumElements());
384       for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i)
385         values.push_back(cd->getElementAsAPFloat(i));
386       return DenseElementsAttr::get(attrType, values);
387     }
388 
389     return nullptr;
390   }
391 
392   // Unpack constant aggregates to create dense elements attribute whenever
393   // possible. Return nullptr (failure) otherwise.
394   if (isa<llvm::ConstantAggregate>(value)) {
395     auto outerType = getStdTypeForAttr(processType(value->getType()))
396                          .dyn_cast_or_null<ShapedType>();
397     if (!outerType)
398       return nullptr;
399 
400     SmallVector<Attribute, 8> values;
401     SmallVector<int64_t, 8> shape;
402 
403     for (unsigned i = 0, e = value->getNumOperands(); i < e; ++i) {
404       auto nested = getConstantAsAttr(value->getAggregateElement(i))
405                         .dyn_cast_or_null<DenseElementsAttr>();
406       if (!nested)
407         return nullptr;
408 
409       values.append(nested.value_begin<Attribute>(),
410                     nested.value_end<Attribute>());
411     }
412 
413     return DenseElementsAttr::get(outerType, values);
414   }
415 
416   return nullptr;
417 }
418 
419 GlobalOp Importer::processGlobal(llvm::GlobalVariable *gv) {
420   auto it = globals.find(gv);
421   if (it != globals.end())
422     return it->second;
423 
424   OpBuilder b(module.getBody(), getGlobalInsertPt());
425   Attribute valueAttr;
426   if (gv->hasInitializer())
427     valueAttr = getConstantAsAttr(gv->getInitializer());
428   Type type = processType(gv->getValueType());
429   if (!type)
430     return nullptr;
431 
432   uint64_t alignment = 0;
433   llvm::MaybeAlign maybeAlign = gv->getAlign();
434   if (maybeAlign.hasValue()) {
435     llvm::Align align = maybeAlign.getValue();
436     alignment = align.value();
437   }
438 
439   GlobalOp op = b.create<GlobalOp>(
440       UnknownLoc::get(context), type, gv->isConstant(),
441       convertLinkageFromLLVM(gv->getLinkage()), gv->getName(), valueAttr,
442       alignment, /*addr_space=*/gv->getAddressSpace(),
443       /*dso_local=*/gv->isDSOLocal(), /*thread_local=*/gv->isThreadLocal());
444 
445   if (gv->hasInitializer() && !valueAttr) {
446     Region &r = op.getInitializerRegion();
447     currentEntryBlock = b.createBlock(&r);
448     b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin());
449     Value v = processConstant(gv->getInitializer());
450     if (!v)
451       return nullptr;
452     b.create<ReturnOp>(op.getLoc(), ArrayRef<Value>({v}));
453   }
454   if (gv->hasAtLeastLocalUnnamedAddr())
455     op.setUnnamedAddrAttr(UnnamedAddrAttr::get(
456         context, convertUnnamedAddrFromLLVM(gv->getUnnamedAddr())));
457   if (gv->hasSection())
458     op.setSectionAttr(b.getStringAttr(gv->getSection()));
459 
460   return globals[gv] = op;
461 }
462 
463 Value Importer::processConstant(llvm::Constant *c) {
464   OpBuilder bEntry(currentEntryBlock, currentEntryBlock->begin());
465   if (Attribute attr = getConstantAsAttr(c)) {
466     // These constants can be represented as attributes.
467     OpBuilder b(currentEntryBlock, currentEntryBlock->begin());
468     Type type = processType(c->getType());
469     if (!type)
470       return nullptr;
471     if (auto symbolRef = attr.dyn_cast<FlatSymbolRefAttr>())
472       return bEntry.create<AddressOfOp>(unknownLoc, type, symbolRef.getValue());
473     return bEntry.create<ConstantOp>(unknownLoc, type, attr);
474   }
475   if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) {
476     Type type = processType(cn->getType());
477     if (!type)
478       return nullptr;
479     return bEntry.create<NullOp>(unknownLoc, type);
480   }
481   if (auto *gv = dyn_cast<llvm::GlobalVariable>(c))
482     return bEntry.create<AddressOfOp>(UnknownLoc::get(context),
483                                       processGlobal(gv));
484 
485   if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) {
486     llvm::Instruction *i = ce->getAsInstruction();
487     OpBuilder::InsertionGuard guard(b);
488     b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin());
489     if (failed(processInstruction(i)))
490       return nullptr;
491     assert(instMap.count(i));
492 
493     // If we don't remove entry of `i` here, it's totally possible that the
494     // next time llvm::ConstantExpr::getAsInstruction is called again, which
495     // always allocates a new Instruction, memory address of the newly
496     // created Instruction might be the same as `i`. Making processInstruction
497     // falsely believe that the new Instruction has been processed before
498     // and raised an assertion error.
499     Value value = instMap[i];
500     instMap.erase(i);
501     // Remove this zombie LLVM instruction now, leaving us only with the MLIR
502     // op.
503     i->deleteValue();
504     return value;
505   }
506   if (auto *ue = dyn_cast<llvm::UndefValue>(c)) {
507     Type type = processType(ue->getType());
508     if (!type)
509       return nullptr;
510     return bEntry.create<UndefOp>(UnknownLoc::get(context), type);
511   }
512 
513   if (isa<llvm::ConstantAggregate>(c) || isa<llvm::ConstantAggregateZero>(c)) {
514     unsigned numElements = c->getNumOperands();
515     std::function<llvm::Constant *(unsigned)> getElement =
516         [&](unsigned index) -> llvm::Constant * {
517       return c->getAggregateElement(index);
518     };
519     // llvm::ConstantAggregateZero doesn't take any operand
520     // so its getNumOperands is always zero.
521     if (auto *caz = dyn_cast<llvm::ConstantAggregateZero>(c)) {
522       numElements = caz->getElementCount().getFixedValue();
523       // We want to capture the pointer rather than reference
524       // to the pointer since the latter will become dangling upon
525       // exiting the scope.
526       getElement = [=](unsigned index) -> llvm::Constant * {
527         return caz->getElementValue(index);
528       };
529     }
530 
531     // Generate a llvm.undef as the root value first.
532     Type rootType = processType(c->getType());
533     if (!rootType)
534       return nullptr;
535     Value root = bEntry.create<UndefOp>(unknownLoc, rootType);
536     for (unsigned i = 0; i < numElements; ++i) {
537       llvm::Constant *element = getElement(i);
538       Value elementValue = processConstant(element);
539       if (!elementValue)
540         return nullptr;
541       ArrayAttr indexAttr = bEntry.getI32ArrayAttr({static_cast<int32_t>(i)});
542       root = bEntry.create<InsertValueOp>(UnknownLoc::get(context), rootType,
543                                           root, elementValue, indexAttr);
544     }
545     return root;
546   }
547 
548   emitError(unknownLoc) << "unhandled constant: " << diag(*c);
549   return nullptr;
550 }
551 
552 Value Importer::processValue(llvm::Value *value) {
553   auto it = instMap.find(value);
554   if (it != instMap.end())
555     return it->second;
556 
557   // We don't expect to see instructions in dominator order. If we haven't seen
558   // this instruction yet, create an unknown op and remap it later.
559   if (isa<llvm::Instruction>(value)) {
560     Type type = processType(value->getType());
561     if (!type)
562       return nullptr;
563     unknownInstMap[value] =
564         b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"),
565                  /*operands=*/{}, type);
566     return unknownInstMap[value]->getResult(0);
567   }
568 
569   if (auto *c = dyn_cast<llvm::Constant>(value))
570     return processConstant(c);
571 
572   emitError(unknownLoc) << "unhandled value: " << diag(*value);
573   return nullptr;
574 }
575 
576 /// Return the MLIR OperationName for the given LLVM opcode.
577 static StringRef lookupOperationNameFromOpcode(unsigned opcode) {
578 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered
579 // as in llvm/IR/Instructions.def to aid comprehension and spot missing
580 // instructions.
581 #define INST(llvm_n, mlir_n)                                                   \
582   { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() }
583   static const DenseMap<unsigned, StringRef> opcMap = {
584       // Ret is handled specially.
585       // Br is handled specially.
586       // Switch is handled specially.
587       // FIXME: indirectbr
588       // FIXME: invoke
589       INST(Resume, Resume),
590       // FIXME: unreachable
591       // FIXME: cleanupret
592       // FIXME: catchret
593       // FIXME: catchswitch
594       // FIXME: callbr
595       // FIXME: fneg
596       INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub),
597       INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv),
598       INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem),
599       INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And),
600       INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load),
601       INST(Store, Store),
602       // Getelementptr is handled specially.
603       INST(Ret, Return), INST(Fence, Fence),
604       // FIXME: atomiccmpxchg
605       // FIXME: atomicrmw
606       INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt),
607       INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP),
608       INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt),
609       INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr),
610       INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast),
611       // FIXME: cleanuppad
612       // FIXME: catchpad
613       // ICmp is handled specially.
614       // FCmp is handled specially.
615       // PHI is handled specially.
616       INST(Freeze, Freeze), INST(Call, Call),
617       // FIXME: select
618       // FIXME: vaarg
619       // FIXME: extractelement
620       // FIXME: insertelement
621       // ShuffleVector is handled specially.
622       // InsertValue is handled specially.
623       // ExtractValue is handled specially.
624       // FIXME: landingpad
625   };
626 #undef INST
627 
628   return opcMap.lookup(opcode);
629 }
630 
631 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) {
632   switch (p) {
633   default:
634     llvm_unreachable("incorrect comparison predicate");
635   case llvm::CmpInst::Predicate::ICMP_EQ:
636     return LLVM::ICmpPredicate::eq;
637   case llvm::CmpInst::Predicate::ICMP_NE:
638     return LLVM::ICmpPredicate::ne;
639   case llvm::CmpInst::Predicate::ICMP_SLT:
640     return LLVM::ICmpPredicate::slt;
641   case llvm::CmpInst::Predicate::ICMP_SLE:
642     return LLVM::ICmpPredicate::sle;
643   case llvm::CmpInst::Predicate::ICMP_SGT:
644     return LLVM::ICmpPredicate::sgt;
645   case llvm::CmpInst::Predicate::ICMP_SGE:
646     return LLVM::ICmpPredicate::sge;
647   case llvm::CmpInst::Predicate::ICMP_ULT:
648     return LLVM::ICmpPredicate::ult;
649   case llvm::CmpInst::Predicate::ICMP_ULE:
650     return LLVM::ICmpPredicate::ule;
651   case llvm::CmpInst::Predicate::ICMP_UGT:
652     return LLVM::ICmpPredicate::ugt;
653   case llvm::CmpInst::Predicate::ICMP_UGE:
654     return LLVM::ICmpPredicate::uge;
655   }
656   llvm_unreachable("incorrect integer comparison predicate");
657 }
658 
659 static FCmpPredicate getFCmpPredicate(llvm::CmpInst::Predicate p) {
660   switch (p) {
661   default:
662     llvm_unreachable("incorrect comparison predicate");
663   case llvm::CmpInst::Predicate::FCMP_FALSE:
664     return LLVM::FCmpPredicate::_false;
665   case llvm::CmpInst::Predicate::FCMP_TRUE:
666     return LLVM::FCmpPredicate::_true;
667   case llvm::CmpInst::Predicate::FCMP_OEQ:
668     return LLVM::FCmpPredicate::oeq;
669   case llvm::CmpInst::Predicate::FCMP_ONE:
670     return LLVM::FCmpPredicate::one;
671   case llvm::CmpInst::Predicate::FCMP_OLT:
672     return LLVM::FCmpPredicate::olt;
673   case llvm::CmpInst::Predicate::FCMP_OLE:
674     return LLVM::FCmpPredicate::ole;
675   case llvm::CmpInst::Predicate::FCMP_OGT:
676     return LLVM::FCmpPredicate::ogt;
677   case llvm::CmpInst::Predicate::FCMP_OGE:
678     return LLVM::FCmpPredicate::oge;
679   case llvm::CmpInst::Predicate::FCMP_ORD:
680     return LLVM::FCmpPredicate::ord;
681   case llvm::CmpInst::Predicate::FCMP_ULT:
682     return LLVM::FCmpPredicate::ult;
683   case llvm::CmpInst::Predicate::FCMP_ULE:
684     return LLVM::FCmpPredicate::ule;
685   case llvm::CmpInst::Predicate::FCMP_UGT:
686     return LLVM::FCmpPredicate::ugt;
687   case llvm::CmpInst::Predicate::FCMP_UGE:
688     return LLVM::FCmpPredicate::uge;
689   case llvm::CmpInst::Predicate::FCMP_UNO:
690     return LLVM::FCmpPredicate::uno;
691   case llvm::CmpInst::Predicate::FCMP_UEQ:
692     return LLVM::FCmpPredicate::ueq;
693   case llvm::CmpInst::Predicate::FCMP_UNE:
694     return LLVM::FCmpPredicate::une;
695   }
696   llvm_unreachable("incorrect floating point comparison predicate");
697 }
698 
699 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) {
700   switch (ordering) {
701   case llvm::AtomicOrdering::NotAtomic:
702     return LLVM::AtomicOrdering::not_atomic;
703   case llvm::AtomicOrdering::Unordered:
704     return LLVM::AtomicOrdering::unordered;
705   case llvm::AtomicOrdering::Monotonic:
706     return LLVM::AtomicOrdering::monotonic;
707   case llvm::AtomicOrdering::Acquire:
708     return LLVM::AtomicOrdering::acquire;
709   case llvm::AtomicOrdering::Release:
710     return LLVM::AtomicOrdering::release;
711   case llvm::AtomicOrdering::AcquireRelease:
712     return LLVM::AtomicOrdering::acq_rel;
713   case llvm::AtomicOrdering::SequentiallyConsistent:
714     return LLVM::AtomicOrdering::seq_cst;
715   }
716   llvm_unreachable("incorrect atomic ordering");
717 }
718 
719 // `br` branches to `target`. Return the branch arguments to `br`, in the
720 // same order of the PHIs in `target`.
721 LogicalResult
722 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target,
723                             SmallVectorImpl<Value> &blockArguments) {
724   for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) {
725     auto *pn = cast<llvm::PHINode>(&*inst);
726     Value value = processValue(pn->getIncomingValueForBlock(br->getParent()));
727     if (!value)
728       return failure();
729     blockArguments.push_back(value);
730   }
731   return success();
732 }
733 
734 LogicalResult Importer::processInstruction(llvm::Instruction *inst) {
735   // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math
736   // flags and call / operand attributes are not supported.
737   Location loc = processDebugLoc(inst->getDebugLoc(), inst);
738   assert(!instMap.count(inst) &&
739          "processInstruction must be called only once per instruction!");
740   switch (inst->getOpcode()) {
741   default:
742     return emitError(loc) << "unknown instruction: " << diag(*inst);
743   case llvm::Instruction::Add:
744   case llvm::Instruction::FAdd:
745   case llvm::Instruction::Sub:
746   case llvm::Instruction::FSub:
747   case llvm::Instruction::Mul:
748   case llvm::Instruction::FMul:
749   case llvm::Instruction::UDiv:
750   case llvm::Instruction::SDiv:
751   case llvm::Instruction::FDiv:
752   case llvm::Instruction::URem:
753   case llvm::Instruction::SRem:
754   case llvm::Instruction::FRem:
755   case llvm::Instruction::Shl:
756   case llvm::Instruction::LShr:
757   case llvm::Instruction::AShr:
758   case llvm::Instruction::And:
759   case llvm::Instruction::Or:
760   case llvm::Instruction::Xor:
761   case llvm::Instruction::Load:
762   case llvm::Instruction::Store:
763   case llvm::Instruction::Ret:
764   case llvm::Instruction::Resume:
765   case llvm::Instruction::Trunc:
766   case llvm::Instruction::ZExt:
767   case llvm::Instruction::SExt:
768   case llvm::Instruction::FPToUI:
769   case llvm::Instruction::FPToSI:
770   case llvm::Instruction::UIToFP:
771   case llvm::Instruction::SIToFP:
772   case llvm::Instruction::FPTrunc:
773   case llvm::Instruction::FPExt:
774   case llvm::Instruction::PtrToInt:
775   case llvm::Instruction::IntToPtr:
776   case llvm::Instruction::AddrSpaceCast:
777   case llvm::Instruction::Freeze:
778   case llvm::Instruction::BitCast: {
779     OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode()));
780     SmallVector<Value, 4> ops;
781     ops.reserve(inst->getNumOperands());
782     for (auto *op : inst->operand_values()) {
783       Value value = processValue(op);
784       if (!value)
785         return failure();
786       ops.push_back(value);
787     }
788     state.addOperands(ops);
789     if (!inst->getType()->isVoidTy()) {
790       Type type = processType(inst->getType());
791       if (!type)
792         return failure();
793       state.addTypes(type);
794     }
795     Operation *op = b.create(state);
796     if (!inst->getType()->isVoidTy())
797       instMap[inst] = op->getResult(0);
798     return success();
799   }
800   case llvm::Instruction::Alloca: {
801     Value size = processValue(inst->getOperand(0));
802     if (!size)
803       return failure();
804 
805     auto *allocaInst = cast<llvm::AllocaInst>(inst);
806     instMap[inst] =
807         b.create<AllocaOp>(loc, processType(inst->getType()),
808                            processType(allocaInst->getAllocatedType()), size,
809                            allocaInst->getAlign().value());
810     return success();
811   }
812   case llvm::Instruction::ICmp: {
813     Value lhs = processValue(inst->getOperand(0));
814     Value rhs = processValue(inst->getOperand(1));
815     if (!lhs || !rhs)
816       return failure();
817     instMap[inst] = b.create<ICmpOp>(
818         loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs,
819         rhs);
820     return success();
821   }
822   case llvm::Instruction::FCmp: {
823     Value lhs = processValue(inst->getOperand(0));
824     Value rhs = processValue(inst->getOperand(1));
825     if (!lhs || !rhs)
826       return failure();
827     instMap[inst] = b.create<FCmpOp>(
828         loc, b.getI1Type(),
829         getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs);
830     return success();
831   }
832   case llvm::Instruction::Br: {
833     auto *brInst = cast<llvm::BranchInst>(inst);
834     OperationState state(loc,
835                          brInst->isConditional() ? "llvm.cond_br" : "llvm.br");
836     if (brInst->isConditional()) {
837       Value condition = processValue(brInst->getCondition());
838       if (!condition)
839         return failure();
840       state.addOperands(condition);
841     }
842 
843     std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0};
844     for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) {
845       auto *succ = brInst->getSuccessor(i);
846       SmallVector<Value, 4> blockArguments;
847       if (failed(processBranchArgs(brInst, succ, blockArguments)))
848         return failure();
849       state.addSuccessors(blocks[succ]);
850       state.addOperands(blockArguments);
851       operandSegmentSizes[i + 1] = blockArguments.size();
852     }
853 
854     if (brInst->isConditional()) {
855       state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(),
856                          b.getI32VectorAttr(operandSegmentSizes));
857     }
858 
859     b.create(state);
860     return success();
861   }
862   case llvm::Instruction::Switch: {
863     auto *swInst = cast<llvm::SwitchInst>(inst);
864     // Process the condition value.
865     Value condition = processValue(swInst->getCondition());
866     if (!condition)
867       return failure();
868 
869     SmallVector<Value> defaultBlockArgs;
870     // Process the default case.
871     llvm::BasicBlock *defaultBB = swInst->getDefaultDest();
872     if (failed(processBranchArgs(swInst, defaultBB, defaultBlockArgs)))
873       return failure();
874 
875     // Process the cases.
876     unsigned numCases = swInst->getNumCases();
877     SmallVector<SmallVector<Value>> caseOperands(numCases);
878     SmallVector<ValueRange> caseOperandRefs(numCases);
879     SmallVector<int32_t> caseValues(numCases);
880     SmallVector<Block *> caseBlocks(numCases);
881     for (const auto &en : llvm::enumerate(swInst->cases())) {
882       const llvm::SwitchInst::CaseHandle &caseHandle = en.value();
883       unsigned i = en.index();
884       llvm::BasicBlock *succBB = caseHandle.getCaseSuccessor();
885       if (failed(processBranchArgs(swInst, succBB, caseOperands[i])))
886         return failure();
887       caseOperandRefs[i] = caseOperands[i];
888       caseValues[i] = caseHandle.getCaseValue()->getSExtValue();
889       caseBlocks[i] = blocks[succBB];
890     }
891 
892     b.create<SwitchOp>(loc, condition, blocks[defaultBB], defaultBlockArgs,
893                        caseValues, caseBlocks, caseOperandRefs);
894     return success();
895   }
896   case llvm::Instruction::PHI: {
897     Type type = processType(inst->getType());
898     if (!type)
899       return failure();
900     instMap[inst] = b.getInsertionBlock()->addArgument(
901         type, processDebugLoc(inst->getDebugLoc(), inst));
902     return success();
903   }
904   case llvm::Instruction::Call: {
905     llvm::CallInst *ci = cast<llvm::CallInst>(inst);
906     SmallVector<Value, 4> ops;
907     ops.reserve(inst->getNumOperands());
908     for (auto &op : ci->args()) {
909       Value arg = processValue(op.get());
910       if (!arg)
911         return failure();
912       ops.push_back(arg);
913     }
914 
915     SmallVector<Type, 2> tys;
916     if (!ci->getType()->isVoidTy()) {
917       Type type = processType(inst->getType());
918       if (!type)
919         return failure();
920       tys.push_back(type);
921     }
922     Operation *op;
923     if (llvm::Function *callee = ci->getCalledFunction()) {
924       op = b.create<CallOp>(
925           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops);
926     } else {
927       Value calledValue = processValue(ci->getCalledOperand());
928       if (!calledValue)
929         return failure();
930       ops.insert(ops.begin(), calledValue);
931       op = b.create<CallOp>(loc, tys, ops);
932     }
933     if (!ci->getType()->isVoidTy())
934       instMap[inst] = op->getResult(0);
935     return success();
936   }
937   case llvm::Instruction::LandingPad: {
938     llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst);
939     SmallVector<Value, 4> ops;
940 
941     for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++)
942       ops.push_back(processConstant(lpi->getClause(i)));
943 
944     Type ty = processType(lpi->getType());
945     if (!ty)
946       return failure();
947 
948     instMap[inst] = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops);
949     return success();
950   }
951   case llvm::Instruction::Invoke: {
952     llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst);
953 
954     SmallVector<Type, 2> tys;
955     if (!ii->getType()->isVoidTy())
956       tys.push_back(processType(inst->getType()));
957 
958     SmallVector<Value, 4> ops;
959     ops.reserve(inst->getNumOperands() + 1);
960     for (auto &op : ii->args())
961       ops.push_back(processValue(op.get()));
962 
963     SmallVector<Value, 4> normalArgs, unwindArgs;
964     (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs);
965     (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs);
966 
967     Operation *op;
968     if (llvm::Function *callee = ii->getCalledFunction()) {
969       op = b.create<InvokeOp>(
970           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops,
971           blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()],
972           unwindArgs);
973     } else {
974       ops.insert(ops.begin(), processValue(ii->getCalledOperand()));
975       op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()],
976                               normalArgs, blocks[ii->getUnwindDest()],
977                               unwindArgs);
978     }
979 
980     if (!ii->getType()->isVoidTy())
981       instMap[inst] = op->getResult(0);
982     return success();
983   }
984   case llvm::Instruction::Fence: {
985     StringRef syncscope;
986     SmallVector<StringRef, 4> ssNs;
987     llvm::LLVMContext &llvmContext = inst->getContext();
988     llvm::FenceInst *fence = cast<llvm::FenceInst>(inst);
989     llvmContext.getSyncScopeNames(ssNs);
990     int fenceSyncScopeID = fence->getSyncScopeID();
991     for (unsigned i = 0, e = ssNs.size(); i != e; i++) {
992       if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) {
993         syncscope = ssNs[i];
994         break;
995       }
996     }
997     b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()),
998                       syncscope);
999     return success();
1000   }
1001   case llvm::Instruction::GetElementPtr: {
1002     // FIXME: Support inbounds GEPs.
1003     llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst);
1004     Value basePtr = processValue(gep->getOperand(0));
1005     SmallVector<int32_t> staticIndices;
1006     SmallVector<Value> dynamicIndices;
1007     Type sourceElementType = processType(gep->getSourceElementType());
1008     SmallVector<unsigned> staticIndexPositions;
1009     GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions);
1010 
1011     for (const auto &en :
1012          llvm::enumerate(llvm::drop_begin(gep->operand_values()))) {
1013       llvm::Value *operand = en.value();
1014       if (llvm::find(staticIndexPositions, en.index()) ==
1015           staticIndexPositions.end()) {
1016         staticIndices.push_back(GEPOp::kDynamicIndex);
1017         dynamicIndices.push_back(processValue(operand));
1018         if (!dynamicIndices.back())
1019           return failure();
1020       } else {
1021         auto *constantInt = cast<llvm::ConstantInt>(operand);
1022         staticIndices.push_back(
1023             static_cast<int32_t>(constantInt->getValue().getZExtValue()));
1024       }
1025     }
1026 
1027     Type type = processType(inst->getType());
1028     if (!type)
1029       return failure();
1030     instMap[inst] = b.create<GEPOp>(loc, type, sourceElementType, basePtr,
1031                                     dynamicIndices, staticIndices);
1032     return success();
1033   }
1034   case llvm::Instruction::InsertValue: {
1035     auto *ivInst = cast<llvm::InsertValueInst>(inst);
1036     Value inserted = processValue(ivInst->getInsertedValueOperand());
1037     if (!inserted)
1038       return failure();
1039     Value aggOperand = processValue(ivInst->getAggregateOperand());
1040     if (!aggOperand)
1041       return failure();
1042 
1043     SmallVector<int32_t> idxValues;
1044     for (unsigned idx : ivInst->getIndices())
1045       idxValues.push_back(static_cast<int32_t>(idx));
1046     ArrayAttr indices = b.getI32ArrayAttr(idxValues);
1047 
1048     instMap[inst] = b.create<InsertValueOp>(loc, aggOperand, inserted, indices);
1049     return success();
1050   }
1051   case llvm::Instruction::ExtractValue: {
1052     auto *evInst = cast<llvm::ExtractValueInst>(inst);
1053     Value aggOperand = processValue(evInst->getAggregateOperand());
1054     if (!aggOperand)
1055       return failure();
1056 
1057     Type type = processType(inst->getType());
1058     if (!type)
1059       return failure();
1060 
1061     SmallVector<int32_t> idxValues;
1062     for (unsigned idx : evInst->getIndices())
1063       idxValues.push_back(static_cast<int32_t>(idx));
1064     ArrayAttr indices = b.getI32ArrayAttr(idxValues);
1065 
1066     instMap[inst] = b.create<ExtractValueOp>(loc, type, aggOperand, indices);
1067     return success();
1068   }
1069   case llvm::Instruction::ShuffleVector: {
1070     auto *svInst = cast<llvm::ShuffleVectorInst>(inst);
1071     Value vec1 = processValue(svInst->getOperand(0));
1072     if (!vec1)
1073       return failure();
1074     Value vec2 = processValue(svInst->getOperand(1));
1075     if (!vec2)
1076       return failure();
1077 
1078     ArrayAttr mask = b.getI32ArrayAttr(svInst->getShuffleMask());
1079 
1080     instMap[inst] = b.create<ShuffleVectorOp>(loc, vec1, vec2, mask);
1081     return success();
1082   }
1083   }
1084 }
1085 
1086 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) {
1087   if (!f->hasPersonalityFn())
1088     return nullptr;
1089 
1090   llvm::Constant *pf = f->getPersonalityFn();
1091 
1092   // If it directly has a name, we can use it.
1093   if (pf->hasName())
1094     return SymbolRefAttr::get(b.getContext(), pf->getName());
1095 
1096   // If it doesn't have a name, currently, only function pointers that are
1097   // bitcast to i8* are parsed.
1098   if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) {
1099     if (ce->getOpcode() == llvm::Instruction::BitCast &&
1100         ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) {
1101       if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0)))
1102         return SymbolRefAttr::get(b.getContext(), func->getName());
1103     }
1104   }
1105   return FlatSymbolRefAttr();
1106 }
1107 
1108 LogicalResult Importer::processFunction(llvm::Function *f) {
1109   blocks.clear();
1110   instMap.clear();
1111   unknownInstMap.clear();
1112 
1113   auto functionType =
1114       processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>();
1115   if (!functionType)
1116     return failure();
1117 
1118   b.setInsertionPoint(module.getBody(), getFuncInsertPt());
1119   LLVMFuncOp fop =
1120       b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType,
1121                            convertLinkageFromLLVM(f->getLinkage()));
1122 
1123   if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f))
1124     fop->setAttr(b.getStringAttr("personality"), personality);
1125   else if (f->hasPersonalityFn())
1126     emitWarning(UnknownLoc::get(context),
1127                 "could not deduce personality, skipping it");
1128 
1129   if (f->hasGC())
1130     fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC()));
1131 
1132   if (f->isDeclaration())
1133     return success();
1134 
1135   // Eagerly create all blocks.
1136   SmallVector<Block *, 4> blockList;
1137   for (llvm::BasicBlock &bb : *f) {
1138     blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end()));
1139     blocks[&bb] = blockList.back();
1140   }
1141   currentEntryBlock = blockList[0];
1142 
1143   // Add function arguments to the entry block.
1144   for (const auto &kv : llvm::enumerate(f->args())) {
1145     instMap[&kv.value()] = blockList[0]->addArgument(
1146         functionType.getParamType(kv.index()), fop.getLoc());
1147   }
1148 
1149   for (auto bbs : llvm::zip(*f, blockList)) {
1150     if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs))))
1151       return failure();
1152   }
1153 
1154   // Now that all instructions are guaranteed to have been visited, ensure
1155   // any unknown uses we encountered are remapped.
1156   for (auto &llvmAndUnknown : unknownInstMap) {
1157     assert(instMap.count(llvmAndUnknown.first));
1158     Value newValue = instMap[llvmAndUnknown.first];
1159     Value oldValue = llvmAndUnknown.second->getResult(0);
1160     oldValue.replaceAllUsesWith(newValue);
1161     llvmAndUnknown.second->erase();
1162   }
1163   return success();
1164 }
1165 
1166 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) {
1167   b.setInsertionPointToStart(block);
1168   for (llvm::Instruction &inst : *bb) {
1169     if (failed(processInstruction(&inst)))
1170       return failure();
1171   }
1172   return success();
1173 }
1174 
1175 OwningOpRef<ModuleOp>
1176 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule,
1177                               MLIRContext *context) {
1178   context->loadDialect<LLVMDialect>();
1179   context->loadDialect<DLTIDialect>();
1180   OwningOpRef<ModuleOp> module(ModuleOp::create(
1181       FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0)));
1182 
1183   DataLayoutSpecInterface dlSpec =
1184       translateDataLayout(llvmModule->getDataLayout(), context);
1185   if (!dlSpec) {
1186     emitError(UnknownLoc::get(context), "can't translate data layout");
1187     return {};
1188   }
1189 
1190   module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec);
1191 
1192   Importer deserializer(context, module.get());
1193   for (llvm::GlobalVariable &gv : llvmModule->globals()) {
1194     if (!deserializer.processGlobal(&gv))
1195       return {};
1196   }
1197   for (llvm::Function &f : llvmModule->functions()) {
1198     if (failed(deserializer.processFunction(&f)))
1199       return {};
1200   }
1201 
1202   return module;
1203 }
1204 
1205 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the
1206 // LLVM dialect.
1207 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr,
1208                                               MLIRContext *context) {
1209   llvm::SMDiagnostic err;
1210   llvm::LLVMContext llvmContext;
1211   std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR(
1212       *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext);
1213   if (!llvmModule) {
1214     std::string errStr;
1215     llvm::raw_string_ostream errStream(errStr);
1216     err.print(/*ProgName=*/"", errStream);
1217     emitError(UnknownLoc::get(context)) << errStream.str();
1218     return {};
1219   }
1220   return translateLLVMIRToModule(std::move(llvmModule), context);
1221 }
1222 
1223 namespace mlir {
1224 void registerFromLLVMIRTranslation() {
1225   TranslateToMLIRRegistration fromLLVM(
1226       "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) {
1227         return ::translateLLVMIRToModule(sourceMgr, context);
1228       });
1229 }
1230 } // namespace mlir
1231