@@ -2240,21 +2240,24 @@ static LogicalResult verifyComdat(Operation *op,
22402240
22412241static LogicalResult verifyBlockTags (LLVMFuncOp funcOp) {
22422242 llvm::DenseSet<BlockTagAttr> blockTags;
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- });
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+ }
22562259
2257- return failure (res. wasInterrupted () );
2260+ return success ( );
22582261}
22592262
22602263// / Parse common attributes that might show up in the same order in both
@@ -3815,78 +3818,6 @@ LogicalResult BlockAddressOp::verify() {
38153818// / attribute.
38163819OpFoldResult BlockAddressOp::fold (FoldAdaptor) { return getBlockAddr (); }
38173820
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-
38903821// ===----------------------------------------------------------------------===//
38913822// AssumeOp (intrinsic)
38923823// ===----------------------------------------------------------------------===//
0 commit comments