509  bool hasVectorElementType = isa<VectorType>(type.getElementType());
 
  511      numElements / (hasVectorElementType
 
  513                         : denseResourceAttr.getType().
getShape().back());
 
  515  if (!hasVectorElementType)
 
  516    outerShape = outerShape.drop_back();
 
  519  std::function<llvm::Constant *(StringRef)> buildCstData;
 
  520  if (isa<TensorType>(type)) {
 
  521    auto vectorElementType = dyn_cast<VectorType>(type.getElementType());
 
  522    if (vectorElementType && vectorElementType.getRank() == 1) {
 
  523      buildCstData = [&](StringRef data) {
 
  524        return llvm::ConstantDataVector::getRaw(
 
  525            data, vectorElementType.getShape().back(), innermostLLVMType);
 
  527    } 
else if (!vectorElementType) {
 
  528      buildCstData = [&](StringRef data) {
 
  529        return llvm::ConstantDataArray::getRaw(data, type.getShape().back(),
 
  533  } 
else if (isa<VectorType>(type)) {
 
  534    buildCstData = [&](StringRef data) {
 
  535      return llvm::ConstantDataVector::getRaw(data, type.getShape().back(),
 
  540    emitError(loc, 
"unsupported dense_resource type");
 
  546  SmallVector<llvm::Constant *> constants;
 
  547  int64_t aggregateSize = denseResourceAttr.getType().getShape().back() *
 
  548                          (innermostLLVMType->getScalarSizeInBits() / 8);
 
  549  constants.reserve(numAggregates);
 
  550  for (
unsigned i = 0; i < numAggregates; ++i) {
 
  551    StringRef data(rawData.data() + i * aggregateSize, aggregateSize);
 
  552    constants.push_back(buildCstData(data));
 
  555  ArrayRef<llvm::Constant *> constantsRef = constants;
 
  567  if (!attr || isa<UndefAttr>(attr))
 
  568    return llvm::UndefValue::get(llvmType);
 
  569  if (isa<ZeroAttr>(attr))
 
  570    return llvm::Constant::getNullValue(llvmType);
 
  571  if (
auto *structType = dyn_cast<::llvm::StructType>(llvmType)) {
 
  572    auto arrayAttr = dyn_cast<ArrayAttr>(attr);
 
  574      emitError(loc, 
"expected an array attribute for a struct constant");
 
  578    structElements.reserve(structType->getNumElements());
 
  579    for (
auto [elemType, elemAttr] :
 
  580         zip_equal(structType->elements(), arrayAttr)) {
 
  581      llvm::Constant *element =
 
  585      structElements.push_back(element);
 
  587    return llvm::ConstantStruct::get(structType, structElements);
 
  591  if (
auto intAttr = dyn_cast<IntegerAttr>(attr))
 
  592    return llvm::ConstantInt::get(
 
  594        intAttr.getValue().sextOrTrunc(llvmType->getIntegerBitWidth()));
 
  595  if (
auto floatAttr = dyn_cast<FloatAttr>(attr)) {
 
  596    const llvm::fltSemantics &sem = floatAttr.getValue().getSemantics();
 
  601    unsigned floatWidth = APFloat::getSizeInBits(sem);
 
  602    if (llvmType->isIntegerTy(floatWidth))
 
  603      return llvm::ConstantInt::get(llvmType,
 
  604                                    floatAttr.getValue().bitcastToAPInt());
 
  606        llvm::Type::getFloatingPointTy(llvmType->getContext(),
 
  607                                       floatAttr.getValue().getSemantics())) {
 
  608      emitError(loc, 
"FloatAttr does not match expected type of the constant");
 
  611    return llvm::ConstantFP::get(llvmType, floatAttr.getValue());
 
  613  if (
auto funcAttr = dyn_cast<FlatSymbolRefAttr>(attr))
 
  614    return llvm::ConstantExpr::getBitCast(
 
  616  if (
auto splatAttr = dyn_cast<SplatElementsAttr>(attr)) {
 
  617    llvm::Type *elementType;
 
  618    uint64_t numElements;
 
  619    bool isScalable = 
false;
 
  620    if (
auto *arrayTy = dyn_cast<llvm::ArrayType>(llvmType)) {
 
  621      elementType = arrayTy->getElementType();
 
  622      numElements = arrayTy->getNumElements();
 
  623    } 
else if (
auto *fVectorTy = dyn_cast<llvm::FixedVectorType>(llvmType)) {
 
  624      elementType = fVectorTy->getElementType();
 
  625      numElements = fVectorTy->getNumElements();
 
  626    } 
else if (
auto *sVectorTy = dyn_cast<llvm::ScalableVectorType>(llvmType)) {
 
  627      elementType = sVectorTy->getElementType();
 
  628      numElements = sVectorTy->getMinNumElements();
 
  631      llvm_unreachable(
"unrecognized constant vector type");
 
  636    bool elementTypeSequential =
 
  637        isa<llvm::ArrayType, llvm::VectorType>(elementType);
 
  640        elementTypeSequential ? splatAttr
 
  642        loc, moduleTranslation);
 
  645    if (llvmType->isVectorTy())
 
  646      return llvm::ConstantVector::getSplat(
 
  647          llvm::ElementCount::get(numElements, isScalable), child);
 
  648    if (llvmType->isArrayTy()) {
 
  649      auto *arrayType = llvm::ArrayType::get(elementType, numElements);
 
  650      if (child->isZeroValue() && !elementType->isFPOrFPVectorTy()) {
 
  651        return llvm::ConstantAggregateZero::get(arrayType);
 
  653      if (llvm::ConstantDataSequential::isElementTypeCompatible(elementType)) {
 
  655        if (isa<llvm::IntegerType>(elementType)) {
 
  656          if (llvm::ConstantInt *ci = dyn_cast<llvm::ConstantInt>(child)) {
 
  657            if (ci->getBitWidth() == 8) {
 
  659              return llvm::ConstantDataArray::get(elementType->getContext(),
 
  662            if (ci->getBitWidth() == 16) {
 
  664              return llvm::ConstantDataArray::get(elementType->getContext(),
 
  667            if (ci->getBitWidth() == 32) {
 
  669              return llvm::ConstantDataArray::get(elementType->getContext(),
 
  672            if (ci->getBitWidth() == 64) {
 
  674              return llvm::ConstantDataArray::get(elementType->getContext(),
 
  682        std::vector<llvm::Constant *> constants(numElements, child);
 
  683        return llvm::ConstantArray::get(arrayType, constants);
 
  688  if (llvm::Constant *
result =
 
  690                                   llvmType, moduleTranslation)) {
 
  694  if (
auto denseResourceAttr = dyn_cast<DenseResourceElementsAttr>(attr)) {
 
  700  if (
auto elementsAttr = dyn_cast<ElementsAttr>(attr)) {
 
  701    assert(elementsAttr.getShapedType().hasStaticShape());
 
  702    assert(!elementsAttr.getShapedType().getShape().empty() &&
 
  703           "unexpected empty elements attribute shape");
 
  706    constants.reserve(elementsAttr.getNumElements());
 
  708    for (
auto n : elementsAttr.getValues<
Attribute>()) {
 
  711      if (!constants.back())
 
  716        constantsRef, elementsAttr.getShapedType().getShape(), llvmType, loc);
 
  717    assert(constantsRef.empty() && 
"did not consume all elemental constants");
 
  721  if (
auto stringAttr = dyn_cast<StringAttr>(attr)) {
 
  722    return llvm::ConstantDataArray::get(moduleTranslation.
getLLVMContext(),
 
  728  if (
auto arrayAttr = dyn_cast<ArrayAttr>(attr)) {
 
  729    if (
auto *arrayTy = dyn_cast<llvm::ArrayType>(llvmType)) {
 
  730      llvm::Type *elementType = arrayTy->getElementType();
 
  732      llvm::Constant *elementCst = 
nullptr;
 
  734      constants.reserve(arrayTy->getNumElements());
 
  735      for (
Attribute elementAttr : arrayAttr) {
 
  739        if (!previousElementAttr || previousElementAttr != elementAttr) {
 
  740          previousElementAttr = elementAttr;
 
  746        constants.push_back(elementCst);
 
  748      return llvm::ConstantArray::get(arrayTy, constants);
 
  752  emitError(loc, 
"unsupported constant value");
 
 
  756ModuleTranslation::ModuleTranslation(
Operation *module,
 
  757                                     std::unique_ptr<llvm::Module> llvmModule)
 
  758    : mlirModule(module), llvmModule(std::move(llvmModule)),
 
  762          *this, *this->llvmModule)),
 
  763      typeTranslator(this->llvmModule->
getContext()),
 
  766         "mlirModule should honor LLVM's module semantics.");
 
  769ModuleTranslation::~ModuleTranslation() {
 
  770  if (ompBuilder && !ompBuilder->isFinalized())
 
  771    ompBuilder->finalize();
 
  776  toProcess.push_back(®ion);
 
  777  while (!toProcess.empty()) {
 
  778    Region *current = toProcess.pop_back_val();
 
  779    for (
Block &block : *current) {
 
  780      blockMapping.erase(&block);
 
  781      for (
Value arg : block.getArguments())
 
  782        valueMapping.erase(arg);
 
  784        for (
Value value : op.getResults())
 
  785          valueMapping.erase(value);
 
  786        if (op.hasSuccessors())
 
  787          branchMapping.erase(&op);
 
  788        if (isa<LLVM::GlobalOp>(op))
 
  789          globalsMapping.erase(&op);
 
  790        if (isa<LLVM::AliasOp>(op))
 
  791          aliasesMapping.erase(&op);
 
  792        if (isa<LLVM::IFuncOp>(op))
 
  793          ifuncMapping.erase(&op);
 
  794        if (isa<LLVM::CallOp>(op))
 
  795          callMapping.erase(&op);
 
  798            llvm::map_range(op.getRegions(), [](
Region &r) { return &r; }));
 
 
  807                               unsigned numArguments, 
unsigned index) {
 
  809  if (isa<LLVM::BrOp>(terminator))
 
  816    auto branch = cast<BranchOpInterface>(terminator);
 
  819        (!seenSuccessors.contains(successor) || successorOperands.
empty()) &&
 
  820        "successors with arguments in LLVM branches must be different blocks");
 
  821    seenSuccessors.insert(successor);
 
  827  if (
auto condBranchOp = dyn_cast<LLVM::CondBrOp>(terminator)) {
 
  830    return condBranchOp.getSuccessor(0) == current
 
  831               ? condBranchOp.getTrueDestOperands()[
index]
 
  832               : condBranchOp.getFalseDestOperands()[
index];
 
  835  if (
auto switchOp = dyn_cast<LLVM::SwitchOp>(terminator)) {
 
  838    if (switchOp.getDefaultDestination() == current)
 
  839      return switchOp.getDefaultOperands()[
index];
 
  840    for (
const auto &i : llvm::enumerate(switchOp.getCaseDestinations()))
 
  841      if (i.value() == current)
 
  842        return switchOp.getCaseOperands(i.index())[
index];
 
  845  if (
auto indBrOp = dyn_cast<LLVM::IndirectBrOp>(terminator)) {
 
  847    for (
const auto &i : llvm::enumerate(indBrOp->getSuccessors())) {
 
  848      if (indBrOp->getSuccessor(i.index()) == current)
 
  849        return indBrOp.getSuccessorOperands(i.index())[
index];
 
  853  if (
auto invokeOp = dyn_cast<LLVM::InvokeOp>(terminator)) {
 
  854    return invokeOp.getNormalDest() == current
 
  855               ? invokeOp.getNormalDestOperands()[
index]
 
  856               : invokeOp.getUnwindDestOperands()[
index];
 
  860      "only branch, switch or invoke operations can be terminators " 
  861      "of a block that has successors");
 
 
  869  for (
Block &bb : llvm::drop_begin(region)) {
 
  871    auto phis = llvmBB->phis();
 
  872    auto numArguments = bb.getNumArguments();
 
  873    assert(numArguments == std::distance(phis.begin(), phis.end()));
 
  874    for (
auto [
index, phiNode] : llvm::enumerate(phis)) {
 
  875      for (
auto *pred : bb.getPredecessors()) {
 
  881        llvm::Instruction *terminator =
 
  883        assert(terminator && 
"missing the mapping for a terminator");
 
  885                                &bb, pred, numArguments, 
index)),
 
  886                            terminator->getParent());
 
 
  893    llvm::IRBuilderBase &builder, llvm::Intrinsic::ID intrinsic,
 
  895  llvm::Module *module = builder.GetInsertBlock()->getModule();
 
  897      llvm::Intrinsic::getOrInsertDeclaration(module, intrinsic, tys);
 
  898  return builder.CreateCall(fn, args);
 
 
 
  903    Operation *intrOp, llvm::Intrinsic::ID intrinsic, 
unsigned numResults,
 
  907  assert(immArgPositions.size() == immArgAttrNames.size() &&
 
  908         "LLVM `immArgPositions` and MLIR `immArgAttrNames` should have equal " 
  912  size_t numOpBundleOperands = 0;
 
  913  auto opBundleSizesAttr = cast_if_present<DenseI32ArrayAttr>(
 
  914      intrOp->
getAttr(LLVMDialect::getOpBundleSizesAttrName()));
 
  915  auto opBundleTagsAttr = cast_if_present<ArrayAttr>(
 
  916      intrOp->
getAttr(LLVMDialect::getOpBundleTagsAttrName()));
 
  918  if (opBundleSizesAttr && opBundleTagsAttr) {
 
  919    ArrayRef<int> opBundleSizes = opBundleSizesAttr.asArrayRef();
 
  920    assert(opBundleSizes.size() == opBundleTagsAttr.size() &&
 
  921           "operand bundles and tags do not match");
 
  923    numOpBundleOperands = llvm::sum_of(opBundleSizes);
 
  924    assert(numOpBundleOperands <= intrOp->getNumOperands() &&
 
  925           "operand bundle operands is more than the number of operands");
 
  928    size_t nextOperandIdx = 0;
 
  929    opBundles.reserve(opBundleSizesAttr.size());
 
  931    for (
auto [opBundleTagAttr, bundleSize] :
 
  932         llvm::zip(opBundleTagsAttr, opBundleSizes)) {
 
  933      auto bundleTag = cast<StringAttr>(opBundleTagAttr).str();
 
  935          operands.slice(nextOperandIdx, bundleSize));
 
  936      opBundles.emplace_back(std::move(bundleTag), std::move(bundleOperands));
 
  937      nextOperandIdx += bundleSize;
 
  942  auto opOperands = intrOp->
getOperands().drop_back(numOpBundleOperands);
 
  943  auto operands = moduleTranslation.
lookupValues(opOperands);
 
  945  for (
auto [immArgPos, immArgName] :
 
  946       llvm::zip(immArgPositions, immArgAttrNames)) {
 
  947    auto attr = llvm::cast<TypedAttr>(intrOp->
getAttr(immArgName));
 
  948    assert(attr.getType().isIntOrFloat() && 
"expected int or float immarg");
 
  949    auto *type = moduleTranslation.
convertType(attr.getType());
 
  951        type, attr, intrOp->
getLoc(), moduleTranslation);
 
  954  for (
auto &arg : args) {
 
  956      arg = operands[opArg++];
 
  961  for (
unsigned overloadedResultIdx : overloadedResults) {
 
  962    if (numResults > 1) {
 
  964      overloadedTypes.push_back(moduleTranslation.
convertType(
 
  966              .getBody()[overloadedResultIdx]));
 
  968      overloadedTypes.push_back(
 
  972  for (
unsigned overloadedOperandIdx : overloadedOperands)
 
  973    overloadedTypes.push_back(args[overloadedOperandIdx]->
getType());
 
  974  llvm::Module *module = builder.GetInsertBlock()->getModule();
 
  975  llvm::Function *llvmIntr = llvm::Intrinsic::getOrInsertDeclaration(
 
  976      module, intrinsic, overloadedTypes);
 
  978  return builder.CreateCall(llvmIntr, args, opBundles);
 
 
  983LogicalResult ModuleTranslation::convertOperation(
Operation &op,
 
  984                                                  llvm::IRBuilderBase &builder,
 
  985                                                  bool recordInsertions) {
 
  988    return op.
emitError(
"cannot be converted to LLVM IR: missing " 
  989                        "`LLVMTranslationDialectInterface` registration for " 
  993  InstructionCapturingInserter::CollectionScope scope(builder,
 
  996    return op.
emitError(
"LLVM Translation failed for operation: ")
 
  999  return convertDialectAttributes(&op, scope.getCapturedInstructions());
 
 1009LogicalResult ModuleTranslation::convertBlockImpl(
Block &bb,
 
 1010                                                  bool ignoreArguments,
 
 1011                                                  llvm::IRBuilderBase &builder,
 
 1012                                                  bool recordInsertions) {
 
 1014  auto *subprogram = builder.GetInsertBlock()->getParent()->getSubprogram();
 
 1022  if (!ignoreArguments) {
 
 1024    unsigned numPredecessors =
 
 1025        std::distance(predecessors.begin(), predecessors.end());
 
 1027      auto wrappedType = arg.getType();
 
 1030                         "block argument does not have an LLVM type");
 
 1031      builder.SetCurrentDebugLocation(
 
 1032          debugTranslation->translateLoc(arg.getLoc(), subprogram));
 
 1034      llvm::PHINode *phi = builder.CreatePHI(type, numPredecessors);
 
 1040  for (
auto &op : bb) {
 
 1042    builder.SetCurrentDebugLocation(
 
 1043        debugTranslation->translateLoc(op.
getLoc(), subprogram));
 
 1045    if (
failed(convertOperation(op, builder, recordInsertions)))
 
 1049    if (
auto iface = dyn_cast<WeightedBranchOpInterface>(op))
 
 1059  return module->getRegion(0).front();
 
 
 1068                                        llvm::Constant *cst) {
 
 1069  return (linkage == llvm::GlobalVariable::ExternalLinkage && !cst) ||
 
 1070         linkage == llvm::GlobalVariable::ExternalWeakLinkage;
 
 
 1076                                          llvm::GlobalValue *gv) {
 
 1077  if (dsoLocalRequested)
 
 1078    gv->setDSOLocal(
true);
 
 
 1087static FailureOr<llvm::Attribute>
 
 1089                           StringRef value = StringRef()) {
 
 1090  auto kind = llvm::Attribute::getAttrKindFromName(key);
 
 1091  if (kind == llvm::Attribute::None)
 
 1092    return llvm::Attribute::get(ctx, key, value);
 
 1094  if (llvm::Attribute::isIntAttrKind(kind)) {
 
 1096      return emitError(loc) << 
"LLVM attribute '" << key << 
"' expects a value";
 
 1099    if (!value.getAsInteger(0, 
result))
 
 1100      return llvm::Attribute::get(ctx, kind, 
result);
 
 1101    return llvm::Attribute::get(ctx, key, value);
 
 1105    return emitError(loc) << 
"LLVM attribute '" << key
 
 1106                          << 
"' does not expect a value, found '" << value
 
 1109  return llvm::Attribute::get(ctx, kind);
 
 
 1120static FailureOr<llvm::AttrBuilder>
 
 1122                            ArrayAttr arrayAttr, StringRef arrayAttrName) {
 
 1123  llvm::AttrBuilder attrBuilder(ctx);
 
 1128    if (
auto stringAttr = dyn_cast<StringAttr>(attr)) {
 
 1129      FailureOr<llvm::Attribute> llvmAttr =
 
 1131      if (failed(llvmAttr))
 
 1133      attrBuilder.addAttribute(*llvmAttr);
 
 1137    auto arrayAttr = dyn_cast<ArrayAttr>(attr);
 
 1138    if (!arrayAttr || arrayAttr.size() != 2)
 
 1139      return emitError(loc) << 
"expected '" << arrayAttrName
 
 1140                            << 
"' to contain string or array attributes";
 
 1142    auto keyAttr = dyn_cast<StringAttr>(arrayAttr[0]);
 
 1143    auto valueAttr = dyn_cast<StringAttr>(arrayAttr[1]);
 
 1144    if (!keyAttr || !valueAttr)
 
 1145      return emitError(loc) << 
"expected arrays within '" << arrayAttrName
 
 1146                            << 
"' to contain two strings";
 
 1149        loc, ctx, keyAttr.getValue(), valueAttr.getValue());
 
 1150    if (failed(llvmAttr))
 
 1152    attrBuilder.addAttribute(*llvmAttr);
 
 
 1158LogicalResult ModuleTranslation::convertGlobalsAndAliases() {
 
 1167  for (
auto op : 
getModuleBody(mlirModule).getOps<LLVM::GlobalOp>()) {
 
 1169    llvm::Constant *cst = 
nullptr;
 
 1170    if (op.getValueOrNull()) {
 
 1173      if (
auto strAttr = dyn_cast_or_null<StringAttr>(op.getValueOrNull())) {
 
 1174        cst = llvm::ConstantDataArray::getString(
 
 1175            llvmModule->getContext(), strAttr.getValue(), 
false);
 
 1176        type = cst->getType();
 
 1183    auto linkage = convertLinkageToLLVM(op.getLinkage());
 
 1189    if (!dropInitializer && !cst)
 
 1190      cst = llvm::UndefValue::get(type);
 
 1191    else if (dropInitializer && cst)
 
 1194    auto *var = 
new llvm::GlobalVariable(
 
 1195        *llvmModule, type, op.getConstant(), linkage, cst, op.getSymName(),
 
 1197        op.getThreadLocal_() ? llvm::GlobalValue::GeneralDynamicTLSModel
 
 1198                             : llvm::GlobalValue::NotThreadLocal,
 
 1199        op.getAddrSpace(), op.getExternallyInitialized());
 
 1201    if (std::optional<mlir::SymbolRefAttr> comdat = op.getComdat()) {
 
 1202      auto selectorOp = cast<ComdatSelectorOp>(
 
 1204      var->setComdat(comdatMapping.lookup(selectorOp));
 
 1207    if (op.getUnnamedAddr().has_value())
 
 1208      var->setUnnamedAddr(convertUnnamedAddrToLLVM(*op.getUnnamedAddr()));
 
 1210    if (op.getSection().has_value())
 
 1211      var->setSection(*op.getSection());
 
 1215    std::optional<uint64_t> alignment = op.getAlignment();
 
 1216    if (alignment.has_value())
 
 1217      var->setAlignment(llvm::MaybeAlign(alignment.value()));
 
 1219    var->setVisibility(convertVisibilityToLLVM(op.getVisibility_()));
 
 1221    globalsMapping.try_emplace(op, var);
 
 1224    if (op.getDbgExprs()) {
 
 1225      for (
auto exprAttr :
 
 1226           op.getDbgExprs()->getAsRange<DIGlobalVariableExpressionAttr>()) {
 
 1227        llvm::DIGlobalVariableExpression *diGlobalExpr =
 
 1228            debugTranslation->translateGlobalVariableExpression(exprAttr);
 
 1229        llvm::DIGlobalVariable *diGlobalVar = diGlobalExpr->getVariable();
 
 1230        var->addDebugInfo(diGlobalExpr);
 
 1249        llvm::DIScope *scope = diGlobalVar->getScope();
 
 1250        if (
auto *mod = dyn_cast_if_present<llvm::DIModule>(scope))
 
 1251          scope = mod->getScope();
 
 1252        else if (
auto *cb = dyn_cast_if_present<llvm::DICommonBlock>(scope)) {
 
 1254                  dyn_cast_if_present<llvm::DISubprogram>(cb->getScope()))
 
 1255            scope = sp->getUnit();
 
 1256        } 
else if (
auto *sp = dyn_cast_if_present<llvm::DISubprogram>(scope))
 
 1257          scope = sp->getUnit();
 
 1260        if (llvm::DICompileUnit *compileUnit =
 
 1261                dyn_cast_if_present<llvm::DICompileUnit>(scope)) {
 
 1264          allGVars[compileUnit].push_back(diGlobalExpr);
 
 1270    FailureOr<llvm::AttrBuilder> convertedTargetSpecificAttrs =
 
 1272                                    op.getTargetSpecificAttrsAttr(),
 
 1273                                    op.getTargetSpecificAttrsAttrName());
 
 1274    if (
failed(convertedTargetSpecificAttrs))
 
 1276    var->addAttributes(*convertedTargetSpecificAttrs);
 
 1280  for (
auto op : 
getModuleBody(mlirModule).getOps<LLVM::AliasOp>()) {
 
 1282    llvm::Constant *cst = 
nullptr;
 
 1283    llvm::GlobalValue::LinkageTypes linkage =
 
 1284        convertLinkageToLLVM(op.getLinkage());
 
 1285    llvm::Module &llvmMod = *llvmModule;
 
 1288    llvm::GlobalAlias *var = llvm::GlobalAlias::create(
 
 1289        type, op.getAddrSpace(), linkage, op.getSymName(),  cst,
 
 1292    var->setThreadLocalMode(op.getThreadLocal_()
 
 1293                                ? llvm::GlobalAlias::GeneralDynamicTLSModel
 
 1294                                : llvm::GlobalAlias::NotThreadLocal);
 
 1299    if (op.getUnnamedAddr().has_value())
 
 1300      var->setUnnamedAddr(convertUnnamedAddrToLLVM(*op.getUnnamedAddr()));
 
 1302    var->setVisibility(convertVisibilityToLLVM(op.getVisibility_()));
 
 1304    aliasesMapping.try_emplace(op, var);
 
 1308  for (
auto op : 
getModuleBody(mlirModule).getOps<LLVM::GlobalOp>()) {
 
 1309    if (
Block *initializer = op.getInitializerBlock()) {
 
 1310      llvm::IRBuilder<llvm::TargetFolder> builder(
 
 1311          llvmModule->getContext(),
 
 1312          llvm::TargetFolder(llvmModule->getDataLayout()));
 
 1314      [[maybe_unused]] 
int numConstantsHit = 0;
 
 1315      [[maybe_unused]] 
int numConstantsErased = 0;
 
 1318      for (
auto &op : initializer->without_terminator()) {
 
 1319        if (
failed(convertOperation(op, builder)))
 
 1332        if (
auto *agg = dyn_cast<llvm::ConstantAggregate>(cst)) {
 
 1335          int numUsers = std::distance(
result.use_begin(), 
result.use_end());
 
 1337              constantAggregateUseMap.try_emplace(agg, numUsers);
 
 1340            iterator->second += numUsers;
 
 1346          auto cst = dyn_cast<llvm::ConstantAggregate>(
lookupValue(v));
 
 1349          auto iter = constantAggregateUseMap.find(cst);
 
 1350          assert(iter != constantAggregateUseMap.end() && 
"constant not found");
 
 1352          if (iter->second == 0) {
 
 1355            if (cst->user_empty()) {
 
 1356              cst->destroyConstant();
 
 1357              numConstantsErased++;
 
 1359            constantAggregateUseMap.erase(iter);
 
 1364      ReturnOp ret = cast<ReturnOp>(initializer->getTerminator());
 
 1365      llvm::Constant *cst =
 
 1366          cast<llvm::Constant>(
lookupValue(ret.getOperand(0)));
 
 1367      auto *global = cast<llvm::GlobalVariable>(
lookupGlobal(op));
 
 1369        global->setInitializer(cst);
 
 1373      for (
auto it : constantAggregateUseMap) {
 
 1374        auto cst = it.first;
 
 1375        cst->removeDeadConstantUsers();
 
 1376        if (cst->user_empty()) {
 
 1377          cst->destroyConstant();
 
 1378          numConstantsErased++;
 
 1382      LLVM_DEBUG(llvm::dbgs()
 
 1383                     << 
"Convert initializer for " << op.
getName() << 
"\n";
 
 1384                 llvm::dbgs() << numConstantsHit << 
" new constants hit\n";
 
 1386                 << numConstantsErased << 
" dangling constants erased\n";);
 
 1392    auto ctorOp = dyn_cast<GlobalCtorsOp>(op);
 
 1393    auto dtorOp = dyn_cast<GlobalDtorsOp>(op);
 
 1394    if (!ctorOp && !dtorOp)
 
 1400    if ((ctorOp && ctorOp.getCtors().empty()) ||
 
 1401        (dtorOp && dtorOp.getDtors().empty())) {
 
 1402      llvm::IRBuilder<llvm::TargetFolder> builder(
 
 1403          llvmModule->getContext(),
 
 1404          llvm::TargetFolder(llvmModule->getDataLayout()));
 
 1405      llvm::Type *eltTy = llvm::StructType::get(
 
 1406          builder.getInt32Ty(), builder.getPtrTy(), builder.getPtrTy());
 
 1407      llvm::ArrayType *at = llvm::ArrayType::get(eltTy, 0);
 
 1408      llvm::Constant *zeroInit = llvm::Constant::getNullValue(at);
 
 1409      (void)
new llvm::GlobalVariable(
 
 1410          *llvmModule, zeroInit->getType(), 
false,
 
 1411          llvm::GlobalValue::AppendingLinkage, zeroInit,
 
 1412          ctorOp ? 
"llvm.global_ctors" : 
"llvm.global_dtors");
 
 1415                       ? llvm::zip(ctorOp.getCtors(), ctorOp.getPriorities())
 
 1416                       : llvm::zip(dtorOp.getDtors(), dtorOp.getPriorities());
 
 1417      auto appendGlobalFn =
 
 1418          ctorOp ? llvm::appendToGlobalCtors : llvm::appendToGlobalDtors;
 
 1419      for (
const auto &[sym, prio] : range) {
 
 1422        appendGlobalFn(*llvmModule, f, cast<IntegerAttr>(prio).getInt(),
 
 1428  for (
auto op : 
getModuleBody(mlirModule).getOps<LLVM::GlobalOp>())
 
 1429    if (
failed(convertDialectAttributes(op, {})))
 
 1434  for (
const auto &[compileUnit, globals] : allGVars) {
 
 1435    compileUnit->replaceGlobalVariables(
 
 1440  for (
auto op : 
getModuleBody(mlirModule).getOps<LLVM::AliasOp>()) {
 
 1441    Block &initializer = op.getInitializerBlock();
 
 1442    llvm::IRBuilder<llvm::TargetFolder> builder(
 
 1443        llvmModule->getContext(),
 
 1444        llvm::TargetFolder(llvmModule->getDataLayout()));
 
 1447      if (
failed(convertOperation(op, builder)))
 
 1454    auto *cst = cast<llvm::Constant>(
lookupValue(ret.getOperand(0)));
 
 1455    assert(aliasesMapping.count(op));
 
 1456    auto *alias = cast<llvm::GlobalAlias>(aliasesMapping[op]);
 
 1457    alias->setAliasee(cst);
 
 1460  for (
auto op : 
getModuleBody(mlirModule).getOps<LLVM::AliasOp>())
 
 1461    if (
failed(convertDialectAttributes(op, {})))
 
 1469                                                const llvm::APInt &value) {
 
 1470  llvm::Constant *constant = llvm::ConstantInt::get(context, value);
 
 1471  return llvm::ConstantAsMetadata::get(constant);
 
 
 1476                                            const llvm::APInt &value) {
 
 
 1484  llvm::Metadata *typeMD =
 
 1485      llvm::ConstantAsMetadata::get(llvm::UndefValue::get(type));
 
 1486  llvm::Metadata *isSignedMD =
 
 1488  return llvm::MDNode::get(context, {typeMD, isSignedMD});
 
 
 1496      values, std::back_inserter(mdValues), [&context](int32_t value) {
 
 1499  return llvm::MDNode::get(context, mdValues);
 
 
 1502LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) {
 
 1505  blockMapping.clear();
 
 1506  valueMapping.clear();
 
 1507  branchMapping.clear();
 
 1511  for (
auto [mlirArg, llvmArg] :
 
 1512       llvm::zip(func.getArguments(), llvmFunc->args()))
 
 1516  if (func.getPersonality()) {
 
 1517    llvm::Type *ty = llvm::PointerType::getUnqual(llvmFunc->getContext());
 
 1518    if (llvm::Constant *pfunc = 
getLLVMConstant(ty, func.getPersonalityAttr(),
 
 1519                                                func.getLoc(), *
this))
 
 1520      llvmFunc->setPersonalityFn(pfunc);
 
 1523  if (std::optional<StringRef> section = func.getSection())
 
 1524    llvmFunc->setSection(*section);
 
 1526  if (func.getArmStreaming())
 
 1527    llvmFunc->addFnAttr(
"aarch64_pstate_sm_enabled");
 
 1528  else if (func.getArmLocallyStreaming())
 
 1529    llvmFunc->addFnAttr(
"aarch64_pstate_sm_body");
 
 1530  else if (func.getArmStreamingCompatible())
 
 1531    llvmFunc->addFnAttr(
"aarch64_pstate_sm_compatible");
 
 1533  if (func.getArmNewZa())
 
 1534    llvmFunc->addFnAttr(
"aarch64_new_za");
 
 1535  else if (func.getArmInZa())
 
 1536    llvmFunc->addFnAttr(
"aarch64_in_za");
 
 1537  else if (func.getArmOutZa())
 
 1538    llvmFunc->addFnAttr(
"aarch64_out_za");
 
 1539  else if (func.getArmInoutZa())
 
 1540    llvmFunc->addFnAttr(
"aarch64_inout_za");
 
 1541  else if (func.getArmPreservesZa())
 
 1542    llvmFunc->addFnAttr(
"aarch64_preserves_za");
 
 1544  if (
auto targetCpu = func.getTargetCpu())
 
 1545    llvmFunc->addFnAttr(
"target-cpu", *targetCpu);
 
 1547  if (
auto tuneCpu = func.getTuneCpu())
 
 1548    llvmFunc->addFnAttr(
"tune-cpu", *tuneCpu);
 
 1550  if (
auto reciprocalEstimates = func.getReciprocalEstimates())
 
 1551    llvmFunc->addFnAttr(
"reciprocal-estimates", *reciprocalEstimates);
 
 1553  if (
auto preferVectorWidth = func.getPreferVectorWidth())
 
 1554    llvmFunc->addFnAttr(
"prefer-vector-width", *preferVectorWidth);
 
 1556  if (
auto attr = func.getVscaleRange())
 
 1557    llvmFunc->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
 
 1559        attr->getMaxRange().getInt()));
 
 1561  if (
auto noInfsFpMath = func.getNoInfsFpMath())
 
 1562    llvmFunc->addFnAttr(
"no-infs-fp-math", llvm::toStringRef(*noInfsFpMath));
 
 1564  if (
auto noNansFpMath = func.getNoNansFpMath())
 
 1565    llvmFunc->addFnAttr(
"no-nans-fp-math", llvm::toStringRef(*noNansFpMath));
 
 1567  if (
auto noSignedZerosFpMath = func.getNoSignedZerosFpMath())
 
 1568    llvmFunc->addFnAttr(
"no-signed-zeros-fp-math",
 
 1569                        llvm::toStringRef(*noSignedZerosFpMath));
 
 1571  if (
auto denormalFpMath = func.getDenormalFpMath())
 
 1572    llvmFunc->addFnAttr(
"denormal-fp-math", *denormalFpMath);
 
 1574  if (
auto denormalFpMathF32 = func.getDenormalFpMathF32())
 
 1575    llvmFunc->addFnAttr(
"denormal-fp-math-f32", *denormalFpMathF32);
 
 1577  if (
auto fpContract = func.getFpContract())
 
 1578    llvmFunc->addFnAttr(
"fp-contract", *fpContract);
 
 1580  if (
auto instrumentFunctionEntry = func.getInstrumentFunctionEntry())
 
 1581    llvmFunc->addFnAttr(
"instrument-function-entry", *instrumentFunctionEntry);
 
 1583  if (
auto instrumentFunctionExit = func.getInstrumentFunctionExit())
 
 1584    llvmFunc->addFnAttr(
"instrument-function-exit", *instrumentFunctionExit);
 
 1587  llvm::LLVMContext &llvmContext = llvmFunc->getContext();
 
 1588  for (
auto &bb : func) {
 
 1589    auto *llvmBB = llvm::BasicBlock::Create(llvmContext);
 
 1590    llvmBB->insertInto(llvmFunc);
 
 1597  for (
Block *bb : blocks) {
 
 1598    CapturingIRBuilder builder(llvmContext,
 
 1599                               llvm::TargetFolder(llvmModule->getDataLayout()));
 
 1600    if (
failed(convertBlockImpl(*bb, bb->isEntryBlock(), builder,
 
 1610  return convertDialectAttributes(func, {});
 
 1613LogicalResult ModuleTranslation::convertDialectAttributes(
 
 1614    Operation *op, ArrayRef<llvm::Instruction *> instructions) {
 
 1616    if (
failed(iface.amendOperation(op, instructions, attribute, *
this)))
 
 1624                                            llvm::Function *llvmFunc) {
 
 1625  if (!
func.getMemoryEffects())
 
 1628  MemoryEffectsAttr memEffects = 
func.getMemoryEffectsAttr();
 
 1631  llvm::MemoryEffects newMemEffects =
 
 1632      llvm::MemoryEffects(llvm::MemoryEffects::Location::ArgMem,
 
 1633                          convertModRefInfoToLLVM(memEffects.getArgMem()));
 
 1634  newMemEffects |= llvm::MemoryEffects(
 
 1635      llvm::MemoryEffects::Location::InaccessibleMem,
 
 1636      convertModRefInfoToLLVM(memEffects.getInaccessibleMem()));
 
 1638      llvm::MemoryEffects(llvm::MemoryEffects::Location::Other,
 
 1639                          convertModRefInfoToLLVM(memEffects.getOther()));
 
 1640  llvmFunc->setMemoryEffects(newMemEffects);
 
 
 1645                                      llvm::Function *llvmFunc) {
 
 1646  if (
func.getNoInlineAttr())
 
 1647    llvmFunc->addFnAttr(llvm::Attribute::NoInline);
 
 1648  if (
func.getAlwaysInlineAttr())
 
 1649    llvmFunc->addFnAttr(llvm::Attribute::AlwaysInline);
 
 1650  if (
func.getInlineHintAttr())
 
 1651    llvmFunc->addFnAttr(llvm::Attribute::InlineHint);
 
 1652  if (
func.getOptimizeNoneAttr())
 
 1653    llvmFunc->addFnAttr(llvm::Attribute::OptimizeNone);
 
 1654  if (
func.getConvergentAttr())
 
 1655    llvmFunc->addFnAttr(llvm::Attribute::Convergent);
 
 1656  if (
func.getNoUnwindAttr())
 
 1657    llvmFunc->addFnAttr(llvm::Attribute::NoUnwind);
 
 1658  if (
func.getWillReturnAttr())
 
 1659    llvmFunc->addFnAttr(llvm::Attribute::WillReturn);
 
 1660  if (TargetFeaturesAttr targetFeatAttr = 
func.getTargetFeaturesAttr())
 
 1661    llvmFunc->addFnAttr(
"target-features", targetFeatAttr.getFeaturesString());
 
 1662  if (FramePointerKindAttr fpAttr = 
func.getFramePointerAttr())
 
 1663    llvmFunc->addFnAttr(
"frame-pointer", stringifyFramePointerKind(
 
 1664                                             fpAttr.getFramePointerKind()));
 
 1665  if (UWTableKindAttr uwTableKindAttr = 
func.getUwtableKindAttr())
 
 1666    llvmFunc->setUWTableKind(
 
 1667        convertUWTableKindToLLVM(uwTableKindAttr.getUwtableKind()));
 
 
 1673                                            llvm::Function *llvmFunc,
 
 1675  llvm::LLVMContext &llvmContext = llvmFunc->getContext();
 
 1677  if (VecTypeHintAttr vecTypeHint = 
func.getVecTypeHintAttr()) {
 
 1678    Type type = vecTypeHint.getHint().getValue();
 
 1679    llvm::Type *llvmType = translation.
convertType(type);
 
 1680    bool isSigned = vecTypeHint.getIsSigned();
 
 1681    llvmFunc->setMetadata(
 
 1682        func.getVecTypeHintAttrName(),
 
 1687          func.getWorkGroupSizeHint()) {
 
 1688    llvmFunc->setMetadata(
 
 1689        func.getWorkGroupSizeHintAttrName(),
 
 1694          func.getReqdWorkGroupSize()) {
 
 1695    llvmFunc->setMetadata(
 
 1696        func.getReqdWorkGroupSizeAttrName(),
 
 1700  if (std::optional<uint32_t> intelReqdSubGroupSize =
 
 1701          func.getIntelReqdSubGroupSize()) {
 
 1702    llvmFunc->setMetadata(
 
 1703        func.getIntelReqdSubGroupSizeAttrName(),
 
 1705                               llvm::APInt(32, *intelReqdSubGroupSize)));
 
 
 1710                                          llvm::Attribute::AttrKind llvmKind,
 
 1715      .Case<TypeAttr>([&](
auto typeAttr) {
 
 1716        attrBuilder.addTypeAttr(
 
 1717            llvmKind, moduleTranslation.
convertType(typeAttr.getValue()));
 
 1720      .Case<IntegerAttr>([&](
auto intAttr) {
 
 1721        attrBuilder.addRawIntAttr(llvmKind, intAttr.getInt());
 
 1724      .Case<UnitAttr>([&](
auto) {
 
 1725        attrBuilder.addAttribute(llvmKind);
 
 1728      .Case<LLVM::ConstantRangeAttr>([&](
auto rangeAttr) {
 
 1729        attrBuilder.addConstantRangeAttr(
 
 1731            llvm::ConstantRange(rangeAttr.getLower(), rangeAttr.getUpper()));
 
 1734      .Default([loc](
auto) {
 
 1735        return emitError(loc, 
"unsupported parameter attribute type");
 
 
 1739FailureOr<llvm::AttrBuilder>
 
 1740ModuleTranslation::convertParameterAttrs(LLVMFuncOp func, 
int argIdx,
 
 1741                                         DictionaryAttr paramAttrs) {
 
 1742  llvm::AttrBuilder attrBuilder(llvmModule->getContext());
 
 1744  Location loc = func.getLoc();
 
 1746  for (
auto namedAttr : paramAttrs) {
 
 1747    auto it = attrNameToKindMapping.find(namedAttr.getName());
 
 1748    if (it != attrNameToKindMapping.end()) {
 
 1749      llvm::Attribute::AttrKind llvmKind = it->second;
 
 1753    } 
else if (namedAttr.getNameDialect()) {
 
 1754      if (
failed(iface.convertParameterAttr(func, argIdx, namedAttr, *
this)))
 
 1763    ArgAndResultAttrsOpInterface attrsOp, llvm::CallBase *call,
 
 1766  if (
ArrayAttr argAttrsArray = attrsOp.getArgAttrsAttr()) {
 
 1767    unsigned argAttrIdx = 0;
 
 1768    llvm::SmallDenseSet<unsigned> immArgPositionsSet(immArgPositions.begin(),
 
 1769                                                     immArgPositions.end());
 
 1770    for (
unsigned argIdx : llvm::seq<unsigned>(call->arg_size())) {
 
 1771      if (argAttrIdx >= argAttrsArray.size())
 
 1774      if (immArgPositionsSet.contains(argIdx))
 
 1777      auto argAttrs = cast<DictionaryAttr>(argAttrsArray[argAttrIdx++]);
 
 1778      if (argAttrs.empty())
 
 1781      FailureOr<llvm::AttrBuilder> attrBuilder =
 
 1782          convertParameterAttrs(attrsOp->getLoc(), argAttrs);
 
 1783      if (failed(attrBuilder))
 
 1785      call->addParamAttrs(argIdx, *attrBuilder);
 
 1790  if (
ArrayAttr resAttrsArray = attrsOp.getResAttrsAttr()) {
 
 1791    if (!resAttrsArray.empty()) {
 
 1792      auto resAttrs = cast<DictionaryAttr>(resAttrsArray[0]);
 
 1793      FailureOr<llvm::AttrBuilder> attrBuilder =
 
 1794          convertParameterAttrs(attrsOp->getLoc(), resAttrs);
 
 1795      if (failed(attrBuilder))
 
 1797      call->addRetAttrs(*attrBuilder);
 
 
 1804FailureOr<llvm::AttrBuilder>
 
 1805ModuleTranslation::convertParameterAttrs(
Location loc,
 
 1806                                         DictionaryAttr paramAttrs) {
 
 1807  llvm::AttrBuilder attrBuilder(llvmModule->getContext());
 
 1810  for (
auto namedAttr : paramAttrs) {
 
 1811    auto it = attrNameToKindMapping.find(namedAttr.getName());
 
 1812    if (it != attrNameToKindMapping.end()) {
 
 1813      llvm::Attribute::AttrKind llvmKind = it->second;
 
 1823LogicalResult ModuleTranslation::convertFunctionSignatures() {
 
 1826  for (
auto function : 
getModuleBody(mlirModule).getOps<LLVMFuncOp>()) {
 
 1827    llvm::FunctionCallee llvmFuncCst = llvmModule->getOrInsertFunction(
 
 1829        cast<llvm::FunctionType>(
convertType(function.getFunctionType())));
 
 1830    llvm::Function *llvmFunc = cast<llvm::Function>(llvmFuncCst.getCallee());
 
 1831    llvmFunc->setLinkage(convertLinkageToLLVM(function.getLinkage()));
 
 1832    llvmFunc->setCallingConv(convertCConvToLLVM(function.getCConv()));
 
 1843    if (std::optional<uint64_t> entryCount = function.getFunctionEntryCount())
 
 1844      llvmFunc->setEntryCount(entryCount.value());
 
 1847    if (
ArrayAttr allResultAttrs = function.getAllResultAttrs()) {
 
 1848      DictionaryAttr resultAttrs = cast<DictionaryAttr>(allResultAttrs[0]);
 
 1849      FailureOr<llvm::AttrBuilder> attrBuilder =
 
 1850          convertParameterAttrs(function, -1, resultAttrs);
 
 1853      llvmFunc->addRetAttrs(*attrBuilder);
 
 1857    for (
auto [argIdx, llvmArg] : llvm::enumerate(llvmFunc->args())) {
 
 1858      if (DictionaryAttr argAttrs = function.getArgAttrDict(argIdx)) {
 
 1859        FailureOr<llvm::AttrBuilder> attrBuilder =
 
 1860            convertParameterAttrs(function, argIdx, argAttrs);
 
 1863        llvmArg.addAttrs(*attrBuilder);
 
 1868    FailureOr<llvm::AttrBuilder> convertedPassthroughAttrs =
 
 1870                                    function.getPassthroughAttr(),
 
 1871                                    function.getPassthroughAttrName());
 
 1872    if (
failed(convertedPassthroughAttrs))
 
 1874    llvmFunc->addFnAttrs(*convertedPassthroughAttrs);
 
 1877    llvmFunc->setVisibility(convertVisibilityToLLVM(function.getVisibility_()));
 
 1880    if (std::optional<mlir::SymbolRefAttr> comdat = function.getComdat()) {
 
 1881      auto selectorOp = cast<ComdatSelectorOp>(
 
 1883      llvmFunc->setComdat(comdatMapping.lookup(selectorOp));
 
 1886    if (
auto gc = function.getGarbageCollector())
 
 1887      llvmFunc->setGC(gc->str());
 
 1889    if (
auto unnamedAddr = function.getUnnamedAddr())
 
 1890      llvmFunc->setUnnamedAddr(convertUnnamedAddrToLLVM(*unnamedAddr));
 
 1892    if (
auto alignment = function.getAlignment())
 
 1893      llvmFunc->setAlignment(llvm::MaybeAlign(*alignment));
 
 1896    debugTranslation->translate(function, *llvmFunc);
 
 1902LogicalResult ModuleTranslation::convertFunctions() {
 
 1904  for (
auto function : 
getModuleBody(mlirModule).getOps<LLVMFuncOp>()) {
 
 1907    if (function.isExternal()) {
 
 1908      if (
failed(convertDialectAttributes(function, {})))
 
 1913    if (
failed(convertOneFunction(function)))
 
 1920LogicalResult ModuleTranslation::convertIFuncs() {
 
 1921  for (
auto op : 
getModuleBody(mlirModule).getOps<IFuncOp>()) {
 
 1922    llvm::Type *type = 
convertType(op.getIFuncType());
 
 1923    llvm::GlobalValue::LinkageTypes linkage =
 
 1924        convertLinkageToLLVM(op.getLinkage());
 
 1925    llvm::Constant *resolver;
 
 1927      resolver = cast<llvm::Constant>(resolverFn);
 
 1930                                                        op.getResolverAttr());
 
 1931      resolver = cast<llvm::Constant>(
lookupAlias(aliasOp));
 
 1935        llvm::GlobalIFunc::create(type, op.getAddressSpace(), linkage,
 
 1936                                  op.getSymName(), resolver, llvmModule.get());
 
 1938    ifunc->setUnnamedAddr(convertUnnamedAddrToLLVM(op.getUnnamedAddr()));
 
 1939    ifunc->setVisibility(convertVisibilityToLLVM(op.getVisibility_()));
 
 1941    ifuncMapping.try_emplace(op, ifunc);
 
 1947LogicalResult ModuleTranslation::convertComdats() {
 
 1948  for (
auto comdatOp : 
getModuleBody(mlirModule).getOps<ComdatOp>()) {
 
 1949    for (
auto selectorOp : comdatOp.getOps<ComdatSelectorOp>()) {
 
 1951      if (module->getComdatSymbolTable().contains(selectorOp.getSymName()))
 
 1953               << 
"comdat selection symbols must be unique even in different " 
 1955      llvm::Comdat *comdat = 
module->getOrInsertComdat(selectorOp.getSymName());
 
 1956      comdat->setSelectionKind(convertComdatToLLVM(selectorOp.getComdat()));
 
 1957      comdatMapping.try_emplace(selectorOp, comdat);
 
 1963LogicalResult ModuleTranslation::convertUnresolvedBlockAddress() {
 
 1964  for (
auto &[blockAddressOp, llvmCst] : unresolvedBlockAddressMapping) {
 
 1965    BlockAddressAttr blockAddressAttr = blockAddressOp.getBlockAddr();
 
 1967    assert(llvmBlock && 
"expected LLVM blocks to be already translated");
 
 1970    auto *llvmBlockAddr = llvm::BlockAddress::get(
 
 1971        lookupFunction(blockAddressAttr.getFunction().getValue()), llvmBlock);
 
 1972    llvmCst->replaceAllUsesWith(llvmBlockAddr);
 
 1973    assert(llvmCst->use_empty() && 
"expected all uses to be replaced");
 
 1974    cast<llvm::GlobalVariable>(llvmCst)->eraseFromParent();
 
 1976  unresolvedBlockAddressMapping.clear();
 
 1981                                                llvm::Instruction *inst) {
 
 1982  if (llvm::MDNode *node = loopAnnotationTranslation->getAccessGroups(op))
 
 1983    inst->setMetadata(llvm::LLVMContext::MD_access_group, node);
 
 
 1988  auto [scopeIt, scopeInserted] =
 
 1989      aliasScopeMetadataMapping.try_emplace(aliasScopeAttr, 
nullptr);
 
 1991    return scopeIt->second;
 
 1992  llvm::LLVMContext &ctx = llvmModule->getContext();
 
 1993  auto dummy = llvm::MDNode::getTemporary(ctx, {});
 
 1995  auto [domainIt, insertedDomain] = aliasDomainMetadataMapping.try_emplace(
 
 1996      aliasScopeAttr.getDomain(), 
nullptr);
 
 1997  if (insertedDomain) {
 
 2000    operands.push_back(dummy.get());
 
 2001    if (StringAttr description = aliasScopeAttr.getDomain().getDescription())
 
 2002      operands.push_back(llvm::MDString::get(ctx, description));
 
 2003    domainIt->second = llvm::MDNode::get(ctx, operands);
 
 2006    if (
auto stringAttr =
 
 2007            dyn_cast<StringAttr>(aliasScopeAttr.getDomain().getId()))
 
 2008      replacement = llvm::MDString::get(ctx, stringAttr.getValue());
 
 2011    domainIt->second->replaceOperandWith(0, 
replacement);
 
 2014  assert(domainIt->second && 
"Scope's domain should already be valid");
 
 2017  operands.push_back(dummy.get());
 
 2018  operands.push_back(domainIt->second);
 
 2019  if (StringAttr description = aliasScopeAttr.getDescription())
 
 2020    operands.push_back(llvm::MDString::get(ctx, description));
 
 2021  scopeIt->second = llvm::MDNode::get(ctx, operands);
 
 2024  if (
auto stringAttr = dyn_cast<StringAttr>(aliasScopeAttr.getId()))
 
 2025    replacement = llvm::MDString::get(ctx, stringAttr.getValue());
 
 2028  scopeIt->second->replaceOperandWith(0, 
replacement);
 
 2029  return scopeIt->second;
 
 
 2035  nodes.reserve(aliasScopeAttrs.size());
 
 2036  for (AliasScopeAttr aliasScopeAttr : aliasScopeAttrs)
 
 
 2042                                              llvm::Instruction *inst) {
 
 2043  auto populateScopeMetadata = [&](
ArrayAttr aliasScopeAttrs, 
unsigned kind) {
 
 2044    if (!aliasScopeAttrs || aliasScopeAttrs.empty())
 
 2047        llvm::to_vector(aliasScopeAttrs.getAsRange<AliasScopeAttr>()));
 
 2048    inst->setMetadata(kind, node);
 
 2051  populateScopeMetadata(op.getAliasScopesOrNull(),
 
 2052                        llvm::LLVMContext::MD_alias_scope);
 
 2053  populateScopeMetadata(op.getNoAliasScopesOrNull(),
 
 2054                        llvm::LLVMContext::MD_noalias);
 
 
 2057llvm::MDNode *ModuleTranslation::getTBAANode(TBAATagAttr tbaaAttr)
 const {
 
 2058  return tbaaMetadataMapping.lookup(tbaaAttr);
 
 2062                                        llvm::Instruction *inst) {
 
 2063  ArrayAttr tagRefs = op.getTBAATagsOrNull();
 
 2064  if (!tagRefs || tagRefs.empty())
 
 2071  if (tagRefs.size() > 1) {
 
 2072    op.emitWarning() << 
"TBAA access tags were not translated, because LLVM " 
 2073                        "IR only supports a single tag per instruction";
 
 2077  llvm::MDNode *node = getTBAANode(cast<TBAATagAttr>(tagRefs[0]));
 
 2078  inst->setMetadata(llvm::LLVMContext::MD_tbaa, node);
 
 
 2082    DereferenceableOpInterface op, llvm::Instruction *inst) {
 
 2083  DereferenceableAttr derefAttr = op.getDereferenceableOrNull();
 
 2087  llvm::MDNode *derefSizeNode = llvm::MDNode::get(
 
 2089      llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
 
 2090          llvm::IntegerType::get(
getLLVMContext(), 64), derefAttr.getBytes())));
 
 2091  unsigned kindId = derefAttr.getMayBeNull()
 
 2092                        ? llvm::LLVMContext::MD_dereferenceable_or_null
 
 2093                        : llvm::LLVMContext::MD_dereferenceable;
 
 2094  inst->setMetadata(kindId, derefSizeNode);
 
 
 2099  llvm::transform(op.getWeights(), std::back_inserter(weights),
 
 2100                  [](int32_t value) { return static_cast<uint32_t>(value); });
 
 2101  if (weights.empty())
 
 2105  assert(inst && 
"expected the operation to have a mapping to an instruction");
 
 2107      llvm::LLVMContext::MD_prof,
 
 
 2111LogicalResult ModuleTranslation::createTBAAMetadata() {
 
 2112  llvm::LLVMContext &ctx = llvmModule->getContext();
 
 2113  llvm::IntegerType *offsetTy = llvm::IntegerType::get(ctx, 64);
 
 2124  walker.
addWalk([&](TBAARootAttr root) {
 
 2125    tbaaMetadataMapping.insert(
 
 2126        {root, llvm::MDNode::get(ctx, llvm::MDString::get(ctx, root.getId()))});
 
 2129  walker.
addWalk([&](TBAATypeDescriptorAttr descriptor) {
 
 2131    operands.push_back(llvm::MDString::get(ctx, descriptor.getId()));
 
 2132    for (TBAAMemberAttr member : descriptor.getMembers()) {
 
 2133      operands.push_back(tbaaMetadataMapping.lookup(member.getTypeDesc()));
 
 2134      operands.push_back(llvm::ConstantAsMetadata::get(
 
 2135          llvm::ConstantInt::get(offsetTy, member.getOffset())));
 
 2138    tbaaMetadataMapping.insert({descriptor, llvm::MDNode::get(ctx, operands)});
 
 2141  walker.
addWalk([&](TBAATagAttr tag) {
 
 2142    SmallVector<llvm::Metadata *> operands;
 
 2144    operands.push_back(tbaaMetadataMapping.lookup(tag.getBaseType()));
 
 2145    operands.push_back(tbaaMetadataMapping.lookup(tag.getAccessType()));
 
 2147    operands.push_back(llvm::ConstantAsMetadata::get(
 
 2148        llvm::ConstantInt::get(offsetTy, tag.getOffset())));
 
 2149    if (tag.getConstant())
 
 2151          llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(offsetTy, 1)));
 
 2153    tbaaMetadataMapping.insert({tag, llvm::MDNode::get(ctx, operands)});
 
 2156  mlirModule->walk([&](AliasAnalysisOpInterface analysisOpInterface) {
 
 2157    if (
auto attr = analysisOpInterface.getTBAATagsOrNull())
 
 2164LogicalResult ModuleTranslation::createIdentMetadata() {
 
 2165  if (
auto attr = mlirModule->getAttrOfType<StringAttr>(
 
 2166          LLVMDialect::getIdentAttrName())) {
 
 2167    StringRef ident = attr;
 
 2168    llvm::LLVMContext &ctx = llvmModule->getContext();
 
 2169    llvm::NamedMDNode *namedMd =
 
 2170        llvmModule->getOrInsertNamedMetadata(LLVMDialect::getIdentAttrName());
 
 2171    llvm::MDNode *md = llvm::MDNode::get(ctx, llvm::MDString::get(ctx, ident));
 
 2172    namedMd->addOperand(md);
 
 2178LogicalResult ModuleTranslation::createCommandlineMetadata() {
 
 2179  if (
auto attr = mlirModule->getAttrOfType<StringAttr>(
 
 2180          LLVMDialect::getCommandlineAttrName())) {
 
 2181    StringRef cmdLine = attr;
 
 2182    llvm::LLVMContext &ctx = llvmModule->getContext();
 
 2183    llvm::NamedMDNode *nmd = llvmModule->getOrInsertNamedMetadata(
 
 2184        LLVMDialect::getCommandlineAttrName());
 
 2186        llvm::MDNode::get(ctx, llvm::MDString::get(ctx, cmdLine));
 
 2187    nmd->addOperand(md);
 
 2193LogicalResult ModuleTranslation::createDependentLibrariesMetadata() {
 
 2194  if (
auto dependentLibrariesAttr = mlirModule->getDiscardableAttr(
 
 2195          LLVM::LLVMDialect::getDependentLibrariesAttrName())) {
 
 2197        llvmModule->getOrInsertNamedMetadata(
"llvm.dependent-libraries");
 
 2198    llvm::LLVMContext &ctx = llvmModule->getContext();
 
 2200         cast<ArrayAttr>(dependentLibrariesAttr).getAsRange<StringAttr>()) {
 
 2202          llvm::MDNode::get(ctx, llvm::MDString::get(ctx, libAttr.getValue()));
 
 2203      nmd->addOperand(md);
 
 2210                                        llvm::Instruction *inst) {
 
 2211  LoopAnnotationAttr attr =
 
 2213          .Case<LLVM::BrOp, LLVM::CondBrOp>(
 
 2214              [](
auto branchOp) { 
return branchOp.getLoopAnnotationAttr(); });
 
 2217  llvm::MDNode *loopMD =
 
 2218      loopAnnotationTranslation->translateLoopAnnotation(attr, op);
 
 2219  inst->setMetadata(llvm::LLVMContext::MD_loop, loopMD);
 
 
 2223  auto iface = cast<DisjointFlagInterface>(op);
 
 2225  if (
auto disjointInst = dyn_cast<llvm::PossiblyDisjointInst>(value))
 
 2226    disjointInst->setIsDisjoint(iface.getIsDisjoint());
 
 
 2230  return typeTranslator.translateType(type);
 
 
 2236  remapped.reserve(values.size());
 
 2237  for (
Value v : values)
 
 
 2244    ompBuilder = std::make_unique<llvm::OpenMPIRBuilder>(*llvmModule);
 
 2249    llvm::OpenMPIRBuilderConfig 
config(
 
 2256    unsigned int defaultAS =
 
 2258    config.setDefaultTargetAS(defaultAS);
 
 2259    ompBuilder->setConfig(std::move(
config));
 
 2260    ompBuilder->initialize();
 
 2262  return ompBuilder.get();
 
 
 2266                                                  llvm::DILocalScope *scope) {
 
 2267  return debugTranslation->translateLoc(loc, scope);
 
 
 2272  return debugTranslation->translateExpression(attr);
 
 
 2275llvm::DIGlobalVariableExpression *
 
 2277    LLVM::DIGlobalVariableExpressionAttr attr) {
 
 2278  return debugTranslation->translateGlobalVariableExpression(attr);
 
 
 2282  return debugTranslation->translate(attr);
 
 
 2287  return convertRoundingModeToLLVM(rounding);
 
 
 2291    LLVM::FPExceptionBehavior exceptionBehavior) {
 
 2292  return convertFPExceptionBehaviorToLLVM(exceptionBehavior);
 
 
 2297  return llvmModule->getOrInsertNamedMetadata(name);
 
 
 2300static std::unique_ptr<llvm::Module>
 
 2304  auto llvmModule = std::make_unique<llvm::Module>(name, llvmContext);
 
 2305  if (
auto dataLayoutAttr =
 
 2307    llvmModule->setDataLayout(cast<StringAttr>(dataLayoutAttr).getValue());
 
 2309    FailureOr<llvm::DataLayout> llvmDataLayout(llvm::DataLayout(
""));
 
 2310    if (
auto iface = dyn_cast<DataLayoutOpInterface>(m)) {
 
 2311      if (DataLayoutSpecInterface spec = iface.getDataLayoutSpec()) {
 
 2315    } 
else if (
auto mod = dyn_cast<ModuleOp>(m)) {
 
 2316      if (DataLayoutSpecInterface spec = mod.getDataLayoutSpec()) {
 
 2321    if (failed(llvmDataLayout))
 
 2323    llvmModule->setDataLayout(*llvmDataLayout);
 
 2325  if (
auto targetTripleAttr =
 
 2327    llvmModule->setTargetTriple(
 
 2328        llvm::Triple(cast<StringAttr>(targetTripleAttr).getValue()));
 
 2331          LLVM::LLVMDialect::getModuleLevelAsmAttrName())) {
 
 2332    auto asmArrayAttr = dyn_cast<ArrayAttr>(asmAttr);
 
 2333    if (!asmArrayAttr) {
 
 2334      m->
emitError(
"expected an array attribute for a module level asm");
 
 2339      auto asmStrAttr = dyn_cast<StringAttr>(elt);
 
 2342            "expected a string attribute for each entry of a module level asm");
 
 2345      llvmModule->appendModuleInlineAsm(asmStrAttr.getValue());
 
 
 2352std::unique_ptr<llvm::Module>
 
 2354                              StringRef name, 
bool disableVerification) {
 
 2356    module->emitOpError("can not be translated to an LLVMIR module");
 
 2360  std::unique_ptr<llvm::Module> llvmModule =
 
 2369  llvm::IRBuilder<llvm::TargetFolder> llvmBuilder(
 
 2371      llvm::TargetFolder(translator.getLLVMModule()->getDataLayout()));
 
 2377  if (
failed(translator.convertOperation(*module, llvmBuilder)))
 
 2380  if (
failed(translator.convertComdats()))
 
 2382  if (
failed(translator.convertFunctionSignatures()))
 
 2384  if (
failed(translator.convertGlobalsAndAliases()))
 
 2386  if (
failed(translator.convertIFuncs()))
 
 2388  if (
failed(translator.createTBAAMetadata()))
 
 2390  if (
failed(translator.createIdentMetadata()))
 
 2392  if (
failed(translator.createCommandlineMetadata()))
 
 2394  if (
failed(translator.createDependentLibrariesMetadata()))
 
 2398  for (Operation &o : 
getModuleBody(module).getOperations()) {
 
 2399    if (!isa<LLVM::LLVMFuncOp, LLVM::AliasOp, LLVM::GlobalOp,
 
 2400             LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp,
 
 2401             LLVM::IFuncOp>(&o) &&
 
 2402        !o.hasTrait<OpTrait::IsTerminator>() &&
 
 2403        failed(translator.convertOperation(o, llvmBuilder))) {
 
 2411  if (
failed(translator.convertFunctions()))
 
 2416  if (
failed(translator.convertUnresolvedBlockAddress()))
 
 2421  translator.debugTranslation->addModuleFlagsIfNotPresent();
 
 2424  if (
auto *ompBuilder = translator.getOpenMPBuilder())
 
 2425    ompBuilder->finalize();
 
 2427  if (!disableVerification &&
 
 2428      llvm::verifyModule(*translator.llvmModule, &llvm::errs()))
 
 2431  return std::move(translator.llvmModule);