EnzymeAD / EnzymeAD/Enzyme

Fortran+OpenMP not working under `-O2` or `-O3`

Open
#3,161 0 comments 0 reactions 1 assignee Claimed by @joewallwork View on GitHub
bug fortran openmp
Dominant language
LLVM
Stars
1.7k
Forks
188
Avg merge
1d 22h
Merged PRs (30d)
26

Description

While developing #3160 I found that `-O0` and `-O1` work fine for the `square` example, but `-O2` and `-O3` do not - Enzyme crashes in `AdjointGenerator::visitOMPCall` at those optimisation levels.

Example error log:

```
flang -flto -O2 -fopenmp -c -I/home/joe/tools/enzyme/build/flang/modules /home/joe/tools/enzyme/enzyme/test/Fortran/OpenMP/square_with_explicit_interface.f90 -o /dev/stdout
+ /home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt -load-pass-plugin=/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so -load=/home/joe/tools/enzyme/build/flang/Enzyme/LLVM
Enzyme-21.so --enzyme-attributor=0 -passes=enzyme -o /home/joe/tools/enzyme/build/flang/test/Fortran/OpenMP/Output/square_with_explicit_interface.f90.tmp.ll
opt: /home/joe/tools/enzyme/enzyme/Enzyme/GradientUtils.cpp:6843: virtual Value *GradientUtils::lookupM(Value *, IRBuilder<> &, const ValueToValueMapTy &, bool, BasicBlock *): Assertion `inst->getParent()->getParent() == newFunc'
failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt -load-pass-plugin=/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so -load=/home/joe/tools/enzym
e/build/flang/Enzyme/LLVMEnzyme-21.so --enzyme-attributor=0 -passes=enzyme -o /home/joe/tools/enzyme/build/flang/test/Fortran/OpenMP/Output/square_with_explicit_interface.f90.tmp.ll
1. Running pass "EnzymeNewPM" on module ""
#0 0x00005c8ceb063de0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt+0x5b12de0)
#1 0x00005c8ceb060c1f SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#2 0x00007b51a3445cb0 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x45cb0)
#3 0x00007b51a34a642c pthread_kill (/usr/lib/x86_64-linux-gnu/libc.so.6+0xa642c)
#4 0x00007b51a3445b7e raise (/usr/lib/x86_64-linux-gnu/libc.so.6+0x45b7e)
#5 0x00007b51a34288ec abort (/usr/lib/x86_64-linux-gnu/libc.so.6+0x288ec)
#6 0x00007b51a3429979 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x29979)
#7 0x00007b51a343bf75 __assert_fail (/usr/lib/x86_64-linux-gnu/libc.so.6+0x3bf75)
#8 0x00007b51a2ed6feb GradientUtils::lookupM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, bool, llvm::BasicBlock*) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xcd6feb)
#9 0x00007b51a2eae209 GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xcae209)
#10 0x00007b51a2ea0cee GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xca0cee)
#11 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#12 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#13 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#14 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#15 0x00007b51a2e96388 GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc96388)
#16 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#17 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#18 0x00007b51a2e9b3ae GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xc9b3ae)
#19 0x00007b51a2ea1ffa GradientUtils::unwrapM(llvm::Value*, llvm::IRBuilder&, llvm::ValueMap>> const&, UnwrapMode, llvm::BasicBlock*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xca1ffa)
#20 0x00007b51a2dbd29d AdjointGenerator::visitOMPCall(llvm::CallInst&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xbbd29d)
#21 0x00007b51a2db9eac AdjointGenerator::visitCallInst(llvm::CallInst&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xbb9eac)
#22 0x00007b51a2db7b55 llvm::InstVisitor::delegateCallInst(llvm::CallInst&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xbb7b55)
#23 0x00007b51a2d908cd llvm::InstVisitor::visitCall(llvm::CallInst&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xb908cd)
#24 0x00007b51a2d8fda5 llvm::InstVisitor::visit(llvm::Instruction&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xb8fda5)
#25 0x00007b51a2d6834d llvm::InstVisitor::visit(llvm::Instruction*) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xb6834d)
#26 0x00007b51a2d50240 EnzymeLogic::CreatePrimalAndGradient(RequestContext, ReverseCacheKey const&&, TypeAnalysis&, AugmentedReturn const*, bool) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xb50240)
#27 0x00007b51a2cf2ca2 (anonymous namespace)::EnzymeBase::HandleAutoDiff(llvm::Instruction*, unsigned int, llvm::Value*, llvm::Type*, llvm::SmallVectorImpl&, std::map, std::allocator<
std::pair>> const&, std::vector> const&, llvm::Function*, DerivativeMode, (anonymous namespace)::EnzymeBase::Options&, bool, llvm::SmallVectorImpl&) E
nzyme.cpp:0:0
#28 0x00007b51a2cebac6 (anonymous namespace)::EnzymeBase::HandleAutoDiffArguments(llvm::CallInst*, DerivativeMode, bool, llvm::SmallVectorImpl&) Enzyme.cpp:0:0
#29 0x00007b51a2cea3aa (anonymous namespace)::EnzymeBase::lowerEnzymeCalls(llvm::Function&, std::set, std::allocator>&) Enzyme.cpp:0:0
#30 0x00007b51a2ce542e (anonymous namespace)::EnzymeBase::run(llvm::Module&) Enzyme.cpp:0:0
#31 0x00007b51a2d28f60 EnzymeNewPM::run(llvm::Module&, llvm::AnalysisManager&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xb28f60)
#32 0x00007b51a2d28e84 llvm::detail::PassModel>::run(llvm::Module&, llvm::AnalysisManager&) (/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so+0xb28e84)
#33 0x00005c8ceae0bf45 llvm::PassManager>::run(llvm::Module&, llvm::AnalysisManager&) (/home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt+0x58baf45)
#34 0x00005c8ce5eba6d5 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef, llvm::ArrayRef>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) (/home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt+0x9696d5)
#35 0x00005c8ce5eada20 optMain (/home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt+0x95ca20)
#36 0x00007b51a342a601 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x2a601)
#37 0x00007b51a342a718 __libc_start_main (/usr/lib/x86_64-linux-gnu/libc.so.6+0x2a718)
#38 0x00005c8ce5ea5145 _start (/home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt+0x954145)
/home/joe/tools/enzyme/build/flang/test/Fortran/OpenMP/Output/square_with_explicit_interface.f90.script: line 6: 50971 Done flang -flto -O2 -fopenmp -c -I/home/joe/tools/enzyme/build/flang/modules /home/joe/tools/enzyme/enzyme/test/Fortran/OpenMP/square_with_explicit_interface.f90 -o /dev/stdout
50972 Aborted (core dumped) | /home/joe/tools/spack/opt/spack/linux-skylake/llvm-21.1.4-jtiynly3pgjolwfskf7iyjwi43vuoe5i/bin/opt -load-pass-plugin=/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so -load=/home/joe/tools/enzyme/build/flang/Enzyme/LLVMEnzyme-21.so --enzyme-attributor=0 -passes="enzyme" -o /home/joe/tools/enzyme/build/flang/test/Fortran/OpenMP/Output/square_with_explicit_interface.f90.tmp.ll

--
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.