[PATCH] D17786: [X86] Enable forwarding bool arguments in tail calls (PR26305)

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 1 15:52:02 PST 2016


hans created this revision.
hans added a reviewer: rnk.
hans added a subscriber: llvm-commits.

The code was previously not able to trace a boolean argument at a call site back to the formal argument of the caller.

http://reviews.llvm.org/D17786

Files:
  lib/Target/X86/X86ISelLowering.cpp
  test/CodeGen/X86/tail-call-bools.ll

Index: test/CodeGen/X86/tail-call-bools.ll
===================================================================
--- /dev/null
+++ test/CodeGen/X86/tail-call-bools.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
+}
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp
+++ lib/Target/X86/X86ISelLowering.cpp
@@ -3645,6 +3645,27 @@
                          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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17786.49559.patch
Type: text/x-patch
Size: 1946 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160301/7a36684f/attachment.bin>


More information about the llvm-commits mailing list