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

           Summary: Bottom-up FastISel broke tail calls
           Product: libraries
           Version: trunk
          Platform: Macintosh
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Common Code Generator Code
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]


The rewrite of FastISel to go bottom-up doesn't work with tail calls.  Example:

; ModuleID = '<stdin>'
target datalayout =
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin11.0"

define i32 @foo() nounwind ssp {
entry:
 %0 = tail call i32 (...)* @bar() nounwind       ; <i32> [#uses=1]
 ret i32 %0
}

Output:

    .section    __TEXT,__text,regular,pure_instructions
    .globl    _foo
    .align    4, 0x90
_foo:                                   ## @foo
## BB#0:                                ## %entry
    xorb    %al, %al
    #TC_RETURN _bar $0
    movl    -4(%rsp), %eax          ## 4-byte Reload
    ret

Formerly, lowering the tail call set the IsTailCall flag, which caused an early
exit from the loop walking instructions, which meant the ret was never
selected.  emitEpilog lowered the TC_RETURN to TAILJMP, and all was well.  Now,
we select the RET, which means (a) it's there in the output when it shouldn't
be, because nobody ever deletes it, and (b) emitEpilog doesn't lower the
TC_RETURN because it's not the terminator.  Badness.

-- 
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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to