Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[llvm][SelectionDAG] Fix up chains in lowerInvokeable. rdar://113994760 #94004

Merged
merged 5 commits into from
Jun 14, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8592,6 +8592,7 @@ SelectionDAGBuilder::lowerInvokable(TargetLowering::CallLoweringInfo &CLI,
if (EHPadBB) {
DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
BeginLabel));
Result.second = getRoot();
}

return Result;
Expand Down Expand Up @@ -10389,6 +10390,8 @@ void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);

SDNode *CallEnd = Result.second.getNode();
if (CallEnd->getOpcode() == ISD::EH_LABEL)
CallEnd = CallEnd->getOperand(0).getNode();
if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
CallEnd = CallEnd->getOperand(0).getNode();

Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,9 @@ static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo(
// to grab the return value from the return register(s), or it can be a LOAD
// to load a value returned by reference via a stack slot.

if (CallEnd->getOpcode() == ISD::EH_LABEL)
CallEnd = CallEnd->getOperand(0).getNode();
Comment on lines +343 to +344
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no statepoint being lowered in any test?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These cover that path via the assertion on line 355:

 LLVM :: CodeGen/X86/statepoint-cmp-sunk-past-statepoint.ll
 LLVM :: CodeGen/X86/statepoint-invoke.ll
 LLVM :: CodeGen/X86/statepoint-ra.ll
 LLVM :: CodeGen/X86/statepoint-spill-lowering.ll
 LLVM :: CodeGen/X86/statepoint-stack-usage.ll
 LLVM :: CodeGen/X86/statepoint-vreg-invoke.ll

I'll re-run UTC and see what changes.


bool HasDef = !SI.CLI.RetTy->isVoidTy();
if (HasDef) {
if (CallEnd->getOpcode() == ISD::LOAD)
Expand Down
77 changes: 77 additions & 0 deletions llvm/test/CodeGen/X86/issue64826-switferror-eh.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
; RUN: llc %s -filetype=obj -o - | llvm-readobj -r - | FileCheck %s --check-prefix=RELOC
; RUN: llc %s -o - | FileCheck %s --check-prefix=ASM

target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx"

declare void @issue64826(i64, ptr, ptr swifterror)

define swiftcc void @rdar113994760() personality ptr @__gcc_personality_v0 {
entry:
%swifterror = alloca swifterror ptr, align 8
invoke swiftcc void @issue64826(i64 0, ptr null, ptr swifterror %swifterror)
to label %.noexc unwind label %tsan_cleanup

.noexc: ; preds = %entry
ret void

tsan_cleanup: ; preds = %entry
%cleanup.lpad = landingpad { ptr, i32 }
cleanup
resume { ptr, i32 } zeroinitializer
}

declare i32 @__gcc_personality_v0(...)

; RELOC-LABEL: Relocations [
; RELOC-NEXT: Section __text {
; RELOC-NEXT: 0x19 1 2 1 X86_64_RELOC_BRANCH 0 __Unwind_Resume
; RELOC-NEXT: 0xB 1 2 1 X86_64_RELOC_BRANCH 0 _issue64826
; RELOC-NEXT: }
; RELOC-NEXT: Section __eh_frame {
; RELOC-NEXT: 0x13 1 2 1 X86_64_RELOC_GOT 0 ___gcc_personality_v0
; RELOC-NEXT: }
; RELOC-NEXT: ]

; ASM-LABEL: rdar113994760:
; ASM: ## %bb.0: ## %entry
; ASM-NEXT: pushq %r12
; ASM-NEXT: .cfi_def_cfa_offset 16
; ASM-NEXT: subq $16, %rsp
; ASM-NEXT: .cfi_def_cfa_offset 32
; ASM-NEXT: .cfi_offset %r12, -16
; ASM-NEXT: Ltmp0:
; ASM-NEXT: xorl %edi, %edi
; ASM-NEXT: xorl %esi, %esi
; ASM-NEXT: callq _issue64826
; ASM-NEXT: Ltmp1:
; ASM-NEXT: ## %bb.1: ## %.noexc
; ASM-NEXT: addq $16, %rsp
; ASM-NEXT: popq %r12
; ASM-NEXT: retq
; ASM-NEXT: LBB0_2: ## %tsan_cleanup
; ASM-NEXT: Ltmp2:
; ASM-NEXT: xorl %edi, %edi
; ASM-NEXT: callq __Unwind_Resume
; ASM-NEXT: Lfunc_end0:
; ASM-NEXT: .cfi_endproc
; ASM-NEXT: .section __TEXT,__gcc_except_tab
; ASM-NEXT: .p2align 2, 0x0
; ASM-NEXT: GCC_except_table0:
; ASM-NEXT: Lexception0:
; ASM-NEXT: .byte 255 ## @LPStart Encoding = omit
; ASM-NEXT: .byte 255 ## @TType Encoding = omit
; ASM-NEXT: .byte 1 ## Call site Encoding = uleb128
; ASM-NEXT: .uleb128 Lcst_end0-Lcst_begin0
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would have used UTC, but it drops these :(

; ASM-NEXT: Lcst_begin0:
; ASM-NEXT: .uleb128 Ltmp0-Lfunc_begin0 ## >> Call Site 1 <<
; ASM-NEXT: .uleb128 Ltmp1-Ltmp0 ## Call between Ltmp0 and Ltmp1
; ASM-NEXT: .uleb128 Ltmp2-Lfunc_begin0 ## jumps to Ltmp2
; ASM-NEXT: .byte 0 ## On action: cleanup
; ASM-NEXT: .uleb128 Ltmp1-Lfunc_begin0 ## >> Call Site 2 <<
; ASM-NEXT: .uleb128 Lfunc_end0-Ltmp1 ## Call between Ltmp1 and Lfunc_end0
; ASM-NEXT: .byte 0 ## has no landing pad
; ASM-NEXT: .byte 0 ## On action: cleanup
; ASM-NEXT: Lcst_end0:
; ASM-NEXT: .p2align 2, 0x0
; ASM-NEXT: ## -- End function
130 changes: 130 additions & 0 deletions llvm/test/CodeGen/X86/statepoint-invoke.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,28 @@ declare ptr addrspace(1) @"some_other_call"(ptr addrspace(1))
declare i32 @"personality_function"()

define ptr addrspace(1) @test_basic(ptr addrspace(1) %obj,
; CHECK-LABEL: test_basic:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subq $24, %rsp
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
; CHECK-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
; CHECK-NEXT: .Ltmp0:
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp3:
; CHECK-NEXT: .Ltmp1:
; CHECK-NEXT: # %bb.1: # %invoke_safepoint_normal_dest
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax
; CHECK-NEXT: addq $24, %rsp
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
; CHECK-NEXT: .LBB0_2: # %exceptional_return
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: .Ltmp2:
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax
; CHECK-NEXT: addq $24, %rsp
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
ptr addrspace(1) %obj1)
gc "statepoint-example" personality ptr @"personality_function" {
entry:
Expand Down Expand Up @@ -37,6 +59,26 @@ exceptional_return:
; CHECK: .p2align 4

define ptr addrspace(1) @test_result(ptr addrspace(1) %obj,
; CHECK-LABEL: test_result:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: movq %rdi, (%rsp)
; CHECK-NEXT: .Ltmp4:
; CHECK-NEXT: callq some_other_call@PLT
; CHECK-NEXT: .Ltmp7:
; CHECK-NEXT: .Ltmp5:
; CHECK-NEXT: # %bb.1: # %normal_return
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
; CHECK-NEXT: .LBB1_2: # %exceptional_return
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .Ltmp6:
; CHECK-NEXT: movq (%rsp), %rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
ptr addrspace(1) %obj1)
gc "statepoint-example" personality ptr @personality_function {
entry:
Expand All @@ -60,6 +102,57 @@ exceptional_return:
; CHECK: .p2align 4

define ptr addrspace(1) @test_same_val(i1 %cond, ptr addrspace(1) %val1, ptr addrspace(1) %val2, ptr addrspace(1) %val3)
; CHECK-LABEL: test_same_val:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rbx
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: subq $16, %rsp
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: .cfi_offset %rbx, -16
; CHECK-NEXT: movl %edi, %ebx
; CHECK-NEXT: testb $1, %bl
; CHECK-NEXT: je .LBB2_3
; CHECK-NEXT: # %bb.1: # %left
; CHECK-NEXT: movq %rsi, (%rsp)
; CHECK-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
; CHECK-NEXT: .Ltmp11:
; CHECK-NEXT: movq %rsi, %rdi
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp14:
; CHECK-NEXT: .Ltmp12:
; CHECK-NEXT: # %bb.2: # %left.relocs
; CHECK-NEXT: movq (%rsp), %rax
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rcx
; CHECK-NEXT: jmp .LBB2_5
; CHECK-NEXT: .LBB2_3: # %right
; CHECK-NEXT: movq %rdx, (%rsp)
; CHECK-NEXT: movq %rcx, {{[0-9]+}}(%rsp)
; CHECK-NEXT: .Ltmp8:
; CHECK-NEXT: movq %rsi, %rdi
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp15:
; CHECK-NEXT: .Ltmp9:
; CHECK-NEXT: # %bb.4: # %right.relocs
; CHECK-NEXT: movq (%rsp), %rcx
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax
; CHECK-NEXT: .LBB2_5: # %normal_return
; CHECK-NEXT: testb $1, %bl
; CHECK-NEXT: cmoveq %rcx, %rax
; CHECK-NEXT: .LBB2_6: # %normal_return
; CHECK-NEXT: addq $16, %rsp
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: popq %rbx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
; CHECK-NEXT: .LBB2_9: # %exceptional_return.right
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: .Ltmp10:
; CHECK-NEXT: movq (%rsp), %rax
; CHECK-NEXT: jmp .LBB2_6
; CHECK-NEXT: .LBB2_7: # %exceptional_return.left
; CHECK-NEXT: .Ltmp13:
; CHECK-NEXT: movq (%rsp), %rax
; CHECK-NEXT: jmp .LBB2_6
gc "statepoint-example" personality ptr @"personality_function" {
entry:
br i1 %cond, label %left, label %right
Expand Down Expand Up @@ -102,6 +195,23 @@ exceptional_return.right:
}

define ptr addrspace(1) @test_null_undef(ptr addrspace(1) %val1)
; CHECK-LABEL: test_null_undef:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .Ltmp16:
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp19:
; CHECK-NEXT: .Ltmp17:
; CHECK-NEXT: .LBB3_1: # %normal_return
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
; CHECK-NEXT: .LBB3_2: # %exceptional_return
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .Ltmp18:
; CHECK-NEXT: jmp .LBB3_1
gc "statepoint-example" personality ptr @"personality_function" {
entry:
%sp1 = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %val1, i32 0, i32 0) ["gc-live"(ptr addrspace(1) null, ptr addrspace(1) undef)]
Expand All @@ -121,6 +231,26 @@ exceptional_return:
}

define ptr addrspace(1) @test_alloca_and_const(ptr addrspace(1) %val1)
; CHECK-LABEL: test_alloca_and_const:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .Ltmp20:
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp23:
; CHECK-NEXT: .Ltmp21:
; CHECK-NEXT: # %bb.1: # %normal_return
; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
; CHECK-NEXT: .LBB4_2: # %exceptional_return
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .Ltmp22:
; CHECK-NEXT: movl $15, %eax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
gc "statepoint-example" personality ptr @"personality_function" {
entry:
%a = alloca i32
Expand Down
34 changes: 34 additions & 0 deletions llvm/test/CodeGen/X86/statepoint-spill-lowering.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,28 @@ declare i32 @"personality_function"()

; CHECK-LABEL: test_invoke:
define ptr addrspace(1) @test_invoke(ptr addrspace(1) %a, ptr addrspace(1) %b, ptr addrspace(1) %c, ptr addrspace(1) %d, ptr addrspace(1) %e, ptr addrspace(1) %f, ptr addrspace(1) %g, ptr addrspace(1) %h, ptr addrspace(1) %j, ptr addrspace(1) %k, ptr addrspace(1) %l, ptr addrspace(1) %m, ptr addrspace(1) %n, ptr addrspace(1) %o, ptr addrspace(1) %p, ptr addrspace(1) %q, ptr addrspace(1) %r, ptr addrspace(1) %s, ptr addrspace(1) %t)
; CHECK-LABEL: test_invoke:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; CHECK-NEXT: movq %rdi, (%rsp)
; CHECK-NEXT: .Ltmp0:
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp3:
; CHECK-NEXT: .Ltmp1:
; CHECK-NEXT: # %bb.1: # %invoke_safepoint_normal_dest
; CHECK-NEXT: movq (%rsp), %rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
; CHECK-NEXT: .LBB0_2: # %exceptional_return
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .Ltmp2:
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
gc "statepoint-example" personality ptr @"personality_function" {
entry:
%0 = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %t, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %t)]
Expand All @@ -27,6 +49,18 @@ exceptional_return:

; CHECK-LABEL: test_call:
define ptr addrspace(1) @test_call(ptr addrspace(1) %a, ptr addrspace(1) %b, ptr addrspace(1) %c, ptr addrspace(1) %d, ptr addrspace(1) %e, ptr addrspace(1) %f, ptr addrspace(1) %g, ptr addrspace(1) %h, ptr addrspace(1) %j, ptr addrspace(1) %k, ptr addrspace(1) %l, ptr addrspace(1) %m, ptr addrspace(1) %n, ptr addrspace(1) %o, ptr addrspace(1) %p, ptr addrspace(1) %q, ptr addrspace(1) %r, ptr addrspace(1) %s, ptr addrspace(1) %t)
; CHECK-LABEL: test_call:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; CHECK-NEXT: movq %rdi, (%rsp)
; CHECK-NEXT: callq some_call@PLT
; CHECK-NEXT: .Ltmp4:
; CHECK-NEXT: movq (%rsp), %rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
gc "statepoint-example" personality ptr @"personality_function" {
entry:
%0 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %t, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %t)]
Expand Down
Loading