llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
26.84k stars 11.01k forks source link

New assertion: "getVRegDef assumes a single definition or no definition" after r313343 #33977

Open zmodem opened 6 years ago

zmodem commented 6 years ago
Bugzilla Link 34629
Version trunk
OS Linux
Blocks llvm/llvm-project#32102
CC @dbabokin,@RKSimon,@zhendongsu

Extended Description

See https://bugs.chromium.org/p/chromium/issues/detail?id=765748#c1 for repro.

RKSimon commented 2 years ago

mentioned in issue llvm/llvm-bugzilla-archive#34634

RKSimon commented 6 years ago

Bug llvm/llvm-bugzilla-archive#34634 has been marked as a duplicate of this bug.

dbabokin commented 6 years ago

Smaller reproducer with the same assertion.

char a; long b; void c() { if (~4 b & 45 b) a = 0; }

zmodem commented 6 years ago

creduced:

typedef int size_t; template <class _Tp, class = _Tp> class C; class A { protected: typedef float &reference; float *_begin; }; template <class, class> class C : A { public: C(long); reference operator; };

class B { void m_fn1(); long kFloatStride; static constexpr size_t kVertexCount = 24; }; template <class _Tp, class _Allocator> typename C<_Tp, _Allocator>::reference C<_Tp, _Allocator>::operator[](long p1) { return _begin[p1]; }

void B::m_fn1() { int floatStride = kFloatStride; size_t floatCount; C inputData(floatCount); for (size_t count = 0; count < kVertexCount; ++count) inputData[count * floatStride] = count; }

$ bin/clang -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -target-cpu x86-64 -O2 -std=gnu++14 /tmp/a.cc clang: ../lib/CodeGen/MachineRegisterInfo.cpp:366: llvm::MachineInstr* llvm::MachineRegisterInfo::getVRegDef(unsigned int) const: Assertion `(I.atEnd() || std::next(I) == def_instr_end()) && "getVRegDef assumes a single definition or no definition"' failed.

​0 0x000000000211c73a llvm::sys::PrintStackTrace(llvm::raw_ostream&) (bin/clang+0x211c73a)

​1 0x000000000211a7ae llvm::sys::RunSignalHandlers() (bin/clang+0x211a7ae)

​2 0x000000000211a912 SignalHandler(int) (bin/clang+0x211a912)

​3 0x00007f6cb0170330 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x10330)

​4 0x00007f6caef60c37 gsignal /build/eglibc-SvCtMH/eglibc-2.19/signal/../nptl/sysdeps/unix/sysv/linux/raise.c:56:0

​5 0x00007f6caef64028 abort /build/eglibc-SvCtMH/eglibc-2.19/stdlib/abort.c:91:0

​6 0x00007f6caef59bf6 __assert_fail_base /build/eglibc-SvCtMH/eglibc-2.19/assert/assert.c:92:0

​7 0x00007f6caef59ca2 (/lib/x86_64-linux-gnu/libc.so.6+0x2fca2)

​8 0x0000000001a133f1 llvm::MachineRegisterInfo::getVRegDef(unsigned int) const (bin/clang+0x1a133f1)

​9 0x000000000167ea9f isDefCopyLike(llvm::MachineRegisterInfo*, llvm::MachineOperand const&) (bin/clang+0x167ea9f)

​10 0x000000000168248c llvm::DenseMapInfo<(anonymous namespace)::MemOpKey>::getHashValue((anonymous namespace)::MemOpKey const&) (bin/clang+0x168248c)

​11 0x0000000001682927 bool llvm::DenseMapBase<llvm::DenseMap<(anonymous namespace)::MemOpKey, std::list<llvm::MachineInstr, std::allocator<llvm::MachineInstr> >, llvm::DenseMapInfo<(anonymous namespace)::MemOpKey>, llvm::detail::DenseMapPair<(anonymous namespace)::MemOpKey, std::list<llvm::MachineInstr, std::allocator<llvm::MachineInstr> > > >, (anonymous namespace)::MemOpKey, std::list<llvm::MachineInstr, std::allocator<llvm::MachineInstr> >, llvm::DenseMapInfo<(anonymous namespace)::MemOpKey>, llvm::detail::DenseMapPair<(anonymous namespace)::MemOpKey, std::list<llvm::MachineInstr, std::allocator<llvm::MachineInstr> > > >::LookupBucketFor<(anonymous namespace)::MemOpKey>((anonymous namespace)::MemOpKey const&, llvm::detail::DenseMapPair<(anonymous namespace)::MemOpKey, std::list<llvm::MachineInstr, std::allocator<llvm::MachineInstr> > > const*&) const (bin/clang+0x1682927)

​12 0x0000000001682bca (anonymous namespace)::FactorizeLEAOpt::popScope() (bin/clang+0x1682bca)

​13 0x00000000016839dc (anonymous namespace)::OptimizeLEAPass::FactorizeLEAsBasicBlock(llvm::DomTreeNodeBase*) (bin/clang+0x16839dc)

​14 0x00000000016845fc (anonymous namespace)::OptimizeLEAPass::runOnMachineFunction(llvm::MachineFunction&) (bin/clang+0x16845fc)

​15 0x00000000019b7635 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (bin/clang+0x19b7635)

​16 0x0000000001cbf9c3 llvm::FPPassManager::runOnFunction(llvm::Function&) (bin/clang+0x1cbf9c3)

​17 0x0000000001cbfa6c llvm::FPPassManager::runOnModule(llvm::Module&) (bin/clang+0x1cbfa6c)

​18 0x0000000001cc080f llvm::legacy::PassManagerImpl::run(llvm::Module&) (bin/clang+0x1cc080f)

​19 0x00000000022ab8be (anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete >) (bin/clang+0x22ab8be)

​20 0x00000000022acb9f clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete >) (bin/clang+0x22acb9f)

​21 0x000000000299c69b clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (bin/clang+0x299c69b)

​22 0x0000000002da47b2 clang::ParseAST(clang::Sema&, bool, bool) (bin/clang+0x2da47b2)

​23 0x000000000299bd3f clang::CodeGenAction::ExecuteAction() (bin/clang+0x299bd3f)

​24 0x000000000264bf76 clang::FrontendAction::Execute() (bin/clang+0x264bf76)

​25 0x000000000262385e clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (bin/clang+0x262385e)

​26 0x00000000026dc90b clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (bin/clang+0x26dc90b)

​27 0x0000000000bd4ed8 cc1_main(llvm::ArrayRef<char const>, char const, void*) (bin/clang+0xbd4ed8)

​28 0x0000000000b6bf5f main (bin/clang+0xb6bf5f)

​29 0x00007f6caef4bf45 __libc_start_main /build/eglibc-SvCtMH/eglibc-2.19/csu/libc-start.c:321:0

​30 0x0000000000bd04f9 _start (bin/clang+0xbd04f9)

Stack dump:

  1. Program arguments: bin/clang -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -target-cpu x86-64 -O2 -std=gnu++14 /tmp/a.cc
  2. parser at end of file
  3. Code generation
  4. Running pass 'Function Pass Manager' on module '/tmp/a.cc'.
  5. Running pass 'X86 LEA Optimize' on function '@_ZN1B5m_fn1Ev' Aborted (core dumped)
zmodem commented 6 years ago

I'm running creduce on the reproducer, but it's pretty slow.

zmodem commented 6 years ago

Reverted in r313376