LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 32688 - RegCoalescer asserts during joinSubRanges
Summary: RegCoalescer asserts during joinSubRanges
Status: RESOLVED FIXED
Alias: None
Product: libraries
Classification: Unclassified
Component: Register Allocator (show other bugs)
Version: trunk
Hardware: PC Linux
: P enhancement
Assignee: Matthias Braun
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-04-17 15:03 PDT by Matt Arsenault
Modified: 2017-05-18 17:29 PDT (History)
2 users (show)

See Also:
Fixed By Commit(s):


Attachments
testcase (5.06 KB, text/plain)
2017-04-17 15:03 PDT, Matt Arsenault
Details
Testcase (4.28 KB, text/plain)
2017-04-17 15:53 PDT, Matt Arsenault
Details
MIR testcase (14.65 KB, patch)
2017-04-18 15:30 PDT, Matt Arsenault
Details
Testcase (14.02 KB, patch)
2017-04-18 17:01 PDT, Matt Arsenault
Details
MIR testcase (9.80 KB, patch)
2017-04-18 17:26 PDT, Matt Arsenault
Details
MIR testcase (9.18 KB, patch)
2017-04-19 14:59 PDT, Matt Arsenault
Details
MIR testcase (7.80 KB, patch)
2017-04-19 16:52 PDT, Matt Arsenault
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Matt Arsenault 2017-04-17 15:03:48 PDT
Created attachment 18295 [details]
testcase

