@@ -2240,24 +2240,21 @@ static LogicalResult verifyComdat(Operation *op,
22402240
22412241static LogicalResult verifyBlockTags (LLVMFuncOp funcOp) {
22422242 llvm::DenseSet<BlockTagAttr> blockTags;
2243- BlockTagOp badBlockTagOp;
2244- if (funcOp
2245- .walk ([&](BlockTagOp blockTagOp) {
2246- if (blockTags.contains (blockTagOp.getTag ())) {
2247- badBlockTagOp = blockTagOp;
2248- return WalkResult::interrupt ();
2249- }
2250- blockTags.insert (blockTagOp.getTag ());
2251- return WalkResult::advance ();
2252- })
2253- .wasInterrupted ()) {
2254- badBlockTagOp.emitError ()
2255- << " duplicate block tag '" << badBlockTagOp.getTag ().getId ()
2256- << " ' in the same function: " ;
2257- return failure ();
2258- }
2243+ // Note that presence of `BlockTagOp`s currently can't prevent an unrecheable
2244+ // block to be removed by canonicalizer's region simplify pass, which needs to
2245+ // be dialect aware to allow extra constraints to be described.
2246+ WalkResult res = funcOp.walk ([&](BlockTagOp blockTagOp) {
2247+ if (blockTags.contains (blockTagOp.getTag ())) {
2248+ blockTagOp.emitError ()
2249+ << " duplicate block tag '" << blockTagOp.getTag ().getId ()
2250+ << " ' in the same function: " ;
2251+ return WalkResult::interrupt ();
2252+ }
2253+ blockTags.insert (blockTagOp.getTag ());
2254+ return WalkResult::advance ();
2255+ });
22592256
2260- return success ( );
2257+ return failure (res. wasInterrupted () );
22612258}
22622259
22632260// / Parse common attributes that might show up in the same order in both
@@ -3818,6 +3815,78 @@ LogicalResult BlockAddressOp::verify() {
38183815// / attribute.
38193816OpFoldResult BlockAddressOp::fold (FoldAdaptor) { return getBlockAddr (); }
38203817
3818+ // ===----------------------------------------------------------------------===//
3819+ // LLVM::IndirectBrOp
3820+ // ===----------------------------------------------------------------------===//
3821+
3822+ SuccessorOperands IndirectBrOp::getSuccessorOperands (unsigned index) {
3823+ assert (index < getNumSuccessors () && " invalid successor index" );
3824+ return SuccessorOperands (getSuccOperandsMutable ()[index]);
3825+ }
3826+
3827+ void IndirectBrOp::build (OpBuilder &odsBuilder, OperationState &odsState,
3828+ Value addr, ArrayRef<ValueRange> succOperands,
3829+ BlockRange successors) {
3830+ odsState.addOperands (addr);
3831+ for (ValueRange range : succOperands)
3832+ odsState.addOperands (range);
3833+ SmallVector<int32_t > rangeSegments;
3834+ for (ValueRange range : succOperands)
3835+ rangeSegments.push_back (range.size ());
3836+ odsState.getOrAddProperties <Properties>().indbr_operand_segments =
3837+ odsBuilder.getDenseI32ArrayAttr (rangeSegments);
3838+ odsState.addSuccessors (successors);
3839+ }
3840+
3841+ static ParseResult parseIndirectBrOpSucessors (
3842+ OpAsmParser &parser, Type &flagType,
3843+ SmallVectorImpl<Block *> &succOperandBlocks,
3844+ SmallVectorImpl<SmallVector<OpAsmParser::UnresolvedOperand>> &succOperands,
3845+ SmallVectorImpl<SmallVector<Type>> &succOperandsTypes) {
3846+ if (failed (parser.parseCommaSeparatedList (
3847+ OpAsmParser::Delimiter::Square,
3848+ [&]() {
3849+ Block *destination = nullptr ;
3850+ SmallVector<OpAsmParser::UnresolvedOperand> operands;
3851+ SmallVector<Type> operandTypes;
3852+
3853+ if (parser.parseSuccessor (destination).failed ())
3854+ return failure ();
3855+
3856+ if (succeeded (parser.parseOptionalLParen ())) {
3857+ if (failed (parser.parseOperandList (
3858+ operands, OpAsmParser::Delimiter::None)) ||
3859+ failed (parser.parseColonTypeList (operandTypes)) ||
3860+ failed (parser.parseRParen ()))
3861+ return failure ();
3862+ }
3863+ succOperandBlocks.push_back (destination);
3864+ succOperands.emplace_back (operands);
3865+ succOperandsTypes.emplace_back (operandTypes);
3866+ return success ();
3867+ },
3868+ " successor blocks" )))
3869+ return failure ();
3870+ return success ();
3871+ }
3872+
3873+ static void
3874+ printIndirectBrOpSucessors (OpAsmPrinter &p, IndirectBrOp op, Type flagType,
3875+ SuccessorRange succs, OperandRangeRange succOperands,
3876+ const TypeRangeRange &succOperandsTypes) {
3877+ p << " [" ;
3878+ llvm::interleave (
3879+ llvm::zip (succs, succOperands),
3880+ [&](auto i) {
3881+ p.printNewline ();
3882+ p.printSuccessorAndUseList (std::get<0 >(i), std::get<1 >(i));
3883+ },
3884+ [&] { p << ' ,' ; });
3885+ if (!succOperands.empty ())
3886+ p.printNewline ();
3887+ p << " ]" ;
3888+ }
3889+
38213890// ===----------------------------------------------------------------------===//
38223891// AssumeOp (intrinsic)
38233892// ===----------------------------------------------------------------------===//
0 commit comments