1 ; RUN: llc -mtriple armv7 -target-abi apcs -O0 -o - < %s \ 2 ; RUN: | FileCheck %s -check-prefix CHECK-TAIL 3 ; RUN: llc -mtriple armv7 -target-abi apcs -O0 -disable-tail-calls -o - < %s \ 4 ; RUN: | FileCheck %s -check-prefix CHECK-NO-TAIL 5 6 declare i32 @callee(i32 %i) 7 declare extern_weak fastcc void @callee_weak() 8 9 define i32 @caller(i32 %i) { 10 entry: 11 %r = tail call i32 @callee(i32 %i) 12 ret i32 %r 13 } 14 15 ; CHECK-TAIL-LABEL: caller 16 ; CHECK-TAIL: b callee 17 18 ; CHECK-NO-TAIL-LABEL: caller 19 ; CHECK-NO-TAIL: push {lr} 20 ; CHECK-NO-TAIL: bl callee 21 ; CHECK-NO-TAIL: pop {lr} 22 ; CHECK-NO-TAIL: bx lr 23 24 25 ; Weakly-referenced extern functions cannot be tail-called, as AAELF does 26 ; not define the behaviour of branch instructions to undefined weak symbols. 27 define fastcc void @caller_weak() { 28 ; CHECK-LABEL: caller_weak: 29 ; CHECK: bl callee_weak 30 tail call void @callee_weak() 31 ret void 32 } 33