[llvm-bugs] [Bug 37221] New: Loop Vectorizer dom tree update broken - fires SCEV assertion

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Apr 23 17:40:54 PDT 2018


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

            Bug ID: 37221
           Summary: Loop Vectorizer dom tree update broken - fires SCEV
                    assertion
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: Loop Optimizer
          Assignee: unassignedbugs at nondot.org
          Reporter: serguei.katkov at azul.com
                CC: llvm-bugs at lists.llvm.org

This is another failure similar to bug #36311. At least the reason of assert is
the same but the place of triggering the SCEV is another one.

it looks like I found another similar problem with Loop Vectorizer and SCEV.
The following reproducer triggers an assert due to SCEV do not see DT changes.
; ModuleID = 'test.ll'
source_filename = "test.ll"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"
target triple = "x86_64-unknown-linux-gnu"

define i32 @test(i32 addrspace(1)* %p) {
entry:
  br label %outer

outer:                                            ; preds = %outer_latch,
%entry
  %iv = phi i64 [ 2, %entry ], [ %iv.next, %outer_latch ]
  br label %inner

inner:                                            ; preds = %inner, %outer
  %0 = phi i32 [ %2, %inner ], [ 0, %outer ]
  %a = phi i32 [ %3, %inner ], [ 1, %outer ]
  %b = phi i32 [ %1, %inner ], [ 6, %outer ]
  %1 = add i32 %b, 2
  %2 = or i32 %0, %b
  %3 = add nuw nsw i32 %a, 1
  %4 = zext i32 %3 to i64
  %5 = icmp ugt i64 %iv, %4
  br i1 %5, label %inner, label %outer_latch

outer_latch:                                      ; preds = %inner
  store atomic i32 %2, i32 addrspace(1)* %p unordered, align 4
  %iv.next = add nuw nsw i64 %iv, 1
  %6 = icmp ugt i64 %iv, 63
  br i1 %6, label %exit, label %outer

exit:                                             ; preds = %outer_latch
  ret i32 0
}


