| ; RUN: llc -mtriple armv7 -target-abi apcs -O0 -o - < %s \ |
| ; RUN: | FileCheck %s -check-prefix CHECK-TAIL |
| ; RUN: llc -mtriple armv7 -target-abi apcs -O0 -disable-tail-calls -o - < %s \ |
| ; RUN: | FileCheck %s -check-prefix CHECK-NO-TAIL |
| |
| declare i32 @callee(i32 %i) |
| declare extern_weak fastcc void @callee_weak() |
| |
| define i32 @caller(i32 %i) { |
| entry: |
| %r = tail call i32 @callee(i32 %i) |
| ret i32 %r |
| } |
| |
| ; CHECK-TAIL-LABEL: caller |
| ; CHECK-TAIL: b callee |
| |
| ; CHECK-NO-TAIL-LABEL: caller |
| ; CHECK-NO-TAIL: push {lr} |
| ; CHECK-NO-TAIL: bl callee |
| ; CHECK-NO-TAIL: pop {lr} |
| ; CHECK-NO-TAIL: bx lr |
| |
| |
| ; Weakly-referenced extern functions cannot be tail-called, as AAELF does |
| ; not define the behaviour of branch instructions to undefined weak symbols. |
| define fastcc void @caller_weak() { |
| ; CHECK-LABEL: caller_weak: |
| ; CHECK: bl callee_weak |
| tail call void @callee_weak() |
| ret void |
| } |