8000 `--polynomial-to-mod-arith` segfault · Issue #1812 · google/heir · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

--polynomial-to-mod-arith segfault #1812

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Fizzixnerd opened this issue May 14, 2025 · 3 comments
Closed

--polynomial-to-mod-arith segfault #1812

Fizzixnerd opened this issue May 14, 2025 · 3 comments

Comments

@Fizzixnerd
Copy link
// real.mlir
!field_elem = i256

func.func @constraints(%i: tensor<15 x !field_elem>, %a: tensor<65535 x !field_elem>, %o: tensor<15 x !field_elem>) -> tensor<65535 x !polynomial.polynomial<ring=<coefficientType=!field_elem>>> {
    %result = tensor.empty() : tensor<65535 x !polynomial.polynomial<ring=<coefficientType=!field_elem>>>
    %deg = arith.constant 2 : index
    %coeff = arith.constant 256 : i256
    %mono = polynomial.monomial %coeff, %deg : (!field_elem, index) -> !polynomial.polynomial<ring=<coefficientType=!field_elem>> 
    %idx = arith.constant 0 : index
    %insertion = tensor.insert %mono into %result[%idx] : tensor<65535 x !polynomial.polynomial<ring=<coefficientType=!field_elem>>>
    %blah = arith.constant 3.14 : f32
    return %insertion : tensor<65535 x !polynomial.polynomial<ring=<coefficientType=!field_elem>>>
}

is the offending file.

$ heir-opt --polynomial-to-mod-arith mlir/real.mlir

is the offending invocation.

The error is:

~/src/rust-lang main ?5 ❯  heir-opt --polynomial-to-mod-arith mlir/real.mlir                                                                                                                                                                                                09:41:37 AM
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: heir-opt --polynomial-to-mod-arith mlir/real.mlir
 #0 0x000060c3a5ae302b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/fizzixnerd/bin/heir-opt+0x378702b)
 #1 0x000060c3a5ae0fe5 llvm::sys::RunSignalHandlers() (/home/fizzixnerd/bin/heir-opt+0x3784fe5)
 #2 0x000060c3a5ae369a SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x000079f9d0e45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x000060c3a3dccf10 mlir::heir::polynomial::IntPolynomialAttr::getPolynomial() const (/home/fizzixnerd/bin/heir-opt+0x1a70f10)
 #5 0x000060c3a32a4235 mlir::heir::polynomial::convertPolynomialType(mlir::heir::polynomial::PolynomialType) (/home/fizzixnerd/bin/heir-opt+0xf48235)
 #6 0x000060c3a32a774b std::_Function_handler<std::optional<llvm::LogicalResult> (mlir::Type, llvm::SmallVectorImpl<mlir::Type>&), std::enable_if<std::is_invocable_v<mlir::heir::polynomial::PolynomialToModArithTypeConverter::PolynomialToModArithTypeConverter(mlir::MLIRContext*)::'lambda'(mlir::heir::polynomial::PolynomialType), mlir::heir::polynomial::PolynomialType, llvm::SmallVectorImpl<mlir::Type>&>, std::function<std::optional<llvm::LogicalResult> (mlir::Type, llvm::SmallVectorImpl<mlir::Type>&)>>::type mlir::TypeConverter::wrapCallback<mlir::heir::polynomial::PolynomialType, std::enable_if<std::is_invocable_v<mlir::heir::polynomial::PolynomialToModArithTypeConverter::PolynomialToModArithTypeConverter(mlir::MLIRContext*)::'lambda'(mlir::heir::polynomial::PolynomialType), mlir::heir::polynomial::PolynomialType>, std::function<std::optional<llvm::LogicalResult> (mlir::Type, llvm::SmallVectorImpl<mlir::Type>&)>>::type mlir::TypeConverter::wrapCallback<mlir::heir::polynomial::PolynomialType, mlir::heir::polynomial::PolynomialToModArithTypeConverter::PolynomialToModArithTypeConverter(mlir::MLIRContext*)::'lambda'(mlir::heir::polynomial::PolynomialType)>(mlir::heir::polynomial::PolynomialToModArithTypeConverter::PolynomialToModArithTypeConverter(mlir::MLIRContext*)::'lambda'(mlir::heir::polynomial::PolynomialType)&&) const::'lambda'(mlir::heir::polynomial::PolynomialType, llvm::SmallVectorImpl<mlir::Type>&)>(mlir::heir::polynomial::PolynomialToModArithTypeConverter::PolynomialToModArithTypeConverter(mlir::MLIRContext*)::'lambda'(mlir::heir::polynomial::PolynomialType)&&) const::'lambda'(mlir::Type, llvm::SmallVectorImpl<mlir::Type>&)>::_M_invoke(std::_Any_data const&, mlir::Type&&, llvm::SmallVectorImpl<mlir::Type>&) (/home/fizzixnerd/bin/heir-opt+0xf4b74b)
 #7 0x000060c3a57776f2 mlir::TypeConverter::convertType(mlir::Type, llvm::SmallVectorImpl<mlir::Type>&) const (/home/fizzixnerd/bin/heir-opt+0x341b6f2)
 #8 0x000060c3a577e4bc mlir::TypeConverter::isLegal(mlir::Type) const (/home/fizzixnerd/bin/heir-opt+0x34224bc)
 #9 0x000060c3a32ba907 std::_Function_handler<std::optional<llvm::LogicalResult> (mlir::Type, llvm::SmallVectorImpl<mlir::Type>&), std::enable_if<std::is_invocable_v<mlir::heir::addTensorOfTensorConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_2, mlir::TensorType, llvm::SmallVectorImpl<mlir::Type>&>, std::function<std::optional<llvm::LogicalResult> (mlir::Type, llvm::SmallVectorImpl<mlir::Type>&)>>::type mlir::TypeConverter::wrapCallback<mlir::TensorType, std::enable_if<std::is_invocable_v<mlir::heir::addTensorOfTensorConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_2, mlir::TensorType>, std::function<std::optional<llvm::LogicalResult> (mlir::Type, llvm::SmallVectorImpl<mlir::Type>&)>>::type mlir::TypeConverter::wrapCallback<mlir::TensorType, mlir::heir::addTensorOfTensorConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_2>(mlir::heir::addTensorOfTensorConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_2&&) const::'lambda'(mlir::TensorType, llvm::SmallVectorImpl<mlir::Type>&)>(mlir::heir::addTensorOfTensorConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_2&&) const::'lambda'(mlir::Type, llvm::SmallVectorImpl<mlir::Type>&)>::_M_invoke(std::_Any_data const&, mlir::Type&&, llvm::SmallVectorImpl<mlir::Type>&) ConversionUtils.cpp:0:0
