[LLVMdev] Troubleshooting Internal Garbage Collection

David Waggoner mathonnapkins at gmail.com
Sun Jan 13 18:12:58 PST 2013


Hello,

I've made some fair progress on a target for 6502 family CPUs recently, but
I've run into an error I'm not sure how to address. I've ruminated over it
for about a week now, trying various things and not having any success. It
seems to scale with the number of routines in my .ll file, which I am
trying to run through llc. I get the following stack dump from an assertion:

llc: LeaksContext.h:50: void llvm::LeakDetectorImpl<T>::addGarbage(const
T*) [with T = void]: Assertion `Ts.count(o) == 0 && "Object already in
set!"' failed.
0  llc       0x08d2cde8
1  llc       0x08d2d344
2            0xb7762400 __kernel_sigreturn + 0
3            0xb7762424 __kernel_vsyscall + 16
4  libc.so.6 0xb746a98f gsignal + 79
5  libc.so.6 0xb746c2d5 abort + 373
6  libc.so.6 0xb74636a5
7  libc.so.6 0xb7463757
8  llc       0x08180167
9  llc       0x08c32bec llvm::LeakDetector::addGarbageObjectImpl(void*) +
380
10 llc       0x088a8ec5 llvm::MachineInstr::MachineInstr(llvm::MCInstrDesc
const&, llvm::DebugLoc, bool) + 245
11 llc       0x08899daf
llvm::MachineFunction::CreateMachineInstr(llvm::MCInstrDesc const&,
llvm::DebugLoc, bool) + 111
12 llc       0x0871b4a0 llvm::InstrEmitter::EmitMachineNode(llvm::SDNode*,
bool, bool, llvm::DenseMap<llvm::SDValue, unsigned int,
llvm::DenseMapInfo<llvm::SDValue> >&) + 512
13 llc       0x0866dfbd
llvm::ScheduleDAGSDNodes::EmitSchedule(llvm::MachineBasicBlock::bundle_iterator<llvm::MachineInstr,
llvm::ilist_iterator<llvm::MachineInstr> >&) + 1325
14 llc       0x086ea97f llvm::SelectionDAGISel::CodeGenAndEmitDAG() + 1439
15 llc       0x086ecdf6
llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::Instruction
const>, llvm::ilist_iterator<llvm::Instruction const>, bool&) + 198
16 llc       0x086f3cf0
llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) + 2176
17 llc       0x086f5850
llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 1392
18 llc       0x088a0aca
llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 186
19 llc       0x08c42fa3 llvm::FPPassManager::runOnFunction(llvm::Function&)
+ 659
20 llc       0x08c4302c llvm::FPPassManager::runOnModule(llvm::Module&) + 76
21 llc       0x08c42c60 llvm::MPPassManager::runOnModule(llvm::Module&) +
592
22 llc       0x08c46528 llvm::PassManagerImpl::run(llvm::Module&) + 168
23 llc       0x08c46636 llvm::PassManager::run(llvm::Module&) + 38
24 llc       0x0818513a main + 4026
25 libc.so.6 0xb74546b3 __libc_start_main + 243
26 llc       0x08195e8d
Stack dump:
0.    Program arguments:
/home/MathOnNapkins/Documents/Programming/llvm-3.2/Release+Asserts/bin/llc
-march=x65 -debug -filetype=asm ./test.ll
1.    Running pass 'Function Pass Manager' on module './test.ll'.
2.    Running pass 'x65 DAG->DAG Pattern Instruction Selection' on function
'@foo_and32'

For reference, I see this with both llvm 3.1 and 3.2. I have not tried the
svn trunk, though.

The test *.ll file contains a number of small test routines, and I'll
include it in the body as well:

    define i32 @foo_add32(i32 %alpha) nounwind
    {
        %result = add nsw i32 %alpha, 262145

        ret i32 %result
    }

     define i32 @foo_sub32(i32 %alpha) nounwind
     {
         %result = sub i32 %alpha, 262147

         ret i32 %result
     }

    define i32 @test_or32(i32 %alpha) nounwind
    {
        %result = or i32 %alpha, 262148

        ret i32 %result
    }

    define i32 @foo_xor32(i32 %alpha) nounwind
    {

        %result = xor i32 %alpha, 262149

        ret i32 %result
    }

    define i32 @foo_and32(i32 %alpha) nounwind
    {

        %result = and i32 %alpha, 262150

        ret i32 %result
    }

    ; Testing commutivity of add operation.
    define i32 @foo_reverse_add32(i32 %alpha) nounwind
    {
        %result = add nsw i32 262151, %alpha

        ret i32 %result
    }

Previously, I had been testing with only one routine per test .ll file, but
I thought I'd reached a point where I could test multiple operations at
once and understand the output. The odd part about this is that the
likelihood of seeing the above assertion scales with the number of
functions in the .ll file. If I have one or two functions, I never see it.
With three, I see it sporadically. With four or five, I see it about 80% of
the time. I don't understand why it would only assert some of the time, as
the inputs are not changing. Could it be a problem with my system itself,
or perhaps I'm running low on RAM? If anybody has any insight on how to
troubleshoot this kind of problem, i'd be very grateful.

Also, I have not overriden runOnMachineFunction() in my XXXISelDagToDag.cpp
file, so this is happening somewhat out of my control. Should I attempt to
override it? I noticed that only a couple targets actually override
runOnMachineFunction() for that particular pass (MIPS, I think is one).

Sincerely,
~MathOnNapkins / Dave
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130113/a95414f4/attachment.html>


More information about the llvm-dev mailing list