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