$ ~/work/llvm/build/buildDA/bin/opt -loop-vectorize test.ll -S
opt: /home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:9096: bool
llvm::ScalarEvolution::isLoopEntryGuardedByCond(const llvm::Loop*,
llvm::CmpInst::Predicate, const llvm::SCEV*, const llvm::SCEV*): Assertion
`isAvailableAtLoopEntry(LHS, L) && "LHS is not available at Loop Entry"'
failed.
Stack dump:
0.      Program arguments: /home/skatkov/work/llvm/build/buildDA/bin/opt
-loop-vectorize test.ll -S
1.      Running pass 'Function Pass Manager' on module 'test.ll'.
2.      Running pass 'Loop Vectorization' on function '@test'
#0 0x00007f91b64dc4b9 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
/home/skatkov/work/llvm/src/lib/Support/Unix/Signals.inc:398:0
#1 0x00007f91b64dc54a PrintStackTraceSignalHandler(void*)
/home/skatkov/work/llvm/src/lib/Support/Unix/Signals.inc:462:0
#2 0x00007f91b64daa30 llvm::sys::RunSignalHandlers()
/home/skatkov/work/llvm/src/lib/Support/Signals.cpp:49:0
#3 0x00007f91b64dbe51 SignalHandler(int)
/home/skatkov/work/llvm/src/lib/Support/Unix/Signals.inc:252:0
#4 0x00007f91b3c6e370 __restore_rt (/lib64/libpthread.so.0+0xf370)
#5 0x00007f91b30a31d7 __GI_raise
/usr/src/debug/glibc-2.17-c758a686/signal/../nptl/sysdeps/unix/sysv/linux/raise.c:56:0
#6 0x00007f91b30a48c8 __GI_abort
/usr/src/debug/glibc-2.17-c758a686/stdlib/abort.c:92:0
#7 0x00007f91b309c146 __assert_fail_base
/usr/src/debug/glibc-2.17-c758a686/assert/assert.c:92:0
#8 0x00007f91b309c1f2 (/lib64/libc.so.6+0x2e1f2)
#9 0x00007f91b7b7b8c4
llvm::ScalarEvolution::isLoopEntryGuardedByCond(llvm::Loop const*,
llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:9097:0
#10 0x00007f91b7b7a346
llvm::ScalarEvolution::isKnownOnEveryIteration(llvm::CmpInst::Predicate,
llvm::SCEVAddRecExpr const*, llvm::SCEV const*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:8721:0
#11 0x00007f91b7b533ff llvm::ScalarEvolution::getZeroExtendExpr(llvm::SCEV
const*, llvm::Type*, unsigned int)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:1729:0
#12 0x00007f91b7b6f6f7 llvm::ScalarEvolution::createSCEV(llvm::Value*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:6254:0
#13 0x00007f91b7b641d6 llvm::ScalarEvolution::getSCEV(llvm::Value*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:3746:0
#14 0x00007f91b7b7c006
llvm::ScalarEvolution::isImpliedCond(llvm::CmpInst::Predicate, llvm::SCEV
const*, llvm::SCEV const*, llvm::Value*, bool)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:9228:0
#15 0x00007f91b7b7b55f
llvm::ScalarEvolution::isLoopBackedgeGuardedByCond(llvm::Loop const*,
llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:9077:0
#16 0x00007f91b7b533dc llvm::ScalarEvolution::getZeroExtendExpr(llvm::SCEV
const*, llvm::Type*, unsigned int)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:1729:0
#17 0x00007f91b7b7c163
llvm::ScalarEvolution::isImpliedCond(llvm::CmpInst::Predicate, llvm::SCEV
const*, llvm::SCEV const*, llvm::CmpInst::Predicate, llvm::SCEV const*,
llvm::SCEV const*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:9245:0
#18 0x00007f91b7b7c03d
llvm::ScalarEvolution::isImpliedCond(llvm::CmpInst::Predicate, llvm::SCEV
const*, llvm::SCEV const*, llvm::Value*, bool)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:9230:0
#19 0x00007f91b7b7b040
llvm::ScalarEvolution::isLoopBackedgeGuardedByCond(llvm::Loop const*,
llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:8998:0
#20 0x00007f91b7b533dc llvm::ScalarEvolution::getZeroExtendExpr(llvm::SCEV
const*, llvm::Type*, unsigned int)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:1729:0
#21 0x00007f91b7b5d81d llvm::ScalarEvolution::getURemExpr(llvm::SCEV const*,
llvm::SCEV const*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:2981:0
#22 0x00007f91b7b6e325 llvm::ScalarEvolution::createSCEV(llvm::Value*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:6042:0
#23 0x00007f91b7b641d6 llvm::ScalarEvolution::getSCEV(llvm::Value*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:3746:0
#24 0x00007f91b7b6e3a4 llvm::ScalarEvolution::createSCEV(llvm::Value*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:6047:0
#25 0x00007f91b7b641d6 llvm::ScalarEvolution::getSCEV(llvm::Value*)
/home/skatkov/work/llvm/src/lib/Analysis/ScalarEvolution.cpp:3746:0
#26 0x00007f91b723686e
llvm::InductionDescriptor::transform(llvm::IRBuilder<llvm::ConstantFolder,
llvm::IRBuilderDefaultInserter>&, llvm::Value*, llvm::ScalarEvolution*,
llvm::DataLayout const&) const
/home/skatkov/work/llvm/src/lib/Transforms/Utils/LoopUtils.cpp:831:0
#27 0x00007f91b7848054
llvm::InnerLoopVectorizer::createVectorizedLoopSkeleton()
/home/skatkov/work/llvm/src/lib/Transforms/Vectorize/LoopVectorize.cpp:3535:0
#28 0x00007f91b785b5f5
llvm::LoopVectorizationPlanner::executePlan(llvm::InnerLoopVectorizer&,
llvm::DominatorTree*)
/home/skatkov/work/llvm/src/lib/Transforms/Vectorize/LoopVectorize.cpp:7470:0
#29 0x00007f91b7861525 llvm::LoopVectorizePass::processLoop(llvm::Loop*)
/home/skatkov/work/llvm/src/lib/Transforms/Vectorize/LoopVectorize.cpp:8564:0
#30 0x00007f91b78619fd llvm::LoopVectorizePass::runImpl(llvm::Function&,
llvm::ScalarEvolution&, llvm::LoopInfo&, llvm::TargetTransformInfo&,
llvm::DominatorTree&, llvm::BlockFrequencyInfo&, llvm::TargetLibraryInfo*,
llvm::DemandedBits&, llvm::AAResults&, llvm::AssumptionCache&,
std::function<llvm::LoopAccessInfo const& (llvm::Loop&)>&,
llvm::OptimizationRemarkEmitter&)
/home/skatkov/work/llvm/src/lib/Transforms/Vectorize/LoopVectorize.cpp:8645:0
#31 0x00007f91b78428c2 (anonymous
namespace)::LoopVectorize::runOnFunction(llvm::Function&)
/home/skatkov/work/llvm/src/lib/Transforms/Vectorize/LoopVectorize.cpp:2328:0
#32 0x00007f91b66d0394 llvm::FPPassManager::runOnFunction(llvm::Function&)
/home/skatkov/work/llvm/src/lib/IR/LegacyPassManager.cpp:1520:0
#33 0x00007f91b66d0527 llvm::FPPassManager::runOnModule(llvm::Module&)
/home/skatkov/work/llvm/src/lib/IR/LegacyPassManager.cpp:1541:0
#34 0x00007f91b66d08b3 (anonymous
namespace)::MPPassManager::runOnModule(llvm::Module&)
/home/skatkov/work/llvm/src/lib/IR/LegacyPassManager.cpp:1597:0
#35 0x00007f91b66d0fa4 llvm::legacy::PassManagerImpl::run(llvm::Module&)
/home/skatkov/work/llvm/src/lib/IR/LegacyPassManager.cpp:1700:0
#36 0x00007f91b66d11e5 llvm::legacy::PassManager::run(llvm::Module&)
/home/skatkov/work/llvm/src/lib/IR/LegacyPassManager.cpp:1732:0
#37 0x00000000004bf700 main /home/skatkov/work/llvm/src/tools/opt/opt.cpp:760:0
#38 0x00007f91b308fb35 __libc_start_main
/usr/src/debug/glibc-2.17-c758a686/csu/../csu/libc-start.c:308:0
#39 0x000000000048c1f9 _start
(/home/skatkov/work/llvm/build/buildDA/bin/opt+0x48c1f9)
Aborted (core dumped)

Unfortunately, it is not an assert in Vectorizer which triggers the SCEV
assert.

Could you please take a look into this?

-- 
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/20180424/e448fb50/attachment.html>


More information about the llvm-bugs mailing list