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