Skip to content

MLIR lowerer segfault #4600

@IlanIwumbwe

Description

@IlanIwumbwe

Required prerequisites

  • Consult the security policy. If reporting a security vulnerability, do not report the bug using this form. Use the process described in the policy to report the issue.
  • Make sure you've read the documentation. Your issue may be addressed there.
  • Search the issue tracker to verify that this hasn't already been reported. +1 or comment there if it has.
  • If possible, make a PR with a failing test to give us a starting point to work on!

Describe the bug

During MLIR lowering phase, cudaq-quake segfaults when it meets supposedly unknown node.

Steps to reproduce the bug

Run the code below

#include <cudaq.h>
#include <iostream>
#include <cmath> 
#include <vector> 
#include <complex> 

// using namespace std::complex_literals;

CUDAQ_REGISTER_OPERATION(
unitary_3, 
    1,    // Number of qubits
    0,    // Number of params
    (std::vector<std::complex<double>>{
           0.311740+0.286260i,-0.905661+0.025514i,
           0.903697+0.064850i,0.323887-0.272442i 
    })
);

struct main_circuit { 
uint64_t operator()() __qpu__ {
	cudaq::qubit sing_2256;
	unitary_3(sing_2256);
	return mz(sing_2256);
}};

int main(int argc, char* argv[]) {
	auto kernel = main_circuit{};		
	return 0;	
}

cudaq-quake produces the stack dump below

0.      Program arguments: external/cuda-quantum/build/bin/cudaq-quake test.cpp
1.      <eof> parser at end of file
 #0 0x000055adffa1ddb8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (external/cuda-quantum/build/bin/cudaq-quake+0x44bdb8)
 #1 0x000055adffa1b875 llvm::sys::RunSignalHandlers() (external/cuda-quantum/build/bin/cudaq-quake+0x449875)
 #2 0x000055adffa1ee01 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x0000772f87c45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x000055ae00245839 cudaq::details::QuakeBridgeVisitor::VisitCXXConstructExpr(clang::CXXConstructExpr*) (external/cuda-quantum/build/bin/cudaq-quake+0xc73839)
 #5 0x000055ae00244ede clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseCXXConstructExpr(clang::CXXConstructExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc72ede)
 #6 0x000055ae00244dcc cudaq::details::QuakeBridgeVisitor::TraverseCXXConstructExpr(clang::CXXConstructExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc72dcc)
 #7 0x000055ae001e990a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc1790a)
 #8 0x000055ae0022f2a0 cudaq::details::QuakeBridgeVisitor::TraverseCastExpr(clang::CastExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc5d2a0)
 #9 0x000055ae001e990a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc1790a)
