Skip to content

Commit 79561f0

Browse files
committed
fix user after free in builder and cleanup.
1 parent 5bea802 commit 79561f0

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

+4-2
Original file line numberDiff line numberDiff line change
@@ -1762,10 +1762,12 @@ def LLVM_IndirectBrOp : LLVM_TerminatorOp<"indirectbr",
17621762
attr-dict
17631763
}];
17641764

1765+
let skipDefaultBuilders = 1;
17651766
let builders = [
17661767
OpBuilder<(ins "Value":$addr,
1767-
CArg<"BlockRange", "{}">:$successors,
1768-
CArg<"ArrayRef<ValueRange>", "{}">:$succOperands)>
1768+
CArg<"ArrayRef<ValueRange>", "{}">:$succOperands,
1769+
CArg<"BlockRange", "{}">:$successors
1770+
)>
17691771
];
17701772
}
17711773

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -3904,6 +3904,20 @@ SuccessorOperands IndirectBrOp::getSuccessorOperands(unsigned index) {
39043904
return SuccessorOperands(getSuccOperandsMutable()[index]);
39053905
}
39063906

3907+
void IndirectBrOp::build(OpBuilder &odsBuilder, OperationState &odsState,
3908+
Value addr, ArrayRef<ValueRange> succOperands,
3909+
BlockRange successors) {
3910+
odsState.addOperands(addr);
3911+
for (ValueRange range : succOperands)
3912+
odsState.addOperands(range);
3913+
SmallVector<int32_t> rangeSegments;
3914+
for (ValueRange range : succOperands)
3915+
rangeSegments.push_back(range.size());
3916+
odsState.getOrAddProperties<Properties>().indbr_operand_segments =
3917+
odsBuilder.getDenseI32ArrayAttr(rangeSegments);
3918+
odsState.addSuccessors(successors);
3919+
}
3920+
39073921
static ParseResult parseIndirectBrOpSucessors(
39083922
OpAsmParser &parser, Type &flagType,
39093923
SmallVectorImpl<Block *> &succOperandBlocks,

mlir/lib/Target/LLVMIR/ModuleImport.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -1996,18 +1996,22 @@ LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) {
19961996
return failure();
19971997

19981998
SmallVector<Block *> succBlocks;
1999-
SmallVector<ValueRange> succBlockArgs;
1999+
// `succBlockArgs` is storage for the block arguments ranges used in
2000+
// `succBlockArgsRange`, so the later references live data.
2001+
SmallVector<SmallVector<Value>> succBlockArgs;
2002+
SmallVector<ValueRange> succBlockArgsRange;
20002003
for (auto i : llvm::seq<unsigned>(0, indBrInst->getNumSuccessors())) {
20012004
llvm::BasicBlock *succ = indBrInst->getSuccessor(i);
20022005
SmallVector<Value> blockArgs;
20032006
if (failed(convertBranchArgs(indBrInst, succ, blockArgs)))
20042007
return failure();
20052008
succBlocks.push_back(lookupBlock(succ));
20062009
succBlockArgs.push_back(blockArgs);
2010+
succBlockArgsRange.push_back(succBlockArgs.back());
20072011
}
20082012
Location loc = translateLoc(inst->getDebugLoc());
20092013
auto indBrOp = builder.create<LLVM::IndirectBrOp>(
2010-
loc, TypeRange{}, *basePtr, succBlockArgs, succBlocks);
2014+
loc, *basePtr, succBlockArgsRange, succBlocks);
20112015

20122016
mapNoResultOp(inst, indBrOp);
20132017
return success();

0 commit comments

Comments
 (0)