forked from OSchip/llvm-project
[X86] Enable forwarding bool arguments in tail calls (PR26305)
The code was previously not able to track a boolean argument at a call site back to the formal argument of the caller. Differential Revision: http://reviews.llvm.org/D17786 llvm-svn: 262575
This commit is contained in:
parent
3178b80067
commit
153e4b0f11
|
@ -3645,6 +3645,26 @@ bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags,
|
|||
MachineFrameInfo *MFI, const MachineRegisterInfo *MRI,
|
||||
const X86InstrInfo *TII, const CCValAssign &VA) {
|
||||
unsigned Bytes = Arg.getValueType().getSizeInBits() / 8;
|
||||
|
||||
for (;;) {
|
||||
// Look through nodes that don't alter the bits of the incoming value.
|
||||
unsigned Op = Arg.getOpcode();
|
||||
if (Op == ISD::ZERO_EXTEND || Op == ISD::ANY_EXTEND || Op == ISD::BITCAST) {
|
||||
Arg = Arg.getOperand(0);
|
||||
continue;
|
||||
}
|
||||
if (Op == ISD::TRUNCATE) {
|
||||
const SDValue &TruncInput = Arg.getOperand(0);
|
||||
if (TruncInput.getOpcode() == ISD::AssertZext &&
|
||||
cast<VTSDNode>(TruncInput.getOperand(1))->getVT() ==
|
||||
Arg.getValueType()) {
|
||||
Arg = TruncInput.getOperand(0);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
int FI = INT_MAX;
|
||||
if (Arg.getOpcode() == ISD::CopyFromReg) {
|
||||
unsigned VR = cast<RegisterSDNode>(Arg.getOperand(1))->getReg();
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
; RUN: llc -mtriple=i686-unknown-linux-gnu -o - %s | FileCheck %s
|
||||
|
||||
declare void @g_bool(i1 zeroext)
|
||||
define void @f_bool(i1 zeroext %x) {
|
||||
entry:
|
||||
tail call void @g_bool(i1 zeroext %x)
|
||||
ret void
|
||||
|
||||
; Forwarding a bool in a tail call works.
|
||||
; CHECK-LABEL: f_bool:
|
||||
; CHECK-NOT: movz
|
||||
; CHECK: jmp g_bool
|
||||
}
|
||||
|
||||
|
||||
declare void @g_float(float)
|
||||
define void @f_i32(i32 %x) {
|
||||
entry:
|
||||
%0 = bitcast i32 %x to float
|
||||
tail call void @g_float(float %0)
|
||||
ret void
|
||||
|
||||
; Forwarding a bitcasted value works too.
|
||||
; CHECK-LABEL: f_i32
|
||||
; CHECK-NOT: mov
|
||||
; CHECK: jmp g_float
|
||||
}
|
Loading…
Reference in New Issue