#10 0x000060c3a57776f2 mlir::TypeConverter::convertType(mlir::Type, llvm::SmallVectorImpl<mlir::Type>&) const (/home/fizzixnerd/bin/heir-opt+0x341b6f2)
#11 0x000060c3a5788147 bool std::all_of<llvm::concat_iterator<mlir::Type const, mlir::Type const*, mlir::Type const*>, std::enable_if<!std::is_convertible<llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>, mlir::Type>::value && !std::is_convertible<llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>, mlir::Operation*>::value, bool>::type mlir::TypeConverter::isLegal<llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>>(llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>&&) const::'lambda'(mlir::Type)>(llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>, llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>, std::enable_if<!std::is_convertible<llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>, mlir::Type>::value && !std::is_convertible<llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>, mlir::Operation*>::value, bool>::type mlir::TypeConverter::isLegal<llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>>(llvm::detail::concat_range<mlir::Type const, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::Type>>&&) const::'lambda'(mlir::Type)) (/home/fizzixnerd/bin/heir-opt+0x342c147)
#12 0x000060c3a577e6c8 mlir::TypeConverter::isSignatureLegal(mlir::FunctionType) const (/home/fizzixnerd/bin/heir-opt+0x34226c8)
#13 0x000060c3a32bd09c std::_Function_handler<std::optional<bool> (mlir::Operation*), std::enable_if<!std::is_invocable_v<mlir::heir::addStructuralConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_0, mlir::Operation*>, void>::type mlir::ConversionTarget::addDynamicallyLegalOp<mlir::func::FuncOp, mlir::heir::addStructuralConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_0>(mlir::heir::addStructuralConversionPatterns(mlir::TypeConverter&, mlir::RewritePatternSet&, mlir::ConversionTarget&)::$_0&&)::'lambda'(mlir::Operation*)>::_M_invoke(std::_Any_data const&, mlir::Operation*&&) ConversionUtils.cpp:0:0
#14 0x000060c3a577f739 mlir::ConversionTarget::isLegal(mlir::Operation*) const (/home/fizzixnerd/bin/heir-opt+0x3423739)
#15 0x000060c3a578754a mlir::WalkResult llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::callback_fn<mlir::OperationConverter::convertOperations(llvm::ArrayRef<mlir::Operation*>)::$_0>(long, mlir::Operation*) DialectConversion.cpp:0:0
#16 0x000060c3a33552a6 mlir::WalkResult mlir::detail::walk<mlir::ForwardDominanceIterator<false>>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) (/home/fizzixnerd/bin/heir-opt+0xff92a6)
#17 0x000060c3a335519f mlir::WalkResult mlir::detail::walk<mlir::ForwardDominanceIterator<false>>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) (/home/fizzixnerd/bin/heir-opt+0xff919f)
#18 0x000060c3a577c5aa mlir::OperationConverter::convertOperations(llvm::ArrayRef<mlir::Operation*>) (/home/fizzixnerd/bin/heir-opt+0x34205aa)
#19 0x000060c3a5780fce mlir::applyPartialConversion(mlir::Operation*, mlir::ConversionTarget const&, mlir:
8000
:FrozenRewritePatternSet const&, mlir::ConversionConfig) (/home/fizzixnerd/bin/heir-opt+0x3424fce)
#20 0x000060c3a32a65b8 mlir::heir::polynomial::PolynomialToModArith::runOnOperation() (/home/fizzixnerd/bin/heir-opt+0xf4a5b8)
#21 0x000060c3a5977b44 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/home/fizzixnerd/bin/heir-opt+0x361bb44)
#22 0x000060c3a5978067 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/home/fizzixnerd/bin/heir-opt+0x361c067)
#23 0x000060c3a597a5b1 mlir::PassManager::run(mlir::Operation*) (/home/fizzixnerd/bin/heir-opt+0x361e5b1)
#24 0x000060c3a3ee34ea performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) MlirOptMain.cpp:0:0
#25 0x000060c3a3ee3039 llvm::LogicalResult llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) MlirOptMain.cpp:0:0
#26 0x000060c3a5aa456c mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) (/home/fizzixnerd/bin/heir-opt+0x374856c)
#27 0x000060c3a3edc09a mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (/home/fizzixnerd/bin/heir-opt+0x1b8009a)
#28 0x000060c3a3edc3a9 mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/home/fizzixnerd/bin/heir-opt+0x1b803a9)
#29 0x000060c3a3edc6e2 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/home/fizzixnerd/bin/heir-opt+0x1b806e2)
#30 0x000060c3a307ba18 main (/home/fizzixnerd/bin/heir-opt+0xd1fa18)
#31 0x000079f9d0e2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#32 0x000079f9d0e2a28b call_init ./csu/../csu/libc-start.c:128:20
#33 0x000079f9d0e2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#34 0x000060c3a30797b5 _start (/home/fizzixnerd/bin/heir-opt+0xd1d7b5)
zsh: segmentation fault (core dumped)  heir-opt --polynomial-to-mod-arith mlir/real.mlir
@j2kun
Copy link
Collaborator
j2kun commented May 14, 2025

