[llvm-bugs] [Bug 52273] New: ICE in LoopVectorizePass fails for -O1 -fopenmp-simd: Assertion `!verifyFunction(*L->getHeader()->getParent(), &dbgs())' failed.

via llvm-bugs llvm-bugs at lists.llvm.org
Sat Oct 23 09:30:01 PDT 2021


https://bugs.llvm.org/show_bug.cgi?id=52273

            Bug ID: 52273
           Summary: ICE in LoopVectorizePass fails for -O1 -fopenmp-simd:
                    Assertion
                    `!verifyFunction(*L->getHeader()->getParent(),
                    &dbgs())' failed.
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Loop Optimizer
          Assignee: unassignedbugs at nondot.org
          Reporter: Vsevolod.Livinskij at frtk.ru
                CC: llvm-bugs at lists.llvm.org

I've attached C++ and LLVM IR reproducers.

LLVM IR reproducer:

@b = external local_unnamed_addr global i64, align 8
@e = external local_unnamed_addr global [0 x i16], align 2

define void @_Z1ojPA2_xPA2_A5_A20_j(i32 %0, i1 %1, [20 x i32]* %2)
local_unnamed_addr {
for.cond1.preheader:
  br label %for.cond5

for.cond5.loopexit:                               ; preds = %omp.inner.for.cond
  br label %for.cond5

for.cond5:                                        ; preds =
%for.cond5.loopexit, %for.cond1.preheader
  br i1 %1, label %for.cond10.preheader, label %omp.inner.for.cond.preheader

omp.inner.for.cond.preheader:                     ; preds = %for.cond5
  br label %omp.inner.for.cond

for.cond10.preheader:                             ; preds = %for.cond5
  ret void

omp.inner.for.cond:                               ; preds = %omp.inner.for.inc,
%omp.inner.for.cond.preheader
  %.omp.iv.0 = phi i32 [ %add51, %omp.inner.for.inc ], [ 0,
%omp.inner.for.cond.preheader ]
  %exitcond.not = icmp eq i32 %.omp.iv.0, %0
  br i1 %exitcond.not, label %for.cond5.loopexit, label %omp.inner.for.body

omp.inner.for.body:                               ; preds = %omp.inner.for.cond
  %idxprom27 = sext i32 %.omp.iv.0 to i64
  %arrayidx28 = getelementptr inbounds [20 x i32], [20 x i32]* %2, i64 0, i64
%idxprom27
  br i1 %1, label %omp.inner.for.inc, label %cond.false

cond.false:                                       ; preds = %omp.inner.for.body
  %3 = load i32, i32* %arrayidx28, align 4, !tbaa !0
  %extract.t = trunc i32 %3 to i16
  br label %omp.inner.for.inc

omp.inner.for.inc:                                ; preds = %cond.false,
%omp.inner.for.body
  %cond.off0 = phi i16 [ %extract.t, %cond.false ], [ 0, %omp.inner.for.body ]
  store i16 %cond.off0, i16* getelementptr inbounds ([0 x i16], [0 x i16]* @e,
i64 0, i64 undef), align 2
  %4 = load i32, i32* %arrayidx28, align 4, !tbaa !0
  %conv50 = zext i32 %4 to i64
  store i64 %conv50, i64* @b, align 8, !tbaa !4
  %add51 = add i32 %.omp.iv.0, 1
  br label %omp.inner.for.cond, !llvm.loop !6
}

