[llvm-branch-commits] [mlir] 64c0c6e - Revert "[MLIR][LLVM] Support for indirectbr (#135092)"

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Apr 14 16:08:11 PDT 2025


Author: Bruno Cardoso Lopes
Date: 2025-04-14T16:08:09-07:00
New Revision: 64c0c6e2e568a720b0b6755872745b86b51b03f7

URL: https://github.com/llvm/llvm-project/commit/64c0c6e2e568a720b0b6755872745b86b51b03f7
DIFF: https://github.com/llvm/llvm-project/commit/64c0c6e2e568a720b0b6755872745b86b51b03f7.diff

LOG: Revert "[MLIR][LLVM] Support for indirectbr (#135092)"

This reverts commit 52166339f1f74f7d97a54eaf687bb5de167f040d.

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
    mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
    mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
    mlir/lib/Target/LLVMIR/ModuleImport.cpp
    mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
    mlir/test/Dialect/LLVMIR/blockaddress-canonicalize.mlir
    mlir/test/Target/LLVMIR/Import/import-failure.ll
    mlir/test/mlir-translate/import-diagnostics.ll

Removed: 
    mlir/test/Dialect/LLVMIR/indirectbr.mlir
    mlir/test/Target/LLVMIR/Import/indirectbr.ll
    mlir/test/Target/LLVMIR/indirectbr.mlir


