[LLVMbugs] [Bug 2465] New: Invalid register allocation

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Mon Jun 16 06:27:22 PDT 2008


           Summary: Invalid register allocation
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Backend: X86
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: asl at math.spbu.ru
                CC: llvmbugs at cs.uiuc.edu

Created an attachment (id=1750)
 --> (http://llvm.org/bugs/attachment.cgi?id=1750)
Bytecode in questions

Consider the attached .ll file (sorry, I wasn't be able to reduce it).

in bb27.i.i74 we're seeing:

bb27.i.i74:             ; preds = %bb14.i.i
        %tmp30.i.i69 = getelementptr i8* %tmp1097, i32 %x_addr.0.i.i           
; <i8*> [#uses=1]
        %tmp31.i.i70 = load i8* %tmp30.i.i69, align 1           ; <i8>
        %tmp34.i.i71 = getelementptr i8* %tmp1094, i32 %y.0.i.i         ; <i8*>
        %tmp35.i.i72 = load i8* %tmp34.i.i71, align 1           ; <i8>
        %tmp36.i.i73 = icmp eq i8 %tmp31.i.i70, %tmp35.i.i72            ; <i1>
        zext i8 %tmp31.i.i70 to i32             ; <i32>:1418 [#uses=2]
        %tmp1.i2918 = and i32 %1418, 1          ; <i32> [#uses=1]
        %tmp2.i2919 = xor i32 %tmp1.i2918, 1            ; <i32> [#uses=1]
        %tmp4.i2920 = sub i32 0, %1418          ; <i32> [#uses=1]
        %tmp.i2921 = icmp ne i32 %tmp2.i2919, %tmp4.i2920               ; <i1>
        and i1 %tmp36.i.i73, %tmp.i2921         ; <i1>:1419 [#uses=1]
        br i1 %1419, label %bb9.i.i, label %snake.exit.i

so, two GEPs plus some innocent bit plays.

These are codegen'ed into:

LBB5_811:       # bb27.i.i74
        movl    208(%esp), %ecx
        movb    (%ecx,%ebp), %al
        movzbl  %al, %ecx
        movl    %ecx, %edx
        andl    $1, %edx
        negl    %ecx
        xorl    $1, %edx
        movl    204(%esp), %ebx
        cmpb    (%ebx,%ecx), %al
        jne     LBB5_813        # bb14.i.i.snake.exit.i_crit_edge

Note, that
        %tmp35.i.i72 = load i8* %tmp34.i.i71, align 1           ; <i8>
        %tmp36.i.i73 = icmp eq i8 %tmp31.i.i70, %tmp35.i.i72            ; <i1> 

is turned into 

        movl    204(%esp), %ebx
        cmpb    (%ebx,%ecx), %al

which is definitely incorrect, since %ecx was already clobbered by

If I run opt -std-compile-opts before, result is pretty sane:

LBB5_744:       # bb27.i.i74
        movl    208(%esp), %esi
        movb    (%esi,%edx), %bl
        movzbl  %bl, %esi
        movl    %esi, %ebp
        negl    %ebp
        andl    $1, %esi
        xorl    $1, %esi
        cmpl    %ebp, %esi
        movl    204(%esp), %esi
        movb    (%esi,%eax), %bh
        je      LBB5_746        # bb14.i.i.snake.exit.i_crit_edge

here %eax and %edx are liveins from prev BBs, where GEP indices were

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