The following simpler IR fails with the same error (as does replacing i256 with i64):

#ring_i256 = #polynomial.ring<coefficientType = i256>
!poly = !polynomial.polynomial<ring = #ring_i256>
module {
  func.func @constraints() -> !poly {
    %c2 = arith.constant 2 : index
    %c256_i256 = arith.constant 256 : i256
    %0 = polynomial.monomial %c256_i256, %c2 : (i256, index) -> !poly
    return %0 : !poly
  }
}

Taking a look.

@j2kun
Copy link
Collaborator
j2kun commented May 14, 2025

Ah, this is an artifact of our particular use case for the polynomial dialect, where all polynomials have a ring modulus. This allows us to lower polynomials to tensors of the same dimension (upper bounded by the degree of the ring modulus).

The type converter in the offending pass does:

auto degree = type.getRing().getPolynomialModulus().getPolynomial().getDegree();
return RankedTensorType::get({degree}, attr.getCoefficientType())

Changing your type to have a modulus (i.e., imposing an explicit degree upper bound, below I used 256) fixes the issue:

#mod = #polynomial.int_polynomial<-1 + x**256>
#ring_i256 = #polynomial.ring<coefficientType = i256, polynomialModulus=#mod>
!poly = !polynomial.polynomial<ring = #ring_i256>

Which transforms

#mod = #polynomial.int_polynomial<-1 + x**256>
#ring_i256 = #polynomial.ring<coefficientType = i256, polynomialModulus=#mod>
!poly = !polynomial.polynomial<ring = #ring_i256>
module {
  func.func @constraints() -> !poly {
    %c2 = arith.constant 2 : index
    %c256_i256 = arith.constant 256 : i256
    %0 = polynomial.monomial %c256_i256, %c2 : (i256, index) -> !poly
    return %0 : !poly
  }
}

to

module {
  func.func @constraints() -> tensor<256xi256> {
    %c2 = arith.constant 2 : index
    %c256_i256 = arith.constant 256 : i256
    %cst = arith.constant dense<0> : tensor<256xi256>
    %inserted = tensor.insert %c256_i256 into %cst[%c2] : tensor<256xi256>
    return %inserted : tensor<256xi256>
  }
}

@j2kun
Copy link
Collaborator
j2kun commented May 14, 2025

I put a better error message in #1813, which I would say is enough to close this issue. But I am curious about your use case. Are you interested in using the polynomial dialect independently of the rest of the HEIR pipelines, and if so, for what?

@j2kun j2kun closed this as completed May 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants
0