!0 = !{!1, !1, i64 0}
!1 = !{!"int", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C++ TBAA"}
!4 = !{!5, !5, i64 0}
!5 = !{!"long long", !2, i64 0}
!6 = distinct !{!6, !7, !9}
!7 = !{!"llvm.loop.parallel_accesses", !8}
!8 = distinct !{}
!9 = !{!"llvm.loop.vectorize.enable", i1 true}

Error:
>$ clang++ -c -O1 foo.ll
Instruction does not dominate all uses!
  %40 = getelementptr inbounds [20 x i32], [20 x i32]* %2, i64 0, i64 %39
  %arrayidx28.lcssa = phi i32* [ %arrayidx28, %omp.inner.for.inc ], [ %40,
%middle.block ]
clang++:
/testing/llvm/llvm_src_main/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10494:
bool llvm::LoopVectorizePass::processLoop(llvm::Loop*): Assert
ion `!verifyFunction(*L->getHeader()->getParent(), &dbgs())' failed.
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash
backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang++ -c -O1 foo.ll
1.      Optimizer
 #0 0x00005615eab69234 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x00005615eab67034 llvm::sys::CleanupOnSignal(unsigned long)
(/testing/llvm/bin_main/bin/clang-14+0x2447034)
 #2 0x00005615eaaaefe8 CrashRecoverySignalHandler(int)
CrashRecoveryContext.cpp:0:0
 #3 0x00007f2ccc63d3c0 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007f2ccc0ed18b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
 #5 0x00007f2ccc0cc859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x25859)
 #6 0x00007f2ccc0cc729 (/lib/x86_64-linux-gnu/libc.so.6+0x25729)
 #7 0x00007f2ccc0ddf36 (/lib/x86_64-linux-gnu/libc.so.6+0x36f36)
 #8 0x00005615ead9bc53 llvm::LoopVectorizePass::processLoop(llvm::Loop*)
(/testing/llvm/bin_main/bin/clang-14+0x267bc53)
 #9 0x00005615ead9cf00 llvm::LoopVectorizePass::runImpl(llvm::Function&,
llvm::ScalarEvolution&, llvm::LoopInfo&, llvm::TargetTransformInfo&,
llvm::Domina
torTree&, llvm::BlockFrequencyInfo&, llvm::TargetLibraryInfo*,
llvm::DemandedBits&, llvm::AAResults&, llvm::AssumptionCache&,
std::function<llvm::LoopAcce
ssInfo const& (llvm::Loop&)>&, llvm::OptimizationRemarkEmitter&,
llvm::ProfileSummaryInfo*) (/testing/llvm/bin_main/bin/clang-14+0x267cf00)
#10 0x00005615ead9d6d9 llvm::LoopVectorizePass::run(llvm::Function&,
llvm::AnalysisManager<llvm::Function>&)
(/testing/llvm/bin_main/bin/clang-14+0x267d6d
9)
#11 0x00005615ec103be6 llvm::detail::PassModel<llvm::Function,
llvm::LoopVectorizePass, llvm::PreservedAnalyses,
llvm::AnalysisManager<llvm::Function> >::
run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
(/testing/llvm/bin_main/bin/clang-14+0x39e3be6)
#12 0x00005615ea3629c6 llvm::PassManager<llvm::Function,
llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&,
llvm::AnalysisManager<llvm::Functio
n>&) (/testing/llvm/bin_main/bin/clang-14+0x1c429c6)   
#13 0x00005615eae98206 llvm::detail::PassModel<llvm::Function,
llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function> >,
llvm::PreservedA
nalyses, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&,
llvm::AnalysisManager<llvm::Function>&)
(/testing/llvm/bin_main/bin/clang-14+0x2778
206)
#14 0x00005615ea3613c9 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&)
(/testing/llvm/bin_main/bin/clang-14+0x1c413c9)
#15 0x00005615eae99106 llvm::detail::PassModel<llvm::Module,
llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses,
llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&)
(/testing/llvm/bin_main/bin/clang-14+0x2779106)
#16 0x00005615ea35ef7f llvm::PassManager<llvm::Module,
llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&)
(/testing/llvm/bin_main/bin/clang-14+0x1c3ef7f)
#17 0x00005615eaea8c40 (anonymous
namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction,
std::unique_ptr<llvm::raw_pwrite_stream,
std::default_delete<llvm::raw_pwrite_stream> >&,
std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>
>&) (.constprop.0) BackendUtil.cpp:0:0
#18 0x00005615eaeac472 clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef,
llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream,
std::default_delete<llvm::raw_pwrite_stream> >)
(/testing/llvm/bin_main/bin/clang-14+0x278c472)
#19 0x00005615ebd1ee63 clang::CodeGenAction::ExecuteAction()
(/testing/llvm/bin_main/bin/clang-14+0x35fee63)
#20 0x00005615eb5cec69 clang::FrontendAction::Execute()
(/testing/llvm/bin_main/bin/clang-14+0x2eaec69)
#21 0x00005615eb55dace
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
(/testing/llvm/bin_main/bin/clang-14+0x2e3dace)
#22 0x00005615eb6aefe3
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
(/testing/llvm/bin_main/bin/clang-14+0x2f8efe3)
#23 0x00005615e962e7a7 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) (/testing/llvm/bin_main/bin/clang-14+0xf0e7a7)
#24 0x00005615e962adf8 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&)
driver.cpp:0:0
#25 0x00005615eb3ebde9 void llvm::function_ref<void
()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>
>, std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#26 0x00005615eaaaf16c
llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>)
(/testing/llvm/bin_main/bin/clang-14+0x238f16c)
#27 0x00005615eb3ec4fd
clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>
>, std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >*, bool*) const (.part.0) Job.cpp:0:0
#28 0x00005615eb3bdfbb
clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&,
clang::driver::Command const*&) const
(/testing/llvm/bin_main/bin/clang-14+0x2c9dfbb)
#29 0x00005615eb3beac9
clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&,
llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) const
(/testing/llvm/bin_main/bin/clang-14+0x2c9eac9)
#30 0x00005615eb3c8569
clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&,
llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&)
(/testing/llvm/bin_main/bin/clang-14+0x2ca8569)
#31 0x00005615e95a5bc6 main (/testing/llvm/bin_main/bin/clang-14+0xe85bc6)
#32 0x00007f2ccc0ce0b3 __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#33 0x00005615e962a96e _start (/testing/llvm/bin_main/bin/clang-14+0xf0a96e)
clang-14: error: clang frontend command failed with exit code 134 (use -v to
see invocation)
clang version 14.0.0 (https://github.com/llvm/llvm-project.git
710596a1e15188171edd5c6fffe6b7fe483ca594)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /testing/llvm/bin_main/bin

C++ reproducer:
long long b;
char a, f, l;
extern int c[];
extern short e[];
long m;
int n;
void o(unsigned p, long long q[][2], unsigned r[][2][5][20]) {
  for (long d = 0; b ; d++)
    for (char g = 0; g < q[3][d];) {
      for (unsigned h = 0; h < l; h++)
        for (int i = 0; i < (int)m; i = m)
          a = 0;
#pragma omp simd
      for (int j = 0; j < 20; j += p) {
        c[j] = 0 > r[3][d][p][j];
        e[p * j] = n ? n : r[3][d][p][j];
        b = r[3][d][p][j];
      }
      for (short k = 0; k < f; k = 3)
        ;
    }
}

>$ clang++ -c -O1 -fopenmp-simd func.cpp
Instruction does not dominate all uses!
  %55 = getelementptr inbounds [2 x [5 x [20 x i32]]], [2 x [5 x [20 x i32]]]*
%r, i64 3, i64 %d.0107, i64 %idxprom, i64 %54
  %arrayidx28.lcssa = phi i32* [ %arrayidx28, %cond.end ], [ %55, %middle.block
]
clang++:
/testing/llvm/llvm_src_main/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10494:
bool llvm::LoopVectorizePass::processLoop(llvm::Loop*): Assert
ion `!verifyFunction(*L->getHeader()->getParent(), &dbgs())' failed.
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash
backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang++ -c -O1 -fopenmp-simd func.cpp
1.      <eof> parser at end of file
2.      Optimizer
 #0 0x0000561fc497a234 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x0000561fc4978034 llvm::sys::CleanupOnSignal(unsigned long)
(/testing/llvm/bin_main/bin/clang-14+0x2447034)
 #2 0x0000561fc48bffe8 CrashRecoverySignalHandler(int)
CrashRecoveryContext.cpp:0:0
 #3 0x00007f8c814b53c0 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007f8c80f6518b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
 #5 0x00007f8c80f44859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x25859)
 #6 0x00007f8c80f44729 (/lib/x86_64-linux-gnu/libc.so.6+0x25729)
 #7 0x00007f8c80f55f36 (/lib/x86_64-linux-gnu/libc.so.6+0x36f36)
 #8 0x0000561fc4bacc53 llvm::LoopVectorizePass::processLoop(llvm::Loop*)
(/testing/llvm/bin_main/bin/clang-14+0x267bc53)
 #9 0x0000561fc4badf00 llvm::LoopVectorizePass::runImpl(llvm::Function&,
llvm::ScalarEvolution&, llvm::LoopInfo&, llvm::TargetTransformInfo&,
llvm::Domina
torTree&, llvm::BlockFrequencyInfo&, llvm::TargetLibraryInfo*,
llvm::DemandedBits&, llvm::AAResults&, llvm::AssumptionCache&,
std::function<llvm::LoopAcce
ssInfo const& (llvm::Loop&)>&, llvm::OptimizationRemarkEmitter&,
llvm::ProfileSummaryInfo*) (/testing/llvm/bin_main/bin/clang-14+0x267cf00)
#10 0x0000561fc4bae6d9 llvm::LoopVectorizePass::run(llvm::Function&,
llvm::AnalysisManager<llvm::Function>&)
(/testing/llvm/bin_main/bin/clang-14+0x267d6d
9)
#11 0x0000561fc5f14be6 llvm::detail::PassModel<llvm::Function,
llvm::LoopVectorizePass, llvm::PreservedAnalyses,
llvm::AnalysisManager<llvm::Function> >::
run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
(/testing/llvm/bin_main/bin/clang-14+0x39e3be6)
#12 0x0000561fc41739c6 llvm::PassManager<llvm::Function,
llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&,
llvm::AnalysisManager<llvm::Functio
n>&) (/testing/llvm/bin_main/bin/clang-14+0x1c429c6)   
#13 0x0000561fc4ca9206 llvm::detail::PassModel<llvm::Function,
llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function> >,
llvm::PreservedA
nalyses, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&,
llvm::AnalysisManager<llvm::Function>&)
(/testing/llvm/bin_main/bin/clang-14+0x2778
206)
#14 0x0000561fc41723c9 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&) (/testing/llvm/bin_main/bin/clang-14+0x
1c413c9)
#15 0x0000561fc4caa106 llvm::detail::PassModel<llvm::Module,
llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses,
llvm::AnalysisManager<llvm::Modul
e> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
(/testing/llvm/bin_main/bin/clang-14+0x2779106)
#16 0x0000561fc416ff7f llvm::PassManager<llvm::Module,
llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&) (/t
esting/llvm/bin_main/bin/clang-14+0x1c3ef7f)
#17 0x0000561fc4cb9c40 (anonymous
namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction,
std::unique_ptr<llvm::raw_pwrite_stream, s
td::default_delete<llvm::raw_pwrite_stream> >&,
std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>
>&) (.constprop.0) Backend
Util.cpp:0:0
#18 0x0000561fc4cbd472 clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef,
llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream,
std::default_delete<llvm::raw_pwrite_stream> >)
(/testing/llvm/bin_main/bin/clang-14+0x278c472)
#19 0x0000561fc5b309e3
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
(/testing/llvm/bin_main/bin/clang-14+0x35ff9e3)
#20 0x0000561fc6c85da9 clang::ParseAST(clang::Sema&, bool, bool)
(/testing/llvm/bin_main/bin/clang-14+0x4754da9)
#21 0x0000561fc5b2f398 clang::CodeGenAction::ExecuteAction()
(/testing/llvm/bin_main/bin/clang-14+0x35fe398)
#22 0x0000561fc53dfc69 clang::FrontendAction::Execute()
(/testing/llvm/bin_main/bin/clang-14+0x2eaec69)
#23 0x0000561fc536eace
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
(/testing/llvm/bin_main/bin/clang-14+0x2e3dace)
#24 0x0000561fc54bffe3
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
(/testing/llvm/bin_main/bin/clang-14+0x2f8efe3)
#25 0x0000561fc343f7a7 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) (/testing/llvm/bin_main/bin/clang-14+0xf0e7a7)
#26 0x0000561fc343bdf8 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&)
driver.cpp:0:0
#27 0x0000561fc51fcde9 void llvm::function_ref<void
()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>
>, std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#28 0x0000561fc48c016c
llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>)
(/testing/llvm/bin_main/bin/clang-14+0x238f16c)
#29 0x0000561fc51fd4fd
clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>
>, std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >*, bool*) const (.part.0) Job.cpp:0:0
#30 0x0000561fc51cefbb
clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&,
clang::driver::Command const*&) const
(/testing/llvm/bin_main/bin/clang-14+0x2c9dfbb)
#31 0x0000561fc51cfac9
clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&,
llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) const
(/testing/llvm/bin_main/bin/clang-14+0x2c9eac9)
#32 0x0000561fc51d9569
clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&,
llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&)
(/testing/llvm/bin_main/bin/clang-14+0x2ca8569)
#33 0x0000561fc33b6bc6 main (/testing/llvm/bin_main/bin/clang-14+0xe85bc6)
#34 0x00007f8c80f460b3 __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#35 0x0000561fc343b96e _start (/testing/llvm/bin_main/bin/clang-14+0xf0a96e)
clang-14: error: clang frontend command failed with exit code 134 (use -v to
see invocation)
clang version 14.0.0 (https://github.com/llvm/llvm-project.git
710596a1e15188171edd5c6fffe6b7fe483ca594)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /testing/llvm/bin_main/bin
clang-14: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-14: note: diagnostic msg: /tmp/func-4a3f7c.cpp
clang-14: note: diagnostic msg: /tmp/func-4a3f7c.sh
clang-14: note: diagnostic msg: 

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

LLVM version:
clang version 14.0.0 (https://github.com/llvm/llvm-project.git
710596a1e15188171edd5c6fffe6b7fe483ca594)

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20211023/6aacd5b8/attachment-0001.html>


More information about the llvm-bugs mailing list