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 bEntry.create<AddressOfOp>(unknownLoc, type, symbolRef.getValue());
469     return bEntry.create<ConstantOp>(unknownLoc, type, attr);
470   }
471   if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) {
472     Type type = processType(cn->getType());
473     if (!type)
474       return nullptr;
475     return bEntry.create<NullOp>(unknownLoc, type);
476   }
477   if (auto *gv = dyn_cast<llvm::GlobalVariable>(c))
478     return bEntry.create<AddressOfOp>(UnknownLoc::get(context),
479                                       processGlobal(gv));
480 
481   if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) {
482     llvm::Instruction *i = ce->getAsInstruction();
483     OpBuilder::InsertionGuard guard(b);
484     b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin());
485     if (failed(processInstruction(i)))
486       return nullptr;
487     assert(instMap.count(i));
488 
489     // If we don't remove entry of `i` here, it's totally possible that the
490     // next time llvm::ConstantExpr::getAsInstruction is called again, which
491     // always allocates a new Instruction, memory address of the newly
492     // created Instruction might be the same as `i`. Making processInstruction
493     // falsely believe that the new Instruction has been processed before
494     // and raised an assertion error.
495     Value value = instMap[i];
496     instMap.erase(i);
497     // Remove this zombie LLVM instruction now, leaving us only with the MLIR
498     // op.
499     i->deleteValue();
500     return value;
501   }
502   if (auto *ue = dyn_cast<llvm::UndefValue>(c)) {
503     Type type = processType(ue->getType());
504     if (!type)
505       return nullptr;
506     return bEntry.create<UndefOp>(UnknownLoc::get(context), type);
507   }
508 
509   if (isa<llvm::ConstantAggregate>(c) || isa<llvm::ConstantAggregateZero>(c)) {
510     unsigned numElements = c->getNumOperands();
511     std::function<llvm::Constant *(unsigned)> getElement =
512         [&](unsigned index) -> llvm::Constant * {
513       return c->getAggregateElement(index);
514     };
515     // llvm::ConstantAggregateZero doesn't take any operand
516     // so its getNumOperands is always zero.
517     if (auto *caz = dyn_cast<llvm::ConstantAggregateZero>(c)) {
518       numElements = caz->getElementCount().getFixedValue();
519       // We want to capture the pointer rather than reference
520       // to the pointer since the latter will become dangling upon
521       // exiting the scope.
522       getElement = [=](unsigned index) -> llvm::Constant * {
523         return caz->getElementValue(index);
524       };
525     }
526 
527     // Generate a llvm.undef as the root value first.
528     Type rootType = processType(c->getType());
529     if (!rootType)
530       return nullptr;
531     Value root = bEntry.create<UndefOp>(unknownLoc, rootType);
532     for (unsigned i = 0; i < numElements; ++i) {
533       llvm::Constant *element = getElement(i);
534       Value elementValue = processConstant(element);
535       if (!elementValue)
536         return nullptr;
537       ArrayAttr indexAttr = bEntry.getI32ArrayAttr({static_cast<int32_t>(i)});
538       root = bEntry.create<InsertValueOp>(UnknownLoc::get(context), rootType,
539                                           root, elementValue, indexAttr);
540     }
541     return root;
542   }
543 
544   emitError(unknownLoc) << "unhandled constant: " << diag(*c);
545   return nullptr;
546 }
547 
548 Value Importer::processValue(llvm::Value *value) {
549   auto it = instMap.find(value);
550   if (it != instMap.end())
551     return it->second;
552 
553   // We don't expect to see instructions in dominator order. If we haven't seen
554   // this instruction yet, create an unknown op and remap it later.
555   if (isa<llvm::Instruction>(value)) {
556     Type type = processType(value->getType());
557     if (!type)
558       return nullptr;
559     unknownInstMap[value] =
560         b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"),
561                  /*operands=*/{}, type);
562     return unknownInstMap[value]->getResult(0);
563   }
564 
565   if (auto *c = dyn_cast<llvm::Constant>(value))
566     return processConstant(c);
567 
568   emitError(unknownLoc) << "unhandled value: " << diag(*value);
569   return nullptr;
570 }
571 
572 /// Return the MLIR OperationName for the given LLVM opcode.
573 static StringRef lookupOperationNameFromOpcode(unsigned opcode) {
574 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered
575 // as in llvm/IR/Instructions.def to aid comprehension and spot missing
576 // instructions.
577 #define INST(llvm_n, mlir_n)                                                   \
578   { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() }
579   static const DenseMap<unsigned, StringRef> opcMap = {
580       // Ret is handled specially.
581       // Br is handled specially.
582       // FIXME: switch
583       // FIXME: indirectbr
584       // FIXME: invoke
585       INST(Resume, Resume),
586       // FIXME: unreachable
587       // FIXME: cleanupret
588       // FIXME: catchret
589       // FIXME: catchswitch
590       // FIXME: callbr
591       // FIXME: fneg
592       INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub),
593       INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv),
594       INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem),
595       INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And),
596       INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load),
597       INST(Store, Store),
598       // Getelementptr is handled specially.
599       INST(Ret, Return), INST(Fence, Fence),
600       // FIXME: atomiccmpxchg
601       // FIXME: atomicrmw
602       INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt),
603       INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP),
604       INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt),
605       INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr),
606       INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast),
607       // FIXME: cleanuppad
608       // FIXME: catchpad
609       // ICmp is handled specially.
610       // FIXME: fcmp
611       // PHI is handled specially.
612       INST(Freeze, Freeze), INST(Call, Call),
613       // FIXME: select
614       // FIXME: vaarg
615       // FIXME: extractelement
616       // FIXME: insertelement
617       // FIXME: shufflevector
618       // FIXME: extractvalue
619       // FIXME: insertvalue
620       // FIXME: landingpad
621   };
622 #undef INST
623 
624   return opcMap.lookup(opcode);
625 }
626 
627 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) {
628   switch (p) {
629   default:
630     llvm_unreachable("incorrect comparison predicate");
631   case llvm::CmpInst::Predicate::ICMP_EQ:
632     return LLVM::ICmpPredicate::eq;
633   case llvm::CmpInst::Predicate::ICMP_NE:
634     return LLVM::ICmpPredicate::ne;
635   case llvm::CmpInst::Predicate::ICMP_SLT:
636     return LLVM::ICmpPredicate::slt;
637   case llvm::CmpInst::Predicate::ICMP_SLE:
638     return LLVM::ICmpPredicate::sle;
639   case llvm::CmpInst::Predicate::ICMP_SGT:
640     return LLVM::ICmpPredicate::sgt;
641   case llvm::CmpInst::Predicate::ICMP_SGE:
642     return LLVM::ICmpPredicate::sge;
643   case llvm::CmpInst::Predicate::ICMP_ULT:
644     return LLVM::ICmpPredicate::ult;
645   case llvm::CmpInst::Predicate::ICMP_ULE:
646     return LLVM::ICmpPredicate::ule;
647   case llvm::CmpInst::Predicate::ICMP_UGT:
648     return LLVM::ICmpPredicate::ugt;
649   case llvm::CmpInst::Predicate::ICMP_UGE:
650     return LLVM::ICmpPredicate::uge;
651   }
652   llvm_unreachable("incorrect comparison predicate");
653 }
654 
655 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) {
656   switch (ordering) {
657   case llvm::AtomicOrdering::NotAtomic:
658     return LLVM::AtomicOrdering::not_atomic;
659   case llvm::AtomicOrdering::Unordered:
660     return LLVM::AtomicOrdering::unordered;
661   case llvm::AtomicOrdering::Monotonic:
662     return LLVM::AtomicOrdering::monotonic;
663   case llvm::AtomicOrdering::Acquire:
664     return LLVM::AtomicOrdering::acquire;
665   case llvm::AtomicOrdering::Release:
666     return LLVM::AtomicOrdering::release;
667   case llvm::AtomicOrdering::AcquireRelease:
668     return LLVM::AtomicOrdering::acq_rel;
669   case llvm::AtomicOrdering::SequentiallyConsistent:
670     return LLVM::AtomicOrdering::seq_cst;
671   }
672   llvm_unreachable("incorrect atomic ordering");
673 }
674 
675 // `br` branches to `target`. Return the branch arguments to `br`, in the
676 // same order of the PHIs in `target`.
677 LogicalResult
678 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target,
679                             SmallVectorImpl<Value> &blockArguments) {
680   for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) {
681     auto *pn = cast<llvm::PHINode>(&*inst);
682     Value value = processValue(pn->getIncomingValueForBlock(br->getParent()));
683     if (!value)
684       return failure();
685     blockArguments.push_back(value);
686   }
687   return success();
688 }
689 
690 LogicalResult Importer::processInstruction(llvm::Instruction *inst) {
691   // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math
692   // flags and call / operand attributes are not supported.
693   Location loc = processDebugLoc(inst->getDebugLoc(), inst);
694   Value &v = instMap[inst];
695   assert(!v && "processInstruction must be called only once per instruction!");
696   switch (inst->getOpcode()) {
697   default:
698     return emitError(loc) << "unknown instruction: " << diag(*inst);
699   case llvm::Instruction::Add:
700   case llvm::Instruction::FAdd:
701   case llvm::Instruction::Sub:
702   case llvm::Instruction::FSub:
703   case llvm::Instruction::Mul:
704   case llvm::Instruction::FMul:
705   case llvm::Instruction::UDiv:
706   case llvm::Instruction::SDiv:
707   case llvm::Instruction::FDiv:
708   case llvm::Instruction::URem:
709   case llvm::Instruction::SRem:
710   case llvm::Instruction::FRem:
711   case llvm::Instruction::Shl:
712   case llvm::Instruction::LShr:
713   case llvm::Instruction::AShr:
714   case llvm::Instruction::And:
715   case llvm::Instruction::Or:
716   case llvm::Instruction::Xor:
717   case llvm::Instruction::Load:
718   case llvm::Instruction::Store:
719   case llvm::Instruction::Ret:
720   case llvm::Instruction::Resume:
721   case llvm::Instruction::Trunc:
722   case llvm::Instruction::ZExt:
723   case llvm::Instruction::SExt:
724   case llvm::Instruction::FPToUI:
725   case llvm::Instruction::FPToSI:
726   case llvm::Instruction::UIToFP:
727   case llvm::Instruction::SIToFP:
728   case llvm::Instruction::FPTrunc:
729   case llvm::Instruction::FPExt:
730   case llvm::Instruction::PtrToInt:
731   case llvm::Instruction::IntToPtr:
732   case llvm::Instruction::AddrSpaceCast:
733   case llvm::Instruction::Freeze:
734   case llvm::Instruction::BitCast: {
735     OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode()));
736     SmallVector<Value, 4> ops;
737     ops.reserve(inst->getNumOperands());
738     for (auto *op : inst->operand_values()) {
739       Value value = processValue(op);
740       if (!value)
741         return failure();
742       ops.push_back(value);
743     }
744     state.addOperands(ops);
745     if (!inst->getType()->isVoidTy()) {
746       Type type = processType(inst->getType());
747       if (!type)
748         return failure();
749       state.addTypes(type);
750     }
751     Operation *op = b.create(state);
752     if (!inst->getType()->isVoidTy())
753       v = op->getResult(0);
754     return success();
755   }
756   case llvm::Instruction::Alloca: {
757     Value size = processValue(inst->getOperand(0));
758     if (!size)
759       return failure();
760 
761     auto *allocaInst = cast<llvm::AllocaInst>(inst);
762     v = b.create<AllocaOp>(loc, processType(inst->getType()),
763                            processType(allocaInst->getAllocatedType()), size,
764                            allocaInst->getAlign().value());
765     return success();
766   }
767   case llvm::Instruction::ICmp: {
768     Value lhs = processValue(inst->getOperand(0));
769     Value rhs = processValue(inst->getOperand(1));
770     if (!lhs || !rhs)
771       return failure();
772     v = b.create<ICmpOp>(
773         loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs,
774         rhs);
775     return success();
776   }
777   case llvm::Instruction::Br: {
778     auto *brInst = cast<llvm::BranchInst>(inst);
779     OperationState state(loc,
780                          brInst->isConditional() ? "llvm.cond_br" : "llvm.br");
781     if (brInst->isConditional()) {
782       Value condition = processValue(brInst->getCondition());
783       if (!condition)
784         return failure();
785       state.addOperands(condition);
786     }
787 
788     std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0};
789     for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) {
790       auto *succ = brInst->getSuccessor(i);
791       SmallVector<Value, 4> blockArguments;
792       if (failed(processBranchArgs(brInst, succ, blockArguments)))
793         return failure();
794       state.addSuccessors(blocks[succ]);
795       state.addOperands(blockArguments);
796       operandSegmentSizes[i + 1] = blockArguments.size();
797     }
798 
799     if (brInst->isConditional()) {
800       state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(),
801                          b.getI32VectorAttr(operandSegmentSizes));
802     }
803 
804     b.create(state);
805     return success();
806   }
807   case llvm::Instruction::PHI: {
808     Type type = processType(inst->getType());
809     if (!type)
810       return failure();
811     v = b.getInsertionBlock()->addArgument(
812         type, processDebugLoc(inst->getDebugLoc(), inst));
813     return success();
814   }
815   case llvm::Instruction::Call: {
816     llvm::CallInst *ci = cast<llvm::CallInst>(inst);
817     SmallVector<Value, 4> ops;
818     ops.reserve(inst->getNumOperands());
819     for (auto &op : ci->args()) {
820       Value arg = processValue(op.get());
821       if (!arg)
822         return failure();
823       ops.push_back(arg);
824     }
825 
826     SmallVector<Type, 2> tys;
827     if (!ci->getType()->isVoidTy()) {
828       Type type = processType(inst->getType());
829       if (!type)
830         return failure();
831       tys.push_back(type);
832     }
833     Operation *op;
834     if (llvm::Function *callee = ci->getCalledFunction()) {
835       op = b.create<CallOp>(
836           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops);
837     } else {
838       Value calledValue = processValue(ci->getCalledOperand());
839       if (!calledValue)
840         return failure();
841       ops.insert(ops.begin(), calledValue);
842       op = b.create<CallOp>(loc, tys, ops);
843     }
844     if (!ci->getType()->isVoidTy())
845       v = op->getResult(0);
846     return success();
847   }
848   case llvm::Instruction::LandingPad: {
849     llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst);
850     SmallVector<Value, 4> ops;
851 
852     for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++)
853       ops.push_back(processConstant(lpi->getClause(i)));
854 
855     Type ty = processType(lpi->getType());
856     if (!ty)
857       return failure();
858 
859     v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops);
860     return success();
861   }
862   case llvm::Instruction::Invoke: {
863     llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst);
864 
865     SmallVector<Type, 2> tys;
866     if (!ii->getType()->isVoidTy())
867       tys.push_back(processType(inst->getType()));
868 
869     SmallVector<Value, 4> ops;
870     ops.reserve(inst->getNumOperands() + 1);
871     for (auto &op : ii->args())
872       ops.push_back(processValue(op.get()));
873 
874     SmallVector<Value, 4> normalArgs, unwindArgs;
875     (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs);
876     (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs);
877 
878     Operation *op;
879     if (llvm::Function *callee = ii->getCalledFunction()) {
880       op = b.create<InvokeOp>(
881           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops,
882           blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()],
883           unwindArgs);
884     } else {
885       ops.insert(ops.begin(), processValue(ii->getCalledOperand()));
886       op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()],
887                               normalArgs, blocks[ii->getUnwindDest()],
888                               unwindArgs);
889     }
890 
891     if (!ii->getType()->isVoidTy())
892       v = op->getResult(0);
893     return success();
894   }
895   case llvm::Instruction::Fence: {
896     StringRef syncscope;
897     SmallVector<StringRef, 4> ssNs;
898     llvm::LLVMContext &llvmContext = inst->getContext();
899     llvm::FenceInst *fence = cast<llvm::FenceInst>(inst);
900     llvmContext.getSyncScopeNames(ssNs);
901     int fenceSyncScopeID = fence->getSyncScopeID();
902     for (unsigned i = 0, e = ssNs.size(); i != e; i++) {
903       if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) {
904         syncscope = ssNs[i];
905         break;
906       }
907     }
908     b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()),
909                       syncscope);
910     return success();
911   }
912   case llvm::Instruction::GetElementPtr: {
913     // FIXME: Support inbounds GEPs.
914     llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst);
915     Value basePtr = processValue(gep->getOperand(0));
916     SmallVector<int32_t> staticIndices;
917     SmallVector<Value> dynamicIndices;
918     Type sourceElementType = processType(gep->getSourceElementType());
919     SmallVector<unsigned> staticIndexPositions;
920     GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions);
921 
922     for (const auto &en :
923          llvm::enumerate(llvm::drop_begin(gep->operand_values()))) {
924       llvm::Value *operand = en.value();
925       if (llvm::find(staticIndexPositions, en.index()) ==
926           staticIndexPositions.end()) {
927         staticIndices.push_back(GEPOp::kDynamicIndex);
928         dynamicIndices.push_back(processValue(operand));
929         if (!dynamicIndices.back())
930           return failure();
931       } else {
932         auto *constantInt = cast<llvm::ConstantInt>(operand);
933         staticIndices.push_back(
934             static_cast<int32_t>(constantInt->getValue().getZExtValue()));
935       }
936     }
937 
938     Type type = processType(inst->getType());
939     if (!type)
940       return failure();
941     v = b.create<GEPOp>(loc, type, sourceElementType, basePtr, dynamicIndices,
942                         staticIndices);
943     return success();
944   }
945   }
946 }
947 
948 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) {
949   if (!f->hasPersonalityFn())
950     return nullptr;
951 
952   llvm::Constant *pf = f->getPersonalityFn();
953 
954   // If it directly has a name, we can use it.
955   if (pf->hasName())
956     return SymbolRefAttr::get(b.getContext(), pf->getName());
957 
958   // If it doesn't have a name, currently, only function pointers that are
959   // bitcast to i8* are parsed.
960   if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) {
961     if (ce->getOpcode() == llvm::Instruction::BitCast &&
962         ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) {
963       if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0)))
964         return SymbolRefAttr::get(b.getContext(), func->getName());
965     }
966   }
967   return FlatSymbolRefAttr();
968 }
969 
970 LogicalResult Importer::processFunction(llvm::Function *f) {
971   blocks.clear();
972   instMap.clear();
973   unknownInstMap.clear();
974 
975   auto functionType =
976       processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>();
977   if (!functionType)
978     return failure();
979 
980   b.setInsertionPoint(module.getBody(), getFuncInsertPt());
981   LLVMFuncOp fop =
982       b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType,
983                            convertLinkageFromLLVM(f->getLinkage()));
984 
985   if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f))
986     fop->setAttr(b.getStringAttr("personality"), personality);
987   else if (f->hasPersonalityFn())
988     emitWarning(UnknownLoc::get(context),
989                 "could not deduce personality, skipping it");
990 
991   if (f->hasGC())
992     fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC()));
993 
994   if (f->isDeclaration())
995     return success();
996 
997   // Eagerly create all blocks.
998   SmallVector<Block *, 4> blockList;
999   for (llvm::BasicBlock &bb : *f) {
1000     blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end()));
1001     blocks[&bb] = blockList.back();
1002   }
1003   currentEntryBlock = blockList[0];
1004 
1005   // Add function arguments to the entry block.
1006   for (const auto &kv : llvm::enumerate(f->args())) {
1007     instMap[&kv.value()] = blockList[0]->addArgument(
1008         functionType.getParamType(kv.index()), fop.getLoc());
1009   }
1010 
1011   for (auto bbs : llvm::zip(*f, blockList)) {
1012     if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs))))
1013       return failure();
1014   }
1015 
1016   // Now that all instructions are guaranteed to have been visited, ensure
1017   // any unknown uses we encountered are remapped.
1018   for (auto &llvmAndUnknown : unknownInstMap) {
1019     assert(instMap.count(llvmAndUnknown.first));
1020     Value newValue = instMap[llvmAndUnknown.first];
1021     Value oldValue = llvmAndUnknown.second->getResult(0);
1022     oldValue.replaceAllUsesWith(newValue);
1023     llvmAndUnknown.second->erase();
1024   }
1025   return success();
1026 }
1027 
1028 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) {
1029   b.setInsertionPointToStart(block);
1030   for (llvm::Instruction &inst : *bb) {
1031     if (failed(processInstruction(&inst)))
1032       return failure();
1033   }
1034   return success();
1035 }
1036 
1037 OwningOpRef<ModuleOp>
1038 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule,
1039                               MLIRContext *context) {
1040   context->loadDialect<LLVMDialect>();
1041   context->loadDialect<DLTIDialect>();
1042   OwningOpRef<ModuleOp> module(ModuleOp::create(
1043       FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0)));
1044 
1045   DataLayoutSpecInterface dlSpec =
1046       translateDataLayout(llvmModule->getDataLayout(), context);
1047   if (!dlSpec) {
1048     emitError(UnknownLoc::get(context), "can't translate data layout");
1049     return {};
1050   }
1051 
1052   module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec);
1053 
1054   Importer deserializer(context, module.get());
1055   for (llvm::GlobalVariable &gv : llvmModule->globals()) {
1056     if (!deserializer.processGlobal(&gv))
1057       return {};
1058   }
1059   for (llvm::Function &f : llvmModule->functions()) {
1060     if (failed(deserializer.processFunction(&f)))
1061       return {};
1062   }
1063 
1064   return module;
1065 }
1066 
1067 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the
1068 // LLVM dialect.
1069 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr,
1070                                               MLIRContext *context) {
1071   llvm::SMDiagnostic err;
1072   llvm::LLVMContext llvmContext;
1073   std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR(
1074       *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext);
1075   if (!llvmModule) {
1076     std::string errStr;
1077     llvm::raw_string_ostream errStream(errStr);
1078     err.print(/*ProgName=*/"", errStream);
1079     emitError(UnknownLoc::get(context)) << errStream.str();
1080     return {};
1081   }
1082   return translateLLVMIRToModule(std::move(llvmModule), context);
1083 }
1084 
1085 namespace mlir {
1086 void registerFromLLVMIRTranslation() {
1087   TranslateToMLIRRegistration fromLLVM(
1088       "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) {
1089         return ::translateLLVMIRToModule(sourceMgr, context);
1090       });
1091 }
1092 } // namespace mlir
1093