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::Load:
675   case llvm::Instruction::Store:
676   case llvm::Instruction::Ret:
677   case llvm::Instruction::Resume:
678   case llvm::Instruction::Trunc:
679   case llvm::Instruction::ZExt:
680   case llvm::Instruction::SExt:
681   case llvm::Instruction::FPToUI:
682   case llvm::Instruction::FPToSI:
683   case llvm::Instruction::UIToFP:
684   case llvm::Instruction::SIToFP:
685   case llvm::Instruction::FPTrunc:
686   case llvm::Instruction::FPExt:
687   case llvm::Instruction::PtrToInt:
688   case llvm::Instruction::IntToPtr:
689   case llvm::Instruction::AddrSpaceCast:
690   case llvm::Instruction::Freeze:
691   case llvm::Instruction::BitCast: {
692     OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode()));
693     SmallVector<Value, 4> ops;
694     ops.reserve(inst->getNumOperands());
695     for (auto *op : inst->operand_values()) {
696       Value value = processValue(op);
697       if (!value)
698         return failure();
699       ops.push_back(value);
700     }
701     state.addOperands(ops);
702     if (!inst->getType()->isVoidTy()) {
703       Type type = processType(inst->getType());
704       if (!type)
705         return failure();
706       state.addTypes(type);
707     }
708     Operation *op = b.create(state);
709     if (!inst->getType()->isVoidTy())
710       v = op->getResult(0);
711     return success();
712   }
713   case llvm::Instruction::Alloca: {
714     Value size = processValue(inst->getOperand(0));
715     if (!size)
716       return failure();
717 
718     auto *allocaInst = cast<llvm::AllocaInst>(inst);
719     v = b.create<AllocaOp>(loc, processType(inst->getType()),
720                            processType(allocaInst->getAllocatedType()), size,
721                            allocaInst->getAlign().value());
722     return success();
723   }
724   case llvm::Instruction::ICmp: {
725     Value lhs = processValue(inst->getOperand(0));
726     Value rhs = processValue(inst->getOperand(1));
727     if (!lhs || !rhs)
728       return failure();
729     v = b.create<ICmpOp>(
730         loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs,
731         rhs);
732     return success();
733   }
734   case llvm::Instruction::Br: {
735     auto *brInst = cast<llvm::BranchInst>(inst);
736     OperationState state(loc,
737                          brInst->isConditional() ? "llvm.cond_br" : "llvm.br");
738     if (brInst->isConditional()) {
739       Value condition = processValue(brInst->getCondition());
740       if (!condition)
741         return failure();
742       state.addOperands(condition);
743     }
744 
745     std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0};
746     for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) {
747       auto *succ = brInst->getSuccessor(i);
748       SmallVector<Value, 4> blockArguments;
749       if (failed(processBranchArgs(brInst, succ, blockArguments)))
750         return failure();
751       state.addSuccessors(blocks[succ]);
752       state.addOperands(blockArguments);
753       operandSegmentSizes[i + 1] = blockArguments.size();
754     }
755 
756     if (brInst->isConditional()) {
757       state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(),
758                          b.getI32VectorAttr(operandSegmentSizes));
759     }
760 
761     b.create(state);
762     return success();
763   }
764   case llvm::Instruction::PHI: {
765     Type type = processType(inst->getType());
766     if (!type)
767       return failure();
768     v = b.getInsertionBlock()->addArgument(
769         type, processDebugLoc(inst->getDebugLoc(), inst));
770     return success();
771   }
772   case llvm::Instruction::Call: {
773     llvm::CallInst *ci = cast<llvm::CallInst>(inst);
774     SmallVector<Value, 4> ops;
775     ops.reserve(inst->getNumOperands());
776     for (auto &op : ci->args()) {
777       Value arg = processValue(op.get());
778       if (!arg)
779         return failure();
780       ops.push_back(arg);
781     }
782 
783     SmallVector<Type, 2> tys;
784     if (!ci->getType()->isVoidTy()) {
785       Type type = processType(inst->getType());
786       if (!type)
787         return failure();
788       tys.push_back(type);
789     }
790     Operation *op;
791     if (llvm::Function *callee = ci->getCalledFunction()) {
792       op = b.create<CallOp>(
793           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops);
794     } else {
795       Value calledValue = processValue(ci->getCalledOperand());
796       if (!calledValue)
797         return failure();
798       ops.insert(ops.begin(), calledValue);
799       op = b.create<CallOp>(loc, tys, ops);
800     }
801     if (!ci->getType()->isVoidTy())
802       v = op->getResult(0);
803     return success();
804   }
805   case llvm::Instruction::LandingPad: {
806     llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst);
807     SmallVector<Value, 4> ops;
808 
809     for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++)
810       ops.push_back(processConstant(lpi->getClause(i)));
811 
812     Type ty = processType(lpi->getType());
813     if (!ty)
814       return failure();
815 
816     v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops);
817     return success();
818   }
819   case llvm::Instruction::Invoke: {
820     llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst);
821 
822     SmallVector<Type, 2> tys;
823     if (!ii->getType()->isVoidTy())
824       tys.push_back(processType(inst->getType()));
825 
826     SmallVector<Value, 4> ops;
827     ops.reserve(inst->getNumOperands() + 1);
828     for (auto &op : ii->args())
829       ops.push_back(processValue(op.get()));
830 
831     SmallVector<Value, 4> normalArgs, unwindArgs;
832     (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs);
833     (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs);
834 
835     Operation *op;
836     if (llvm::Function *callee = ii->getCalledFunction()) {
837       op = b.create<InvokeOp>(
838           loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops,
839           blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()],
840           unwindArgs);
841     } else {
842       ops.insert(ops.begin(), processValue(ii->getCalledOperand()));
843       op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()],
844                               normalArgs, blocks[ii->getUnwindDest()],
845                               unwindArgs);
846     }
847 
848     if (!ii->getType()->isVoidTy())
849       v = op->getResult(0);
850     return success();
851   }
852   case llvm::Instruction::Fence: {
853     StringRef syncscope;
854     SmallVector<StringRef, 4> ssNs;
855     llvm::LLVMContext &llvmContext = inst->getContext();
856     llvm::FenceInst *fence = cast<llvm::FenceInst>(inst);
857     llvmContext.getSyncScopeNames(ssNs);
858     int fenceSyncScopeID = fence->getSyncScopeID();
859     for (unsigned i = 0, e = ssNs.size(); i != e; i++) {
860       if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) {
861         syncscope = ssNs[i];
862         break;
863       }
864     }
865     b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()),
866                       syncscope);
867     return success();
868   }
869   case llvm::Instruction::GetElementPtr: {
870     // FIXME: Support inbounds GEPs.
871     llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst);
872     Value basePtr = processValue(gep->getOperand(0));
873     SmallVector<int32_t> staticIndices;
874     SmallVector<Value> dynamicIndices;
875     Type sourceElementType = processType(gep->getSourceElementType());
876     SmallVector<unsigned> staticIndexPositions;
877     GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions);
878 
879     for (const auto &en :
880          llvm::enumerate(llvm::drop_begin(gep->operand_values()))) {
881       llvm::Value *operand = en.value();
882       if (llvm::find(staticIndexPositions, en.index()) ==
883           staticIndexPositions.end()) {
884         staticIndices.push_back(GEPOp::kDynamicIndex);
885         dynamicIndices.push_back(processValue(operand));
886         if (!dynamicIndices.back())
887           return failure();
888       } else {
889         auto *constantInt = cast<llvm::ConstantInt>(operand);
890         staticIndices.push_back(
891             static_cast<int32_t>(constantInt->getValue().getZExtValue()));
892       }
893     }
894 
895     Type type = processType(inst->getType());
896     if (!type)
897       return failure();
898     v = b.create<GEPOp>(loc, type, sourceElementType, basePtr, dynamicIndices,
899                         staticIndices);
900     return success();
901   }
902   }
903 }
904 
905 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) {
906   if (!f->hasPersonalityFn())
907     return nullptr;
908 
909   llvm::Constant *pf = f->getPersonalityFn();
910 
911   // If it directly has a name, we can use it.
912   if (pf->hasName())
913     return SymbolRefAttr::get(b.getContext(), pf->getName());
914 
915   // If it doesn't have a name, currently, only function pointers that are
916   // bitcast to i8* are parsed.
917   if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) {
918     if (ce->getOpcode() == llvm::Instruction::BitCast &&
919         ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) {
920       if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0)))
921         return SymbolRefAttr::get(b.getContext(), func->getName());
922     }
923   }
924   return FlatSymbolRefAttr();
925 }
926 
927 LogicalResult Importer::processFunction(llvm::Function *f) {
928   blocks.clear();
929   instMap.clear();
930   unknownInstMap.clear();
931 
932   auto functionType =
933       processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>();
934   if (!functionType)
935     return failure();
936 
937   b.setInsertionPoint(module.getBody(), getFuncInsertPt());
938   LLVMFuncOp fop =
939       b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType,
940                            convertLinkageFromLLVM(f->getLinkage()));
941 
942   if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f))
943     fop->setAttr(b.getStringAttr("personality"), personality);
944   else if (f->hasPersonalityFn())
945     emitWarning(UnknownLoc::get(context),
946                 "could not deduce personality, skipping it");
947 
948   if (f->hasGC())
949     fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC()));
950 
951   if (f->isDeclaration())
952     return success();
953 
954   // Eagerly create all blocks.
955   SmallVector<Block *, 4> blockList;
956   for (llvm::BasicBlock &bb : *f) {
957     blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end()));
958     blocks[&bb] = blockList.back();
959   }
960   currentEntryBlock = blockList[0];
961 
962   // Add function arguments to the entry block.
963   for (const auto &kv : llvm::enumerate(f->args())) {
964     instMap[&kv.value()] = blockList[0]->addArgument(
965         functionType.getParamType(kv.index()), fop.getLoc());
966   }
967 
968   for (auto bbs : llvm::zip(*f, blockList)) {
969     if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs))))
970       return failure();
971   }
972 
973   // Now that all instructions are guaranteed to have been visited, ensure
974   // any unknown uses we encountered are remapped.
975   for (auto &llvmAndUnknown : unknownInstMap) {
976     assert(instMap.count(llvmAndUnknown.first));
977     Value newValue = instMap[llvmAndUnknown.first];
978     Value oldValue = llvmAndUnknown.second->getResult(0);
979     oldValue.replaceAllUsesWith(newValue);
980     llvmAndUnknown.second->erase();
981   }
982   return success();
983 }
984 
985 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) {
986   b.setInsertionPointToStart(block);
987   for (llvm::Instruction &inst : *bb) {
988     if (failed(processInstruction(&inst)))
989       return failure();
990   }
991   return success();
992 }
993 
994 OwningOpRef<ModuleOp>
995 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule,
996                               MLIRContext *context) {
997   context->loadDialect<LLVMDialect>();
998   context->loadDialect<DLTIDialect>();
999   OwningOpRef<ModuleOp> module(ModuleOp::create(
1000       FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0)));
1001 
1002   DataLayoutSpecInterface dlSpec =
1003       translateDataLayout(llvmModule->getDataLayout(), context);
1004   if (!dlSpec) {
1005     emitError(UnknownLoc::get(context), "can't translate data layout");
1006     return {};
1007   }
1008 
1009   module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec);
1010 
1011   Importer deserializer(context, module.get());
1012   for (llvm::GlobalVariable &gv : llvmModule->globals()) {
1013     if (!deserializer.processGlobal(&gv))
1014       return {};
1015   }
1016   for (llvm::Function &f : llvmModule->functions()) {
1017     if (failed(deserializer.processFunction(&f)))
1018       return {};
1019   }
1020 
1021   return module;
1022 }
1023 
1024 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the
1025 // LLVM dialect.
1026 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr,
1027                                               MLIRContext *context) {
1028   llvm::SMDiagnostic err;
1029   llvm::LLVMContext llvmContext;
1030   std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR(
1031       *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext);
1032   if (!llvmModule) {
1033     std::string errStr;
1034     llvm::raw_string_ostream errStream(errStr);
1035     err.print(/*ProgName=*/"", errStream);
1036     emitError(UnknownLoc::get(context)) << errStream.str();
1037     return {};
1038   }
1039   return translateLLVMIRToModule(std::move(llvmModule), context);
1040 }
1041 
1042 namespace mlir {
1043 void registerFromLLVMIRTranslation() {
1044   TranslateToMLIRRegistration fromLLVM(
1045       "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) {
1046         return ::translateLLVMIRToModule(sourceMgr, context);
1047       });
1048 }
1049 } // namespace mlir
1050