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