[LLVMbugs] [Bug 3842] New: PrologEpilogInserter:: replaceFrameIndices reads past first instruction in basic block when FrameSetupOpode is first instruction in basic block

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Thu Mar 19 02:37:57 PDT 2009


http://llvm.org/bugs/show_bug.cgi?id=3842

           Summary: PrologEpilogInserter::replaceFrameIndices reads past
                    first instruction in basic block when FrameSetupOpode is
                    first instruction in basic block
           Product: libraries
           Version: 2.5
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: Common Code Generator Code
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: just.s0m3.guy+llvmbugzilla at gmail.com
                CC: llvmbugs at cs.uiuc.edu


If the first instruction in a given basic block is either the FrameSetupOpcode
or the FrameDestroyOpcode, the replaceFrameIndices method of the PEI class
fails. This only occurs on x86/ARM/... when reservedCallFrames are not
available.

Before the call to TRI.eliminateFramePseudoInstr, the method attempts to store
a reference to the current point in the instruction stream by getting the
previous instruction. If there are no instructions prior the Frame*Opcode, this
crashes with an assertion in llvm::ilist_iterator:

llc: .../llvm/include/llvm/ADT/ilist.h:173: llvm::ilist_iterator<NodeTy>&
llvm::ilist_iterator<NodeTy>::operator--() [with NodeTy = llvm::MachineInstr]:
Assertion `Traits::getNext(NodePtr) && "--'d off the beginning of an ilist!"'
failed.
0   llc       0x00000000010ec0ef
1   llc       0x00000000010ec41d
2   libc.so.6 0x0000000000032270
3   libc.so.6 0x00000000000321e5 gsignal + 53
4   libc.so.6 0x0000000000033703 abort + 387
5   libc.so.6 0x000000000002b229 __assert_fail + 233
6   llc       0x00000000004c2baf
llvm::ilist_iterator<llvm::MachineInstr>::operator--() + 127
7   llc       0x00000000004c5cfb llvm::ilist_iterator<llvm::MachineInstr>
llvm::prior<llvm::ilist_iterator<llvm::MachineInstr>
>(llvm::ilist_iterator<llvm::MachineInstr>) + 27
8   llc       0x0000000000d8e9b6
9   llc       0x0000000000d8d522
10  llc       0x00000000004b22a1
llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 65
11  llc       0x0000000001038aaa
llvm::FPPassManager::runOnFunction(llvm::Function&) + 346
12  llc       0x0000000001039224
llvm::FunctionPassManagerImpl::run(llvm::Function&) + 164
13  llc       0x000000000103935e
llvm::FunctionPassManager::run(llvm::Function&) + 190
14  llc       0x0000000000412c20 main + 3808
15  libc.so.6 0x000000000001e5c6 __libc_start_main + 230
16  llc       0x0000000000410559 atan + 241

The following test case illustrates this issue:
[code]
#include <stdio.h>
void test(char* const m) { printf(m); }
int main()
{
  while(1)
    test("test");
}
[/code]

To induce this failure with the x86 backend, modify
X86RegisterInfo::hasReservedCallFrame to always return false.


-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list