mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-26 12:46:00 +00:00
Correctly preserve the input chain for potential tailcall nodes whose
return values are bitcasts. The chain had previously been being clobbered with the entry node to the dag, which sometimes caused other code in the function to be erroneously deleted when tailcall optimization kicked in. <rdar://problem/13827621> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181696 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b99052ce4a
commit
d26c93d3a8
@ -2147,7 +2147,7 @@ bool ARMTargetLowering::isUsedByReturnOnly(SDNode *N, SDValue &Chain) const {
|
||||
Copy = *Copy->use_begin();
|
||||
if (Copy->getOpcode() != ISD::CopyToReg || !Copy->hasNUsesOfValue(1, 0))
|
||||
return false;
|
||||
Chain = Copy->getOperand(0);
|
||||
TCChain = Copy->getOperand(0);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -162,3 +162,20 @@ define i32 @t9() nounwind {
|
||||
declare %class.MutexLock* @_ZN9MutexLockC1Ev(%class.MutexLock*) unnamed_addr nounwind align 2
|
||||
|
||||
declare %class.MutexLock* @_ZN9MutexLockD1Ev(%class.MutexLock*) unnamed_addr nounwind align 2
|
||||
|
||||
; rdar://13827621
|
||||
; Correctly preserve the input chain for the tailcall node in the bitcast case,
|
||||
; otherwise the call to floorf is lost.
|
||||
define float @libcall_tc_test2(float* nocapture %a, float %b) {
|
||||
; CHECKT2D: libcall_tc_test2:
|
||||
; CHECKT2D: blx _floorf
|
||||
; CHECKT2D: b.w _truncf
|
||||
%1 = load float* %a, align 4
|
||||
%call = tail call float @floorf(float %1)
|
||||
store float %call, float* %a, align 4
|
||||
%call1 = tail call float @truncf(float %b)
|
||||
ret float %call1
|
||||
}
|
||||
|
||||
declare float @floorf(float) readnone
|
||||
declare float @truncf(float) readnone
|
||||
|
Loading…
x
Reference in New Issue
Block a user