Issue 138178
Summary SLP vectorizer crashes when built with hardening
Labels llvm:SLPVectorizer
Assignees alexey-bataev
Reporter alexfh
    Similarly to https://github.com/llvm/llvm-project/issues/137164, clang built with hardened libc++ (`-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG`) crashes on the input below due to an incorrect comparator.
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.widget = type { %struct.baz }
%struct.baz = type { [3 x float] }

define i1 @snork({ <2 x float>, float } %arg, <2 x float> %arg1, i1 %arg2, ptr %arg3) personality ptr null {
bb:
  %alloca = alloca %struct.widget, align 4
  %alloca4 = alloca { <2 x float>, float }, align 8
  %extractvalue = extractvalue { <2 x float>, float } %arg, 0
  store <2 x float> %arg1, ptr %alloca, align 4
  store <2 x float> %arg1, ptr %alloca4, align 8
  %extractelement = extractelement <2 x float> %extractvalue, i64 0
  br i1 %arg2, label %bb8, label %bb5

bb5: ; preds = %bb
  %load = load volatile { <2 x float>, float }, ptr %alloca4, align 8
  %load6 = load volatile { <2 x float>, float }, ptr %alloca, align 8
  %load7 = load float, ptr %arg3, align 4
  br label %bb8

bb8: ; preds = %bb5, %bb
  %phi = phi float [ %load7, %bb5 ], [ %extractelement, %bb ]
  %fpext = fpext float %phi to double
  %call = call ptr @spam(ptr %alloca)
  %load9 = load float, ptr %call, align 4
  %fpext10 = fpext float %load9 to double
  %call11 = call i32 (ptr, ptr, ...) @fprintf(ptr null, ptr null, double %fpext, double %fpext10, double 0.000000e+00)
  %load12 = load float, ptr %alloca4, align 8
  %fpext13 = fpext float %load12 to double
  %call14 = call i32 (ptr, ptr, ...) @fprintf(ptr null, ptr null, double 0.000000e+00, double %fpext13, double 0.000000e+00)
  ret i1 false
}

declare i32 @fprintf(ptr, ptr, ...)

define ptr @spam(ptr %arg) {
bb:
  %call = call ptr @zot(ptr %arg, i64 1)
  ret ptr %call
}

define ptr @zot(ptr %arg, i64 %arg1) {
bb:
 %getelementptr = getelementptr [3 x float], ptr %arg, i64 0, i64 %arg1
  ret ptr %getelementptr
}

; uselistorder directives
uselistorder ptr null, { 1, 2, 3, 4, 5, 6, 0 }
uselistorder ptr @fprintf, { 1, 0 }
```

This reproduces with recent LLVM revisions (e.g. deae5eef7147c5ad3acff612ab0ed00e2186d9a5).

Stack trace:
```
 #4 0x00007f03dda9ddf7 abort
 #5 0x0000563a3b243da6 void std::__u::__check_strict_weak_ordering_sorted<llvm::Value**, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>>(llvm::Value**, llvm::Value**, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>&) SLPVectorizer.cpp:0:0
 #6 0x0000563a3b1d847f bool tryToVectorizeSequence<llvm::Value>(llvm::SmallVectorImpl<llvm::Value*>&, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>, llvm::function_ref<bool (llvm::ArrayRef<llvm::Value*>, bool)>, bool, llvm::slpvectorizer::BoUpSLP&) SLPVectorizer.cpp:0:0
 #7 0x0000563a3b1cc810 llvm::SLPVectorizerPass::vectorizeChainsInBlock(llvm::BasicBlock*, llvm::slpvectorizer::BoUpSLP&)
 #8 0x0000563a3b1ca278 llvm::SLPVectorizerPass::runImpl(llvm::Function&, llvm::ScalarEvolution*, llvm::TargetTransformInfo*, llvm::TargetLibraryInfo*, llvm::AAResults*, llvm::LoopInfo*, llvm::DominatorTree*, llvm::AssumptionCache*, llvm::DemandedBits*, llvm::OptimizationRemarkEmitter*)
 #9 0x0000563a3b1c9998 llvm::SLPVectorizerPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
#10 0x0000563a3a154432 llvm::detail::PassModel<llvm::Function, llvm::SLPVectorizerPass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
#11 0x0000563a3bfda619 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
#12 0x0000563a36a14cb2 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
#13 0x0000563a3bfdd67d llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
#14 0x0000563a36a109b2 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
#15 0x0000563a3bfd98a0 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
#16 0x0000563a36a0dc68 (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::__u::unique_ptr<llvm::raw_pwrite_stream, std::__u::default_delete<llvm::raw_pwrite_stream>>&, std::__u::unique_ptr<llvm::ToolOutputFile, std::__u::default_delete<llvm::ToolOutputFile>>&, clang::BackendConsumer*) BackendUtil.cpp:0:0
#17 0x0000563a36a0527c clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::__u::unique_ptr<llvm::raw_pwrite_stream, std::__u::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*)
#18 0x0000563a366e49ca clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
#19 0x0000563a375c89e8 clang::ParseAST(clang::Sema&, bool, bool)
#20 0x0000563a3731848a clang::FrontendAction::Execute()
#21 0x0000563a3729242d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
#22 0x0000563a366e37eb clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
#23 0x0000563a366d7920 cc1_main(llvm::ArrayRef<char const*>, char const*, void*)
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to