Skip to content

flang optimization crashes on test_prif_co_{min,max}_test.F90 #205

@bonachea

Description

@bonachea

PR #158 implements the PRIF 0.5 collectives and rewrites the collectives tests to match.

Currently building that branch using flang 20 and flang nightly snapshots with optimization (such as enabled by the deprecated -Ofast option) leads to an ICE like the one shown below.

flang-20: warning: argument '-Ofast' is deprecated; use '-O3 -ffast-math -fstack-arrays' for the same behavior, or '-O3 -fstack-arrays' to enable only conforming optimizations [-Wdeprecated-ofast]
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
 #0 0x0000644cac508392 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x147a392)
 #1 0x0000644cac505856 SignalHandler(int) Signals.cpp:0:0
 #2 0x000077a4f4045330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #3 0x0000644cb16fbad2 mlir::FloatType::getWidth() (/usr/local/pkg/llvm/20.1.0/bin/flang+0x666dad2)
 #4 0x0000644cb17753bd mlir::Type::getIntOrFloatBitWidth() const (/usr/local/pkg/llvm/20.1.0/bin/flang+0x66e73bd)
 #5 0x0000644cad81484a (anonymous namespace)::makeMinMaxInitValGenerator(bool)::'lambda'(fir::FirOpBuilder, mlir::Location, mlir::Type)::operator()(fir::FirOpBuilder, mlir::Location, mlir::Type) const OptimizedBufferization.cpp:0:0
 #6 0x0000644cad822d2e (anonymous namespace)::ReductionConversion<hlfir::MaxvalOp>::matchAndRewrite(hlfir::MaxvalOp, mlir::PatternRewriter&) const OptimizedBufferization.cpp:0:0
 #7 0x0000644cb00c5d30 mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x5037d30)
 #8 0x0000644cb007ddbb (anonymous namespace)::GreedyPatternRewriteDriver::processWorklist() GreedyPatternRewriteDriver.cpp:0:0
 #9 0x0000644cb007f7df mlir::applyPatternsGreedily(mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig, bool*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff17df)
#10 0x0000644cad81747e (anonymous namespace)::OptimizedBufferizationPass::runOnOperation() OptimizedBufferization.cpp:0:0
#11 0x0000644cb1536ad6 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x64a8ad6)
#12 0x0000644cb1536f59 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x64a8f59)
#13 0x0000644cb1538267 std::_Function_handler<void (), llvm::LogicalResult mlir::failableParallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, void mlir::parallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)&&)::'lambda'(__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>&&)>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)&&)::'lambda'()>::_M_invoke(std::_Any_data const&) Pass.cpp:0:0
#14 0x0000644cb0082d71 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>>::_M_invoke(std::_Any_data const&) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff4d71)
#15 0x0000644cb008350d std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff550d)
#16 0x000077a4f40a1ed3 __pthread_once_slow ./nptl/pthread_once.c:118:7
#17 0x0000644cb0082f9e std::__future_base::_Deferred_state<std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>::_M_complete_async() (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff4f9e)
#18 0x0000644cb0083303 std::_Function_handler<void (), std::shared_future<void> llvm::ThreadPoolInterface::asyncImpl<void>(std::function<void ()>, llvm::ThreadPoolTaskGroup*)::'lambda'()>::_M_invoke(std::_Any_data const&) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff5303)
#19 0x0000644cb17de152 llvm::StdThreadPool::processTasks(llvm::ThreadPoolTaskGroup*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x6750152)
#20 0x0000644cb17deb51 void* llvm::thread::ThreadProxy<std::tuple<llvm::StdThreadPool::grow(int)::'lambda'()>>(void*) ThreadPool.cpp:0:0
#21 0x000077a4f409caa4 start_thread ./nptl/pthread_create.c:447:8
#22 0x000077a4f4129c3c clone3 ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80:0
flang-20: error: unable to execute command: Segmentation fault
flang-20: error: flang frontend command failed due to signal (use -v to see invocation)
flang version 20.1.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/pkg/llvm/20.1.0/bin