#10 0x000055ae0022f2a0 cudaq::details::QuakeBridgeVisitor::TraverseCastExpr(clang::CastExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc5d2a0)
#11 0x000055ae001e990a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc1790a)
#12 0x000055ae0024389a cudaq::details::QuakeBridgeVisitor::TraverseInitListExpr(clang::InitListExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc7189a)
#13 0x000055ae001e990a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc1790a)
#14 0x000055ae00244e9a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseCXXConstructExpr(clang::CXXConstructExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc72e9a)
#15 0x000055ae00244dcc cudaq::details::QuakeBridgeVisitor::TraverseCXXConstructExpr(clang::CXXConstructExpr*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc72dcc)
#16 0x000055ae001e990a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc1790a)
#17 0x000055ae0024b979 cudaq::details::QuakeBridgeVisitor::TraverseCompoundStmt(clang::CompoundStmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc79979)
#18 0x000055ae001e990a clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseStmt(clang::Stmt*, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt*, 1u, bool, llvm::PointerLikeTypeTraits<clang::Stmt*>, llvm::PointerIntPairInfo<clang::Stmt*, 1u, llvm::PointerLikeTypeTraits<clang::Stmt*>>>>*) (external/cuda-quantum/build/bin/cudaq-quake+0xc1790a)
#19 0x000055ae0022a729 cudaq::details::QuakeBridgeVisitor::TraverseFunctionDecl(clang::FunctionDecl*) (external/cuda-quantum/build/bin/cudaq-quake+0xc58729)
#20 0x000055ae001e7865 clang::RecursiveASTVisitor<cudaq::details::QuakeBridgeVisitor>::TraverseDecl(clang::Decl*) (external/cuda-quantum/build/bin/cudaq-quake+0xc15865)
#21 0x000055ae001e6805 cudaq::ASTBridgeAction::ASTBridgeConsumer::HandleTranslationUnit(clang::ASTContext&) (external/cuda-quantum/build/bin/cudaq-quake+0xc14805)
#22 0x000055ae013d0e39 clang::ParseAST(clang::Sema&, bool, bool) (external/cuda-quantum/build/bin/cudaq-quake+0x1dfee39)
#23 0x000055ae0007c93d clang::FrontendAction::Execute() (external/cuda-quantum/build/bin/cudaq-quake+0xaaa93d)
#24 0x000055adffff13a4 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (external/cuda-quantum/build/bin/cudaq-quake+0xa1f3a4)
#25 0x000055ae0121565e clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) (external/cuda-quantum/build/bin/cudaq-quake+0x1c4365e)
#26 0x000055ae01215303 clang::tooling::ToolInvocation::runInvocation(char const*, clang::driver::Compilation*, std::shared_ptr<clang::CompilerInvocation>, std::shared_ptr<clang::PCHContainerOperations>) (external/cuda-quantum/build/bin/cudaq-quake+0x1c43303)
#27 0x000055ae01214c52 clang::tooling::ToolInvocation::run() (external/cuda-quantum/build/bin/cudaq-quake+0x1c42c52)
#28 0x000055ae0121449b clang::tooling::runToolOnCodeWithArgs(std::unique_ptr<clang::FrontendAction, std::default_delete<clang::FrontendAction>>, llvm::Twine const&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&, llvm::Twine const&, llvm::Twine const&, std::shared_ptr<clang::PCHContainerOperations>) (external/cuda-quantum/build/bin/cudaq-quake+0x1c4249b)
#29 0x000055ae01214125 clang::tooling::runToolOnCodeWithArgs(std::unique_ptr<clang::FrontendAction, std::default_delete<clang::FrontendAction>>, llvm::Twine const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&, llvm::Twine const&, llvm::Twine const&, std::shared_ptr<clang::PCHContainerOperations>, std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>> const&) (external/cuda-quantum/build/bin/cudaq-quake+0x1c42125)
#30 0x000055adff9b79c0 bool runTool<cudaq::ASTBridgeAction>(mlir::OwningOpRef<mlir::ModuleOp>&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>&, llvm::StringRef, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) (external/cuda-quantum/build/bin/cudaq-quake+0x3e59c0)
#31 0x000055adff9b5250 main (external/cuda-quantum/build/bin/cudaq-quake+0x3e3250)
#32 0x0000772f87c2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#33 0x0000772f87c2a28b call_init ./csu/../csu/libc-start.c:128:20
#34 0x0000772f87c2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#35 0x000055adff9b08e5 _start (external/cuda-quantum/build/bin/cudaq-quake+0x3de8e5)
Segmentation fault (core dumped)

Adding using namespace std::complex_literals; makes it work. Presumably this is because the complex literals get implicitly cast to Complex_ double not std::complex<double>. The AST node visitor doesn't know how to handle the Complex_ double node.

Expected behavior

Parser shouldn't segfault, throw exception for unsupported type

Is this a regression? If it is, put the last known working version (or commit) here.

Not a regression

Environment

  • CUDA-Q version: b04dee5
  • Python version: 3.12.3
  • C++ compiler: clang++-22
  • Operating system: Ubuntu 24.04

Suggestions

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions