diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2025-04-14 14:11:30 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-14 14:11:30 -0700 |
commit | 52166339f1f74f7d97a54eaf687bb5de167f040d (patch) | |
tree | a2e2bfc71c27b1ce0d1c648d1dd8678acecf089b /mlir/lib/Target/LLVMIR/ModuleImport.cpp | |
parent | 9ba65cbcb5ea24d8f65cbe82474b7513501c5470 (diff) | |
download | llvm-52166339f1f74f7d97a54eaf687bb5de167f040d.zip llvm-52166339f1f74f7d97a54eaf687bb5de167f040d.tar.gz llvm-52166339f1f74f7d97a54eaf687bb5de167f040d.tar.bz2 |
[MLIR][LLVM] Support for indirectbr (#135092)
Now that LLVM dialect has `blockaddress` support, introduce import/translation for `indirectbr` instruction.
Diffstat (limited to 'mlir/lib/Target/LLVMIR/ModuleImport.cpp')
-rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleImport.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index 8e7a7ab..346a0ed 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1988,6 +1988,35 @@ LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) { return success(); } + if (inst->getOpcode() == llvm::Instruction::IndirectBr) { + auto *indBrInst = cast<llvm::IndirectBrInst>(inst); + + FailureOr<Value> basePtr = convertValue(indBrInst->getAddress()); + if (failed(basePtr)) + return failure(); + + SmallVector<Block *> succBlocks; + // `succBlockArgs` is storage for the block arguments ranges used in + // `succBlockArgsRange`, so the later references live data. + SmallVector<SmallVector<Value>> succBlockArgs; + SmallVector<ValueRange> succBlockArgsRange; + for (auto i : llvm::seq<unsigned>(0, indBrInst->getNumSuccessors())) { + llvm::BasicBlock *succ = indBrInst->getSuccessor(i); + SmallVector<Value> blockArgs; + if (failed(convertBranchArgs(indBrInst, succ, blockArgs))) + return failure(); + succBlocks.push_back(lookupBlock(succ)); + succBlockArgs.push_back(blockArgs); + succBlockArgsRange.push_back(succBlockArgs.back()); + } + Location loc = translateLoc(inst->getDebugLoc()); + auto indBrOp = builder.create<LLVM::IndirectBrOp>( + loc, *basePtr, succBlockArgsRange, succBlocks); + + mapNoResultOp(inst, indBrOp); + return success(); + } + // Convert all instructions that have an mlirBuilder. if (succeeded(convertInstructionImpl(builder, inst, *this, iface))) return success(); @@ -1998,8 +2027,8 @@ LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) { LogicalResult ModuleImport::processInstruction(llvm::Instruction *inst) { // FIXME: Support uses of SubtargetData. // FIXME: Add support for call / operand attributes. - // FIXME: Add support for the indirectbr, cleanupret, catchret, catchswitch, - // callbr, vaarg, catchpad, cleanuppad instructions. + // FIXME: Add support for the cleanupret, catchret, catchswitch, callbr, + // vaarg, catchpad, cleanuppad instructions. // Convert LLVM intrinsics calls to MLIR intrinsics. if (auto *intrinsic = dyn_cast<llvm::IntrinsicInst>(inst)) |