The problem appears to be confined to test files test_prif_co_{min,max}_test.F90, and based on some simple narrowing appears to be caused by compiling the check_character() function (regardless of whether it's called). Also the -O1 option is sufficient to demonstrate the crash.

Here is a minimal reproducer:

program Ofastbug
   character(len=*), parameter :: values(*) = &
            [ "To be   ","or not  " &
            , "to      ","be.     " &
            , "that    ","is      " &
            , "the     ","question"]
    integer :: me, ni, i
    character(len=len(values)) :: my_val, expected

    me = 1
    ni = 8

    my_val = values(mod(me-1, size(values))+1)
    expected = maxval([(values(mod(i-1,size(values))+1), i = 1, ni)])

    print *, my_val, expected

end program

and the ICE from compiling with flang 20:

cgpu$ flang-20 -O0 llvm-Ofast-bug.F90 && a.out
 To be   to      

cgpu$ flang-20 -O1 llvm-Ofast-bug.F90 && a.out 
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
 #0 0x0000622a34db2392 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x147a392)
 #1 0x0000622a34daf856 SignalHandler(int) Signals.cpp:0:0
 #2 0x0000705e56245330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #3 0x0000622a39fa5ad2 mlir::FloatType::getWidth() (/usr/local/pkg/llvm/20.1.0/bin/flang+0x666dad2)
 #4 0x0000622a3a01f3bd mlir::Type::getIntOrFloatBitWidth() const (/usr/local/pkg/llvm/20.1.0/bin/flang+0x66e73bd)
 #5 0x0000622a360be84a (anonymous namespace)::makeMinMaxInitValGenerator(bool)::'lambda'(fir::FirOpBuilder, mlir::Location, mlir::Type)::operator()(fir::FirOpBuilder, mlir::Location, mlir::Type) const OptimizedBufferization.cpp:0:0
 #6 0x0000622a360ccd2e (anonymous namespace)::ReductionConversion<hlfir::MaxvalOp>::matchAndRewrite(hlfir::MaxvalOp, mlir::PatternRewriter&) const OptimizedBufferization.cpp:0:0
 #7 0x0000622a3896fd30 mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x5037d30)
 #8 0x0000622a38927dbb (anonymous namespace)::GreedyPatternRewriteDriver::processWorklist() GreedyPatternRewriteDriver.cpp:0:0
 #9 0x0000622a389297df mlir::applyPatternsGreedily(mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig, bool*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff17df)
#10 0x0000622a360c147e (anonymous namespace)::OptimizedBufferizationPass::runOnOperation() OptimizedBufferization.cpp:0:0
#11 0x0000622a39de0ad6 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x64a8ad6)
#12 0x0000622a39de0f59 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x64a8f59)
#13 0x0000622a39de2267 std::_Function_handler<void (), llvm::LogicalResult mlir::failableParallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, void mlir::parallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)&&)::'lambda'(__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>&&)>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)&&)::'lambda'()>::_M_invoke(std::_Any_data const&) Pass.cpp:0:0
#14 0x0000622a3892cd71 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>>::_M_invoke(std::_Any_data const&) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff4d71)
#15 0x0000622a3892d50d std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff550d)
#16 0x0000705e562a1ed3 __pthread_once_slow ./nptl/pthread_once.c:118:7
#17 0x0000622a3892cf9e std::__future_base::_Deferred_state<std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>::_M_complete_async() (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff4f9e)
#18 0x0000622a3892d303 std::_Function_handler<void (), std::shared_future<void> llvm::ThreadPoolInterface::asyncImpl<void>(std::function<void ()>, llvm::ThreadPoolTaskGroup*)::'lambda'()>::_M_invoke(std::_Any_data const&) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x4ff5303)
#19 0x0000622a3a088152 llvm::StdThreadPool::processTasks(llvm::ThreadPoolTaskGroup*) (/usr/local/pkg/llvm/20.1.0/bin/flang+0x6750152)
#20 0x0000622a3a088b51 void* llvm::thread::ThreadProxy<std::tuple<llvm::StdThreadPool::grow(int)::'lambda'()>>(void*) ThreadPool.cpp:0:0
#21 0x0000705e5629caa4 start_thread ./nptl/pthread_create.c:447:8
#22 0x0000705e56329c3c clone3 ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80:0
flang-20: error: unable to execute command: Segmentation fault
flang-20: error: flang frontend command failed due to signal (use -v to see invocation)
flang version 20.1.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/pkg/llvm/20.1.0/bin
flang-20: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
flang-20: note: diagnostic msg: /tmp/llvm-Ofast-bug-dda454
flang-20: note: diagnostic msg: /tmp/llvm-Ofast-bug-dda454.sh
flang-20: note: diagnostic msg: 

********************

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions