Lower varargs correctly in deopt bundle lowering
authorSanjoy Das <sanjoy@playingwithpointers.com>
Thu, 24 Mar 2016 22:37:52 +0000 (22:37 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Thu, 24 Mar 2016 22:37:52 +0000 (22:37 +0000)
Earlier we were ignoring varargs in LowerCallSiteWithDeoptBundle because
populateCallLoweringInfo does not set CallLoweringInfo::IsVarArg.

llvm-svn: 264354

llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
llvm/test/CodeGen/X86/deopt-bundles.ll

index bf9f1fa..39fea62 100644 (file)
@@ -827,6 +827,7 @@ void SelectionDAGBuilder::LowerCallSiteWithDeoptBundle(
   unsigned ArgBeginIndex = CS.arg_begin() - CS.getInstruction()->op_begin();
   populateCallLoweringInfo(SI.CLI, CS, ArgBeginIndex, CS.getNumArgOperands(),
                            Callee, CS.getType(), false);
+  SI.CLI.IsVarArg = CS.getFunctionType()->isVarArg();
 
   auto DeoptBundle = *CS.getOperandBundle(LLVMContext::OB_deopt);
 
index b90b536..4a9cf3b 100644 (file)
@@ -21,6 +21,13 @@ target triple = "x86_64-apple-macosx10.11.0"
 ; STACKMAPS-NEXT: Stack Maps:          Loc 2: Constant 1       [encoding: .byte 4, .byte 8, .short 0, .int 1]
 ; STACKMAPS-NEXT: Stack Maps:          Loc 3: Constant 1       [encoding: .byte 4, .byte 8, .short 0, .int 1]
 ; STACKMAPS-NEXT: Stack Maps:  has 0 live-out registers
+; STACKMAPS-NEXT: Stack Maps: callsite 4243
+; STACKMAPS-NEXT: Stack Maps:   has 4 locations
+; STACKMAPS-NEXT: Stack Maps:          Loc 0: Constant 0       [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps:          Loc 1: Constant 0       [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps:          Loc 2: Constant 1       [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps:          Loc 3: Constant 16      [encoding: .byte 4, .byte 8, .short 0, .int 16]
+; STACKMAPS-NEXT: Stack Maps:  has 0 live-out registers
 ; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
 ; STACKMAPS-NEXT: Stack Maps:   has 4 locations
 ; STACKMAPS-NEXT: Stack Maps:          Loc 0: Constant 0       [encoding: .byte 4, .byte 8, .short 0, .int 0]
@@ -46,6 +53,7 @@ target triple = "x86_64-apple-macosx10.11.0"
 
 declare i32 @callee_0()
 declare i32 @callee_1(i32)
+declare i32 @callee_vararg(...)
 
 define i32 @caller_0() {
 ; CHECK-LABEL: _caller_0
@@ -68,6 +76,15 @@ entry:
 ; CHECK:       retq
 }
 
+define i32 @caller_vararg() {
+; CHECK-LABEL: _caller_vararg
+entry:
+; CHECK: movb    $1, %al
+; CHECK: callq   _callee_vararg
+  %v = call i32(...) @callee_vararg(i32 42, double 500.0) "statepoint-id"="4243" [ "deopt"(i32 16) ]
+  ret i32 %v
+}
+
 define i32 @invoker_0() personality i8 0 {
 ; CHECK-LABEL: _invoker_0
 entry: