[llvm] a58c8a7 - Remove the additional constant which requires an extra register for statepoint lowering.

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 5 08:49:35 PDT 2020


Author: Zuojian Lin
Date: 2020-04-05T11:22:09-04:00
New Revision: a58c8a78660896bfe7d5e0ca18b9ab7458dea92b

URL: https://github.com/llvm/llvm-project/commit/a58c8a78660896bfe7d5e0ca18b9ab7458dea92b
DIFF: https://github.com/llvm/llvm-project/commit/a58c8a78660896bfe7d5e0ca18b9ab7458dea92b.diff

LOG: Remove the additional constant which requires an extra register for statepoint lowering.

The newly-created constant zero will need an extra register to hold it
in the current statepoint lowering implementation. Remove it if there
exists one.

Added: 
    llvm/test/CodeGen/X86/statepoint-no-extra-const.ll

Modified: 
    llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
index f292d510f65d..8cb609090b16 100644
--- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
@@ -804,22 +804,17 @@ SelectionDAGBuilder::LowerStatepoint(ImmutableStatepoint ISP,
 #endif
 
   SDValue ActualCallee;
+  SDValue Callee = getValue(ISP.getCalledValue());
 
   if (ISP.getNumPatchBytes() > 0) {
     // If we've been asked to emit a nop sequence instead of a call instruction
     // for this statepoint then don't lower the call target, but use a constant
-    // `null` instead.  Not lowering the call target lets statepoint clients get
-    // away without providing a physical address for the symbolic call target at
-    // link time.
-
-    const auto &TLI = DAG.getTargetLoweringInfo();
-    const auto &DL = DAG.getDataLayout();
-
-    unsigned AS = ISP.getCalledValue()->getType()->getPointerAddressSpace();
-    ActualCallee =
-        DAG.getTargetConstant(0, getCurSDLoc(), TLI.getPointerTy(DL, AS));
+    // `undef` instead.  Not lowering the call target lets statepoint clients
+    // get away without providing a physical address for the symbolic call
+    // target at link time.
+    ActualCallee = DAG.getUNDEF(Callee.getValueType());
   } else {
-    ActualCallee = getValue(ISP.getCalledValue());
+    ActualCallee = Callee;
   }
 
   StatepointLoweringInfo SI(DAG);

diff  --git a/llvm/test/CodeGen/X86/statepoint-no-extra-const.ll b/llvm/test/CodeGen/X86/statepoint-no-extra-const.ll
new file mode 100644
index 000000000000..a4291020196b
--- /dev/null
+++ b/llvm/test/CodeGen/X86/statepoint-no-extra-const.ll
@@ -0,0 +1,23 @@
+; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s
+
+define i8 addrspace(1)* @no_extra_const(i8 addrspace(1)* %obj) gc "statepoint-example" {
+; CHECK-LABEL:   no_extra_const:
+; CHECK:	       .cfi_startproc
+; CHECK-NEXT:    # %bb.0:                                # %entry
+; CHECK-NEXT:    pushq	%rax
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    movq	%rdi, (%rsp)
+; CHECK-NEXT:    nopl	8(%rax)
+; CHECK-NEXT:    .Ltmp0:
+; CHECK-NEXT:    movq	(%rsp), %rax
+; CHECK-NEXT:    popq	%rcx
+; CHECK-NEXT:    .cfi_def_cfa_offset 8
+; CHECK-NEXT:    retq
+entry:
+  %safepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 4, void ()* null, i32 0, i32 0, i32 0, i32 0, i8 addrspace(1)* %obj)
+  %obj.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %safepoint_token, i32 7, i32 7) ; (%obj, %obj)
+  ret i8 addrspace(1)* %obj.relocated
+}
+
+declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
+declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32)


        


More information about the llvm-commits mailing list