llc: ../lib/CodeGen/RegisterCoalescer.cpp:2212: JoinVals::ConflictResolution (anonymous namespace)::JoinVals::analyzeValue(unsigned int, (anonymous namespace)::JoinVals &): Assertion `DefMI != nullptr' failed.
#0 0x0000000002c919b9 llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/marsenau/src/lightning/llvm/build_debug/../lib/Support/Unix/Signals.inc:398:11
#1 0x0000000002c91b69 PrintStackTraceSignalHandler(void*) /home/marsenau/src/lightning/llvm/build_debug/../lib/Support/Unix/Signals.inc:462:1
#2 0x0000000002c90203 llvm::sys::RunSignalHandlers() /home/marsenau/src/lightning/llvm/build_debug/../lib/Support/Signals.cpp:44:5
#3 0x0000000002c91ec4 SignalHandler(int) /home/marsenau/src/lightning/llvm/build_debug/../lib/Support/Unix/Signals.inc:252:1
#4 0x00007f46a3d17390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
#5 0x00007f46a2882428 gsignal /build/glibc-9tT8Do/glibc-2.23/signal/../sysdeps/unix/sysv/linux/raise.c:54:0
#6 0x00007f46a288402a abort /build/glibc-9tT8Do/glibc-2.23/stdlib/abort.c:91:0
#7 0x00007f46a287abd7 __assert_fail_base /build/glibc-9tT8Do/glibc-2.23/assert/assert.c:92:0
#8 0x00007f46a287ac82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
#9 0x00000000021f5575 (anonymous namespace)::JoinVals::analyzeValue(unsigned int, (anonymous namespace)::JoinVals&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2213:9
#10 0x00000000021f4a02 (anonymous namespace)::JoinVals::computeAssignment(unsigned int, (anonymous namespace)::JoinVals&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2424:12
#11 0x00000000021f1e59 (anonymous namespace)::JoinVals::mapValues((anonymous namespace)::JoinVals&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2459:5
#12 0x00000000021f7431 (anonymous namespace)::RegisterCoalescer::joinSubRegRanges(llvm::LiveRange&, llvm::LiveRange&, llvm::LaneBitmask, llvm::CoalescerPair const&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2848:35
#13 0x00000000021f7207 (anonymous namespace)::RegisterCoalescer::mergeSubRangeInto(llvm::LiveInterval&, llvm::LiveRange const&, llvm::LaneBitmask, llvm::CoalescerPair&)::$_2::operator()(llvm::LiveInterval::SubRange&) const /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2908:7
#14 0x00000000021f6fe2 std::_Function_handler<void (llvm::LiveInterval::SubRange&), (anonymous namespace)::RegisterCoalescer::mergeSubRangeInto(llvm::LiveInterval&, llvm::LiveRange const&, llvm::LaneBitmask, llvm::CoalescerPair&)::$_2>::_M_invoke(std::_Any_data const&, llvm::LiveInterval::SubRange&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1873:7
#15 0x0000000002010e68 std::function<void (llvm::LiveInterval::SubRange&)>::operator()(llvm::LiveInterval::SubRange&) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:2267:7
#16 0x000000000200baf3 llvm::LiveInterval::refineSubRanges(llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096ul, 4096ul>&, llvm::LaneBitmask, std::function<void (llvm::LiveInterval::SubRange&)>) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/LiveInterval.cpp:887:5
#17 0x00000000021f2afb (anonymous namespace)::RegisterCoalescer::mergeSubRangeInto(llvm::LiveInterval&, llvm::LiveRange const&, llvm::LaneBitmask, llvm::CoalescerPair&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2901:3
#18 0x00000000021f15ff (anonymous namespace)::RegisterCoalescer::joinVirtRegs(llvm::CoalescerPair&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:2965:5
#19 0x00000000021ed430 (anonymous namespace)::RegisterCoalescer::joinIntervals(llvm::CoalescerPair&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:3026:50
#20 0x00000000021ea848 (anonymous namespace)::RegisterCoalescer::joinCopy(llvm::MachineInstr*, bool&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:1622:7
#21 0x00000000021e8a82 (anonymous namespace)::RegisterCoalescer::copyCoalesceWorkList(llvm::MutableArrayRef<llvm::MachineInstr*>) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:3097:10
#22 0x00000000021e8190 (anonymous namespace)::RegisterCoalescer::coalesceLocals() /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:3222:17
#23 0x00000000021e7b6e (anonymous namespace)::RegisterCoalescer::joinAllIntervals() /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:3247:7
#24 0x00000000021e725b (anonymous namespace)::RegisterCoalescer::runOnMachineFunction(llvm::MachineFunction&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/RegisterCoalescer.cpp:3302:18
#25 0x00000000020a0561 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/marsenau/src/lightning/llvm/build_debug/../lib/CodeGen/MachineFunctionPass.cpp:62:8
#26 0x00000000024c1e9f llvm::FPPassManager::runOnFunction(llvm::Function&) /home/marsenau/src/lightning/llvm/build_debug/../lib/IR/LegacyPassManager.cpp:1513:23
#27 0x00000000024c21b5 llvm::FPPassManager::runOnModule(llvm::Module&) /home/marsenau/src/lightning/llvm/build_debug/../lib/IR/LegacyPassManager.cpp:1534:16
#28 0x00000000024c294a (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/marsenau/src/lightning/llvm/build_debug/../lib/IR/LegacyPassManager.cpp:1590:23
#29 0x00000000024c2476 llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/marsenau/src/lightning/llvm/build_debug/../lib/IR/LegacyPassManager.cpp:1693:16
#30 0x00000000024c2e61 llvm::legacy::PassManager::run(llvm::Module&) /home/marsenau/src/lightning/llvm/build_debug/../lib/IR/LegacyPassManager.cpp:1724:3
#31 0x0000000000a0b422 compileModule(char**, llvm::LLVMContext&) /home/marsenau/src/lightning/llvm/build_debug/../tools/llc/llc.cpp:579:42
#32 0x0000000000a09784 main /home/marsenau/src/lightning/llvm/build_debug/../tools/llc/llc.cpp:331:13
#33 0x00007f46a286d830 __libc_start_main /build/glibc-9tT8Do/glibc-2.23/csu/../csu/libc-start.c:325:0
#34 0x0000000000a090a9 _start (/home/marsenau/src/lightning/llvm/build_debug/bin/llc+0xa090a9)
Stack dump:
0.	Program arguments: /home/marsenau/src/lightning/llvm/build_debug/bin/llc -verify-machineinstrs -o - reg-coalescer-crash.ll 
1.	Running pass 'Function Pass Manager' on module 'reg-coalescer-crash.ll'.
2.	Running pass 'Simple Register Coalescing' on function '@defmi_null_assert'
Comment 1 Matt Arsenault 2017-04-17 15:53:44 PDT
Created attachment 18296 [details]
Testcase

Reduce slightly further
Comment 2 Matt Arsenault 2017-04-18 15:30:07 PDT
Created attachment 18310 [details]
MIR testcase

A bit more reduced. llc -start-after=twoaddressinstruction -verify-machineinstrs 

It seems to have something to do with looking at IMPLICIT_DEFs slots after they are erased
Comment 3 Matt Arsenault 2017-04-18 17:01:30 PDT
Created attachment 18312 [details]
Testcase

MIR test that doesn't error with -verify-coalescing
Comment 4 Matt Arsenault 2017-04-18 17:26:00 PDT
Created attachment 18313 [details]
MIR testcase

Prune some more
Comment 5 Matt Arsenault 2017-04-19 14:59:26 PDT
Created attachment 18317 [details]
MIR testcase

Advance test state so problematic merge is first one hit
Comment 6 Matt Arsenault 2017-04-19 16:52:10 PDT
Created attachment 18318 [details]
MIR testcase

Reduce even more
Comment 7 Matthias Braun 2017-05-17 17:41:38 PDT
This fixes the given testcase for me:

--- a/lib/CodeGen/RegisterCoalescer.cpp
+++ b/lib/CodeGen/RegisterCoalescer.cpp
@@ -2666,7 +2666,8 @@ void JoinVals::pruneSubRegValues(LiveInterval &LI, LaneBitmask &ShrinkMask) {
   // Look for values being erased.
   bool DidPrune = false;
   for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
-    if (Vals[i].Resolution != CR_Erase)
+    if (Vals[i].Resolution != CR_Erase &&
+        (Vals[i].Resolution != CR_Keep || !Vals[i].ErasableImplicitDef))
       continue;

     // Check subranges at the point where the copy will be removed.


But I have to think and test some more...
Comment 8 Matthias Braun 2017-05-18 17:29:46 PDT
Thanks for the report and esp. the nicely reduced testcase. Fixed in r303396