################################################################################
diff  --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index d23c771190597..e89e78aec7147 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -1690,7 +1690,8 @@ def LLVM_BlockTagOp : LLVM_Op<"blocktag"> {
     the target address.
 
     A given function should have at most one `llvm.blocktag` operation with a
-    given `tag`. This operation cannot be used as a terminator.
+    given `tag`. This operation cannot be used as a terminator but can be
+    placed everywhere else in a block.
 
     Example:
 
@@ -1710,66 +1711,6 @@ def LLVM_BlockTagOp : LLVM_Op<"blocktag"> {
   let hasVerifier = 0;
 }
 
-//===----------------------------------------------------------------------===//
-// IndirectBrOp
-//===----------------------------------------------------------------------===//
-
-def LLVM_IndirectBrOp : LLVM_TerminatorOp<"indirectbr",
-    [SameVariadicOperandSize, DeclareOpInterfaceMethods<BranchOpInterface>,
-     Pure]> {
-  let description = [{
-    Transfer control flow to address in `$addr`. A list of possible target
-    blocks in `$successors` can be provided and maybe used as a hint in LLVM:
-
-    ```mlir
-    ...
-    llvm.func @g(...
-      %dest = llvm.blockaddress <function = @g, tag = <id = 0>> : !llvm.ptr
-      llvm.indirectbr %dest : !llvm.ptr, [
-        ^head
-      ]
-    ^head:
-      llvm.blocktag <id = 0>
-      llvm.return %arg0 : i32
-      ...
-    ```
-
-    It also supports a list of operands that can be passed to a target block:
-
-    ```mlir
-      llvm.indirectbr %dest : !llvm.ptr, [
-        ^head(%arg0 : i32),
-        ^tail(%arg1, %arg0 : i32, i32)
-      ]
-    ^head(%r0 : i32):
-      llvm.return %r0 : i32
-    ^tail(%r1 : i32, %r2 : i32):
-      ...
-    ```
-  }];
-  let arguments = (ins LLVM_AnyPointer:$addr,
-    VariadicOfVariadic<AnyType, "indbr_operand_segments">:$succOperands,
-    DenseI32ArrayAttr:$indbr_operand_segments
-  );
-  let successors = (successor VariadicSuccessor<AnySuccessor>:$successors);
-  let assemblyFormat = [{
-    $addr `:` type($addr) `,`
-      custom<IndirectBrOpSucessors>(ref(type($addr)),
-                                    $successors,
-                                    $succOperands,
-                                    type($succOperands))
-    attr-dict
-  }];
-
-  let skipDefaultBuilders = 1;
-  let builders = [
-    OpBuilder<(ins "Value":$addr,
-      CArg<"ArrayRef<ValueRange>", "{}">:$succOperands,
-      CArg<"BlockRange", "{}">:$successors
-      )>
-  ];
-}
-
 def LLVM_ComdatSelectorOp : LLVM_Op<"comdat_selector", [Symbol]> {
   let arguments = (ins
     SymbolNameAttr:$sym_name,

diff  --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 0022be84c212e..d1d00ca9681ec 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -2240,21 +2240,24 @@ static LogicalResult verifyComdat(Operation *op,
 
 static LogicalResult verifyBlockTags(LLVMFuncOp funcOp) {
   llvm::DenseSet<BlockTagAttr> blockTags;
-  // Note that presence of `BlockTagOp`s currently can't prevent an unrecheable
-  // block to be removed by canonicalizer's region simplify pass, which needs to
-  // be dialect aware to allow extra constraints to be described.
-  WalkResult res = funcOp.walk([&](BlockTagOp blockTagOp) {
-    if (blockTags.contains(blockTagOp.getTag())) {
-      blockTagOp.emitError()
-          << "duplicate block tag '" << blockTagOp.getTag().getId()
-          << "' in the same function: ";
-      return WalkResult::interrupt();
-    }
-    blockTags.insert(blockTagOp.getTag());
-    return WalkResult::advance();
-  });
+  BlockTagOp badBlockTagOp;
+  if (funcOp
+          .walk([&](BlockTagOp blockTagOp) {
+            if (blockTags.contains(blockTagOp.getTag())) {
+              badBlockTagOp = blockTagOp;
+              return WalkResult::interrupt();
+            }
+            blockTags.insert(blockTagOp.getTag());
+            return WalkResult::advance();
+          })
+          .wasInterrupted()) {
+    badBlockTagOp.emitError()
+        << "duplicate block tag '" << badBlockTagOp.getTag().getId()
+        << "' in the same function: ";
+    return failure();
+  }
 
-  return failure(res.wasInterrupted());
+  return success();
 }
 
 /// Parse common attributes that might show up in the same order in both
@@ -3815,78 +3818,6 @@ LogicalResult BlockAddressOp::verify() {
 /// attribute.
 OpFoldResult BlockAddressOp::fold(FoldAdaptor) { return getBlockAddr(); }
 
-//===----------------------------------------------------------------------===//
-// LLVM::IndirectBrOp
-//===----------------------------------------------------------------------===//
-
-SuccessorOperands IndirectBrOp::getSuccessorOperands(unsigned index) {
-  assert(index < getNumSuccessors() && "invalid successor index");
-  return SuccessorOperands(getSuccOperandsMutable()[index]);
-}
-
-void IndirectBrOp::build(OpBuilder &odsBuilder, OperationState &odsState,
-                         Value addr, ArrayRef<ValueRange> succOperands,
-                         BlockRange successors) {
-  odsState.addOperands(addr);
-  for (ValueRange range : succOperands)
-    odsState.addOperands(range);
-  SmallVector<int32_t> rangeSegments;
-  for (ValueRange range : succOperands)
-    rangeSegments.push_back(range.size());
-  odsState.getOrAddProperties<Properties>().indbr_operand_segments =
-      odsBuilder.getDenseI32ArrayAttr(rangeSegments);
-  odsState.addSuccessors(successors);
-}
-
-static ParseResult parseIndirectBrOpSucessors(
-    OpAsmParser &parser, Type &flagType,
-    SmallVectorImpl<Block *> &succOperandBlocks,
-    SmallVectorImpl<SmallVector<OpAsmParser::UnresolvedOperand>> &succOperands,
-    SmallVectorImpl<SmallVector<Type>> &succOperandsTypes) {
-  if (failed(parser.parseCommaSeparatedList(
-          OpAsmParser::Delimiter::Square,
-          [&]() {
-            Block *destination = nullptr;
-            SmallVector<OpAsmParser::UnresolvedOperand> operands;
-            SmallVector<Type> operandTypes;
-
-            if (parser.parseSuccessor(destination).failed())
-              return failure();
-
-            if (succeeded(parser.parseOptionalLParen())) {
-              if (failed(parser.parseOperandList(
-                      operands, OpAsmParser::Delimiter::None)) ||
-                  failed(parser.parseColonTypeList(operandTypes)) ||
-                  failed(parser.parseRParen()))
-                return failure();
-            }
-            succOperandBlocks.push_back(destination);
-            succOperands.emplace_back(operands);
-            succOperandsTypes.emplace_back(operandTypes);
-            return success();
-          },
-          "successor blocks")))
-    return failure();
-  return success();
-}
-
-static void
-printIndirectBrOpSucessors(OpAsmPrinter &p, IndirectBrOp op, Type flagType,
-                           SuccessorRange succs, OperandRangeRange succOperands,
-                           const TypeRangeRange &succOperandsTypes) {
-  p << "[";
-  llvm::interleave(
-      llvm::zip(succs, succOperands),
-      [&](auto i) {
-        p.printNewline();
-        p.printSuccessorAndUseList(std::get<0>(i), std::get<1>(i));
-      },
-      [&] { p << ','; });
-  if (!succOperands.empty())
-    p.printNewline();
-  p << "]";
-}
-
 //===----------------------------------------------------------------------===//
 // AssumeOp (intrinsic)
 //===----------------------------------------------------------------------===//

diff  --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
index 7038b5d73d266..ad48ca2ce8ad3 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
@@ -505,15 +505,6 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
     moduleTranslation.mapBranch(&opInst, switchInst);
     return success();
   }
-  if (auto indBrOp = dyn_cast<LLVM::IndirectBrOp>(opInst)) {
-    llvm::IndirectBrInst *indBr = builder.CreateIndirectBr(
-        moduleTranslation.lookupValue(indBrOp.getAddr()),
-        indBrOp->getNumSuccessors());
-    for (auto *succ : indBrOp.getSuccessors())
-      indBr->addDestination(moduleTranslation.lookupBlock(succ));
-    moduleTranslation.mapBranch(&opInst, indBr);
-    return success();
-  }
 
   // Emit addressof.  We need to look up the global value referenced by the
   // operation and store it in the MLIR-to-LLVM value mapping.  This does not

diff  --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index 346a0ed738fe5..8e7a7ab95b6b6 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -1988,35 +1988,6 @@ 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();
@@ -2027,8 +1998,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 cleanupret, catchret, catchswitch, callbr,
-  // vaarg, catchpad, cleanuppad instructions.
+  // FIXME: Add support for the indirectbr, cleanupret, catchret, catchswitch,
+  // callbr, vaarg, catchpad, cleanuppad instructions.
 
   // Convert LLVM intrinsics calls to MLIR intrinsics.
   if (auto *intrinsic = dyn_cast<llvm::IntrinsicInst>(inst))

diff  --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 70bc0f0001c3a..ee7dc3a5231f4 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -805,14 +805,6 @@ static Value getPHISourceValue(Block *current, Block *pred,
         return switchOp.getCaseOperands(i.index())[index];
   }
 
-  if (auto indBrOp = dyn_cast<LLVM::IndirectBrOp>(terminator)) {
-    // For indirect branches we take operands for each successor.
-    for (const auto &i : llvm::enumerate(indBrOp->getSuccessors())) {
-      if (indBrOp->getSuccessor(i.index()) == current)
-        return indBrOp.getSuccessorOperands(i.index())[index];
-    }
-  }
-
   if (auto invokeOp = dyn_cast<LLVM::InvokeOp>(terminator)) {
     return invokeOp.getNormalDest() == current
                ? invokeOp.getNormalDestOperands()[index]

diff  --git a/mlir/test/Dialect/LLVMIR/blockaddress-canonicalize.mlir b/mlir/test/Dialect/LLVMIR/blockaddress-canonicalize.mlir
index 241a2ea2edc66..11dd6f0d97f78 100644
--- a/mlir/test/Dialect/LLVMIR/blockaddress-canonicalize.mlir
+++ b/mlir/test/Dialect/LLVMIR/blockaddress-canonicalize.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -pass-pipeline='builtin.module(llvm.func(canonicalize{region-simplify=aggressive}))' -verify-diagnostics -split-input-file | FileCheck %s
+// RUN: mlir-opt %s -pass-pipeline='builtin.module(llvm.func(canonicalize{region-simplify=aggressive}))' -split-input-file | FileCheck %s
 
 llvm.mlir.global private @x() {addr_space = 0 : i32, dso_local} : !llvm.ptr {
   %0 = llvm.blockaddress <function = @ba, tag = <id = 2>> : !llvm.ptr

diff  --git a/mlir/test/Dialect/LLVMIR/indirectbr.mlir b/mlir/test/Dialect/LLVMIR/indirectbr.mlir
deleted file mode 100644
index 63bdfea0c3095..0000000000000
--- a/mlir/test/Dialect/LLVMIR/indirectbr.mlir
+++ /dev/null
@@ -1,83 +0,0 @@
-// RUN: mlir-opt -split-input-file --verify-roundtrip %s | FileCheck %s
-
-llvm.func @ib0(%dest : !llvm.ptr, %arg0 : i32, %arg1 : i32) -> i32 {
-  llvm.indirectbr %dest : !llvm.ptr, [
-  ^head(%arg0 : i32),
-  ^tail(%arg1, %arg0 : i32, i32)
-  ]
-^head(%r0 : i32):
-  llvm.return %r0 : i32
-^tail(%r1 : i32, %r2 : i32):
-  %r = llvm.add %r1, %r2 : i32
-  llvm.return %r : i32
-}
-
-// CHECK: llvm.func @ib0(%[[Addr:.*]]: !llvm.ptr, %[[A0:.*]]: i32, %[[A1:.*]]: i32) -> i32 {
-// CHECK:   llvm.indirectbr %[[Addr]] : !llvm.ptr, [
-// CHECK:   ^bb1(%[[A0:.*]] : i32)
-// CHECK:   ^bb2(%[[A1:.*]], %[[A0]] : i32, i32)
-// CHECK:   ]
-// CHECK: ^bb1(%[[Op0:.*]]: i32):
-// CHECK:   llvm.return %[[Op0]] : i32
-// CHECK: ^bb2(%[[Op1:.*]]: i32, %[[Op2:.*]]: i32):
-// CHECK:   %[[Op3:.*]] = llvm.add %[[Op1]], %[[Op2]] : i32
-// CHECK:   llvm.return %[[Op3]] : i32
-// CHECK: }
-
-// -----
-
-llvm.func @ib1(%dest : !llvm.ptr) {
-  llvm.indirectbr %dest : !llvm.ptr, []
-}
-
-// CHECK: llvm.func @ib1(%[[Addr:.*]]: !llvm.ptr) {
-// CHECK:   llvm.indirectbr %[[Addr]] : !llvm.ptr, []
-// CHECK: }
-
-// -----
-
-// CHECK: llvm.func @test_indirectbr_phi(
-// CHECK-SAME: %arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr, %arg3: i32) -> i32 {
-llvm.func @callee(!llvm.ptr, i32, i32) -> i32
-llvm.func @test_indirectbr_phi(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr, %arg3: i32) -> i32 {
-  %0 = llvm.mlir.undef : i1
-  %1 = llvm.mlir.addressof @test_indirectbr_phi : !llvm.ptr
-  %2 = llvm.blockaddress <function = @test_indirectbr_phi, tag = <id = 1>> : !llvm.ptr
-  // CHECK:   %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
-  %3 = llvm.mlir.constant(1 : i32) : i32
-  // CHECK:   %[[TWO:.*]] = llvm.mlir.constant(2 : i32) : i32
-  %4 = llvm.mlir.constant(2 : i32) : i32
-  %5 = llvm.select %0, %2, %arg0 : i1, !llvm.ptr
-  // CHECK:   llvm.indirectbr {{.*}} : !llvm.ptr, [
-  // CHECK:   ^[[HEAD_BB:.*]],
-  // CHECK:   ^[[TAIL_BB:.*]](%[[ONE]] : i32)
-  // CHECK:   ]
-  llvm.indirectbr %5 : !llvm.ptr, [
-  ^bb1,
-  ^bb2(%3 : i32)
-  ]
-^bb1:
-  // CHECK: ^[[HEAD_BB]]:
-  // CHECK:   llvm.indirectbr {{.*}} : !llvm.ptr, [
-  // CHECK:   ^[[TAIL_BB]](%[[TWO]] : i32),
-  // CHECK:   ^[[END_BB:.*]]
-  // CHECK:   ]
-  %6 = llvm.select %0, %2, %arg0 : i1, !llvm.ptr
-  llvm.indirectbr %6 : !llvm.ptr, [
-  ^bb2(%4 : i32),
-  ^bb3
-  ]
-^bb2(%7: i32):
-  // CHECK: ^[[TAIL_BB]](%[[BLOCK_ARG:.*]]: i32):
-  // CHECK:   {{.*}} = llvm.call @callee({{.*}}, %[[BLOCK_ARG]])
-  // CHECK:   llvm.return
-  %8 = llvm.call @callee(%arg1, %arg3, %7) : (!llvm.ptr, i32, i32) -> i32
-  llvm.return %8 : i32
-^bb3:
-  // CHECK: ^[[END_BB]]:
-  // CHECK:   llvm.blocktag
-  // CHECK:   llvm.return
-  // CHECK: }
-  llvm.blocktag <id = 1>
-  llvm.return %arg3 : i32
-}

diff  --git a/mlir/test/Target/LLVMIR/Import/import-failure.ll b/mlir/test/Target/LLVMIR/Import/import-failure.ll
index 782925a0a938e..4fbf187659a7b 100644
--- a/mlir/test/Target/LLVMIR/Import/import-failure.ll
+++ b/mlir/test/Target/LLVMIR/Import/import-failure.ll
@@ -1,5 +1,17 @@
 ; RUN: not mlir-translate -import-llvm -emit-expensive-warnings -split-input-file %s 2>&1 -o /dev/null | FileCheck %s
 
+; CHECK:      <unknown>
+; CHECK-SAME: error: unhandled instruction: indirectbr ptr %dst, [label %bb1, label %bb2]
+define i32 @unhandled_instruction(ptr %dst) {
+  indirectbr ptr %dst, [label %bb1, label %bb2]
+bb1:
+  ret i32 0
+bb2:
+  ret i32 1
+}
+
+; // -----
+
 ; Check that debug intrinsics with an unsupported argument are dropped.
 
 declare void @llvm.dbg.value(metadata, metadata, metadata)

diff  --git a/mlir/test/Target/LLVMIR/Import/indirectbr.ll b/mlir/test/Target/LLVMIR/Import/indirectbr.ll
deleted file mode 100644
index f1da3e3887927..0000000000000
--- a/mlir/test/Target/LLVMIR/Import/indirectbr.ll
+++ /dev/null
@@ -1,86 +0,0 @@
-; RUN: mlir-translate --import-llvm %s -split-input-file | FileCheck %s
-
-; CHECK: llvm.func @basic(%[[arg0:.*]]: !llvm.ptr)
-define i32 @basic(ptr %dst) {
-  ; CHECK:   llvm.indirectbr %[[arg0]] : !llvm.ptr, [
-  ; CHECK:   ^[[bb1:.*]],
-  ; CHECK:   ^[[bb2:.*]]
-  ; CHECK:   ]
-  indirectbr ptr %dst, [label %bb1, label %bb2]
-bb1:
-  ; CHECK: ^[[bb1]]:
-  ; CHECK:   llvm.return
-  ret i32 0
-bb2:
-  ; CHECK: ^[[bb2]]:
-  ; CHECK:   llvm.return
-  ret i32 1
-}
-
-; // -----
-
-; CHECK: llvm.mlir.global external @addr()
- at addr = global ptr null
-
-; CHECK-LABEL:  llvm.func @test_indirectbr() {
-define void @test_indirectbr() {
-  ; CHECK:    %[[BA:.*]] = llvm.blockaddress <function = @test_indirectbr, tag = <id = 1>> : !llvm.ptr
-  ; CHECK:    {{.*}} = llvm.mlir.addressof @addr : !llvm.ptr
-  ; CHECK:    llvm.store %[[BA]], {{.*}} : !llvm.ptr, !llvm.ptr
-  store ptr blockaddress(@test_indirectbr, %block), ptr @addr
-  ; CHECK:    %[[TARGET_ADDR:.*]] = llvm.load {{.*}} : !llvm.ptr -> !llvm.ptr
-  %val = load ptr, ptr @addr
-  ; CHECK:    llvm.indirectbr %[[TARGET_ADDR]] : !llvm.ptr, [
-  ; CHECK:    ^[[TARGET_BB:.*]]
-  ; CHECK:    ]
-  indirectbr ptr %val, [label %block]
-  ; CHECK:  ^[[TARGET_BB]]:
-  ; CHECK:    llvm.blocktag <id = 1>
-  ; CHECK:    llvm.return
-  ; CHECK:  }
-block:
-  ret void
-}
-
-; // -----
-
-; CHECK: llvm.func @callee(!llvm.ptr, i32, i32) -> i32
-declare i32 @callee(ptr %a, i32 %v, i32 %p)
-
-; CHECK: llvm.func @test_indirectbr_phi(
-; CHECK-SAME: %arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr, %arg3: i32) -> i32 {
-define i32 @test_indirectbr_phi(ptr %address, ptr %a, ptr %b, i32 %v) {
-entry:
-  ; CHECK:   %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
-  ; CHECK:   %[[TWO:.*]] = llvm.mlir.constant(2 : i32) : i32
-  %dest = select i1 undef, ptr blockaddress(@test_indirectbr_phi, %end), ptr %address
-  ; CHECK:   llvm.indirectbr {{.*}} : !llvm.ptr, [
-  ; CHECK:   ^[[HEAD_BB:.*]],
-  ; CHECK:   ^[[TAIL_BB:.*]](%[[ONE]] : i32)
-  ; CHECK:   ]
-  indirectbr ptr %dest, [label %head, label %tail]
-
-head:
-  ; CHECK: ^[[HEAD_BB]]:
-  ; CHECK:   llvm.indirectbr {{.*}} : !llvm.ptr, [
-  ; CHECK:   ^[[TAIL_BB]](%[[TWO]] : i32),
-  ; CHECK:   ^[[END_BB:.*]]
-  ; CHECK:   ]
-  %dest2 = select i1 undef, ptr blockaddress(@test_indirectbr_phi, %end), ptr %address
-  indirectbr ptr %dest2, [label %tail, label %end]
-
-tail:
-  ; CHECK: ^[[TAIL_BB]](%[[BLOCK_ARG:.*]]: i32):
-  ; CHECK:   {{.*}} = llvm.call @callee({{.*}}, %[[BLOCK_ARG]])
-  ; CHECK:   llvm.return
-  %p = phi i32 [1, %entry], [2, %head]
-  %r = call i32 @callee(ptr %a, i32 %v, i32 %p)
-  ret i32 %r
-
-end:
-  ; CHECK: ^[[END_BB]]:
-  ; CHECK:   llvm.blocktag
-  ; CHECK:   llvm.return
-  ; CHECK: }
-  ret i32 %v
-}

diff  --git a/mlir/test/Target/LLVMIR/indirectbr.mlir b/mlir/test/Target/LLVMIR/indirectbr.mlir
deleted file mode 100644
index 538220721e9eb..0000000000000
--- a/mlir/test/Target/LLVMIR/indirectbr.mlir
+++ /dev/null
@@ -1,40 +0,0 @@
-// RUN: mlir-translate -mlir-to-llvmir %s -split-input-file | FileCheck %s
-
-llvm.func @callee(!llvm.ptr, i32, i32) -> i32
-
-// CHECK: define i32 @test_indirectbr_phi(ptr %[[IN_PTR:.*]], ptr %[[ARG1:.*]], i32 %[[ARG2:.*]]) {
-llvm.func @test_indirectbr_phi(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg3: i32) -> i32 {
-  %0 = llvm.mlir.undef : i1
-  %2 = llvm.blockaddress <function = @test_indirectbr_phi, tag = <id = 1>> : !llvm.ptr
-  %3 = llvm.mlir.constant(1 : i32) : i32
-  %4 = llvm.mlir.constant(2 : i32) : i32
-  %5 = llvm.select %0, %2, %arg0 : i1, !llvm.ptr
-  // CHECK:   %[[BA0:.*]] = select i1 undef, ptr blockaddress(@test_indirectbr_phi, %[[RET_BB:.*]]), ptr %[[IN_PTR]]
-  // CHECK:   indirectbr ptr %[[BA0]], [label %[[BB1:.*]], label %[[BB2:.*]]]
-  llvm.indirectbr %5 : !llvm.ptr, [
-  ^bb1,
-  ^bb2(%3 : i32)
-  ]
-^bb1:
-  // CHECK: [[BB1]]:
-  // CHECK:   %[[BA1:.*]] = select i1 undef, ptr blockaddress(@test_indirectbr_phi, %[[RET_BB]]), ptr %[[IN_PTR]]
-  // CHECK:   indirectbr ptr %[[BA1]], [label %[[BB2]], label %[[RET_BB]]]
-  %6 = llvm.select %0, %2, %arg0 : i1, !llvm.ptr
-  llvm.indirectbr %6 : !llvm.ptr, [
-  ^bb2(%4 : i32),
-  ^bb3
-  ]
-^bb2(%7: i32):
-  // CHECK: [[BB2]]:
-  // CHECK:   %[[PHI:.*]] = phi i32 [ 2, %[[BB1]] ], [ 1, {{.*}} ]
-  // CHECK:   %[[CALL:.*]] = call i32 @callee(ptr %[[ARG1]], i32 %[[ARG2]], i32 %[[PHI]])
-  // CHECK:   ret i32 %[[CALL]]
-  %8 = llvm.call @callee(%arg1, %arg3, %7) : (!llvm.ptr, i32, i32) -> i32
-  llvm.return %8 : i32
-^bb3:
-  // CHECK: [[RET_BB]]:
-  // CHECK:   ret i32 %[[ARG2]]
-  // CHECK: }
-  llvm.blocktag <id = 1>
-  llvm.return %arg3 : i32
-}

diff  --git a/mlir/test/mlir-translate/import-diagnostics.ll b/mlir/test/mlir-translate/import-diagnostics.ll
index 6767d948e3bbd..acf45eb1c7c5d 100644
--- a/mlir/test/mlir-translate/import-diagnostics.ll
+++ b/mlir/test/mlir-translate/import-diagnostics.ll
@@ -21,16 +21,14 @@ end:
 ; ERROR:     error:
 ; DEFAULT:   error:
 ; EXPENSIVE: error:
-define dso_local void @tbaa(ptr %0) {
-  store i32 1, ptr %0, align 4, !tbaa !2
-  ret void
+define i32 @error(ptr %dst) {
+  indirectbr ptr %dst, [label %bb1, label %bb2]
+bb1:
+  ret i32 0
+bb2:
+  ret i32 1
 }
 
-!2 = !{!3, !3, i64 0, i64 4}
-!3 = !{!4, i64 4, !"int"}
-!4 = !{!5, i64 1, !"omnipotent char"}
-!5 = !{!"Simple C++ TBAA"}
-
 ; // -----
 
 declare void @llvm.dbg.value(metadata, metadata, metadata)


        


More information about the llvm-branch-commits mailing list