summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2016-03-03 02:06:32 +0000
committerHans Wennborg <hans@hanshq.net>2016-03-03 02:06:32 +0000
commit153e4b0f11f4d484d6e3c6b73235b1c387230b9b (patch)
treede23fc5a817e24d35de1de4a67af8697e581ef5d
parent3178b80067d842c7f202a6c9ff639055a4e6e753 (diff)
downloadbcm5719-llvm-153e4b0f11f4d484d6e3c6b73235b1c387230b9b.tar.gz
bcm5719-llvm-153e4b0f11f4d484d6e3c6b73235b1c387230b9b.zip
[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
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp20
-rw-r--r--llvm/test/CodeGen/X86/tail-call-casts.ll27
2 files changed, 47 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index b2e20110421..3b45544730e 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -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();
diff --git a/llvm/test/CodeGen/X86/tail-call-casts.ll b/llvm/test/CodeGen/X86/tail-call-casts.ll
new file mode 100644
index 00000000000..5421b498e1e
--- /dev/null
+++ b/llvm/test/CodeGen/X86/tail-call-casts.ll
@@ -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
+}
OpenPOWER on IntegriCloud