mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
3a33d73f69
If the caller's return type does not have a zeroext attribute but the callee does a tail call zeroext, we won't consider the tail call during CodeGenPrepare because the attributes don't match. However, if the result of the tail call has no uses, it makes sense to drop the sext/zext attributes. Differential Revision: https://reviews.llvm.org/D56486 llvm-svn: 350753
37 lines
1.0 KiB
LLVM
37 lines
1.0 KiB
LLVM
; RUN: llc -mtriple=arm64--- -stop-after=expand-isel-pseudos -o - %s | FileCheck %s
|
|
|
|
; Check that we ignore the zeroext attribute on the return type of the tail
|
|
; call, since the return value is unused. This happens during CodeGenPrepare in
|
|
; dupRetToEnableTailCallOpts, which calls attributesPermitTailCall to check if
|
|
; the attributes of the caller and the callee match.
|
|
|
|
declare zeroext i1 @zcallee()
|
|
define void @zcaller() {
|
|
; CHECK-LABEL: name: zcaller
|
|
entry:
|
|
br i1 undef, label %calllabel, label %retlabel
|
|
calllabel:
|
|
; CHECK: bb.1.calllabel:
|
|
; CHECK-NOT: BL @zcallee
|
|
; CHECK-NEXT: TCRETURNdi @zcallee
|
|
%unused_result = tail call zeroext i1 @zcallee()
|
|
br label %retlabel
|
|
retlabel:
|
|
ret void
|
|
}
|
|
|
|
declare signext i1 @scallee()
|
|
define void @scaller() {
|
|
; CHECK-LABEL: name: scaller
|
|
entry:
|
|
br i1 undef, label %calllabel, label %retlabel
|
|
calllabel:
|
|
; CHECK: bb.1.calllabel:
|
|
; CHECK-NOT: BL @scallee
|
|
; CHECK-NEXT: TCRETURNdi @scallee
|
|
%unused_result = tail call signext i1 @scallee()
|
|
br label %retlabel
|
|
retlabel:
|
|
ret void
|
|
}
|