Skip to content

Commit 785dc76

Browse files
authored
[llvm][SelectionDAG] Fix up chains in lowerInvokeable. rdar://113994760 (#94004)
lowerInvokeable wasn't updating the returned chain after emitting the lowerEndEH, which caused SwiftErrorVal-handling code to re-set the DAG root, and thus accidentally skip the EH_LABEL node it was supposed to have addeed. After fixing that, a few places needed to be adjusted that assume the specific shape of the returned DAG. Fixes: #64826 Fixes: rdar://113994760
1 parent 41c50f0 commit 785dc76

File tree

5 files changed

+247
-2
lines changed

5 files changed

+247
-2
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8606,6 +8606,7 @@ SelectionDAGBuilder::lowerInvokable(TargetLowering::CallLoweringInfo &CLI,
86068606
if (EHPadBB) {
86078607
DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
86088608
BeginLabel));
8609+
Result.second = getRoot();
86098610
}
86108611

86118612
return Result;
@@ -10448,6 +10449,8 @@ void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
1044810449
std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
1044910450

1045010451
SDNode *CallEnd = Result.second.getNode();
10452+
if (CallEnd->getOpcode() == ISD::EH_LABEL)
10453+
CallEnd = CallEnd->getOperand(0).getNode();
1045110454
if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
1045210455
CallEnd = CallEnd->getOperand(0).getNode();
1045310456

llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,9 @@ static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo(
340340
// to grab the return value from the return register(s), or it can be a LOAD
341341
// to load a value returned by reference via a stack slot.
342342

343+
if (CallEnd->getOpcode() == ISD::EH_LABEL)
344+
CallEnd = CallEnd->getOperand(0).getNode();
345+
343346
bool HasDef = !SI.CLI.RetTy->isVoidTy();
344347
if (HasDef) {
345348
if (CallEnd->getOpcode() == ISD::LOAD)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
; RUN: llc %s -filetype=obj -o - | llvm-readobj -r - | FileCheck %s --check-prefix=RELOC
2+
; RUN: llc %s -o - | FileCheck %s --check-prefix=ASM
3+
4+
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
5+
target triple = "x86_64-apple-macosx"
6+
7+
declare void @issue64826(i64, ptr, ptr swifterror)
8+
9+
define swiftcc void @rdar113994760() personality ptr @__gcc_personality_v0 {
10+
entry:
11+
%swifterror = alloca swifterror ptr, align 8
12+
invoke swiftcc void @issue64826(i64 0, ptr null, ptr swifterror %swifterror)
13+
to label %.noexc unwind label %tsan_cleanup
14+
15+
.noexc: ; preds = %entry
16+
ret void
17+
18+
tsan_cleanup: ; preds = %entry
19+
%cleanup.lpad = landingpad { ptr, i32 }
20+
cleanup
21+
resume { ptr, i32 } zeroinitializer
22+
}
23+
24+
declare i32 @__gcc_personality_v0(...)
25+
26+
; RELOC-LABEL: Relocations [
27+
; RELOC-NEXT: Section __text {
28+
; RELOC-NEXT: 0x19 1 2 1 X86_64_RELOC_BRANCH 0 __Unwind_Resume
29+
; RELOC-NEXT: 0xB 1 2 1 X86_64_RELOC_BRANCH 0 _issue64826
30+
; RELOC-NEXT: }
31+
; RELOC-NEXT: Section __eh_frame {
32+
; RELOC-NEXT: 0x13 1 2 1 X86_64_RELOC_GOT 0 ___gcc_personality_v0
33+
; RELOC-NEXT: }
34+
; RELOC-NEXT: ]
35+
36+
; ASM-LABEL: rdar113994760:
37+
; ASM: ## %bb.0: ## %entry
38+
; ASM-NEXT: pushq %r12
39+
; ASM-NEXT: .cfi_def_cfa_offset 16
40+
; ASM-NEXT: subq $16, %rsp
41+
; ASM-NEXT: .cfi_def_cfa_offset 32
42+
; ASM-NEXT: .cfi_offset %r12, -16
43+
; ASM-NEXT: Ltmp0:
44+
; ASM-NEXT: xorl %edi, %edi
45+
; ASM-NEXT: xorl %esi, %esi
46+
; ASM-NEXT: callq _issue64826
47+
; ASM-NEXT: Ltmp1:
48+
; ASM-NEXT: ## %bb.1: ## %.noexc
49+
; ASM-NEXT: addq $16, %rsp
50+
; ASM-NEXT: popq %r12
51+
; ASM-NEXT: retq
52+
; ASM-NEXT: LBB0_2: ## %tsan_cleanup
53+
; ASM-NEXT: Ltmp2:
54+
; ASM-NEXT: xorl %edi, %edi
55+
; ASM-NEXT: callq __Unwind_Resume
56+
; ASM-NEXT: Lfunc_end0:
57+
; ASM-NEXT: .cfi_endproc
58+
; ASM-NEXT: .section __TEXT,__gcc_except_tab
59+
; ASM-NEXT: .p2align 2, 0x0
60+
; ASM-NEXT: GCC_except_table0:
61+
; ASM-NEXT: Lexception0:
62+
; ASM-NEXT: .byte 255 ## @LPStart Encoding = omit
63+
; ASM-NEXT: .byte 255 ## @TType Encoding = omit
64+
; ASM-NEXT: .byte 1 ## Call site Encoding = uleb128
65+
; ASM-NEXT: .uleb128 Lcst_end0-Lcst_begin0
66+
; ASM-NEXT: Lcst_begin0:
67+
; ASM-NEXT: .uleb128 Ltmp0-Lfunc_begin0 ## >> Call Site 1 <<
68+
; ASM-NEXT: .uleb128 Ltmp1-Ltmp0 ## Call between Ltmp0 and Ltmp1
69+
; ASM-NEXT: .uleb128 Ltmp2-Lfunc_begin0 ## jumps to Ltmp2
70+
; ASM-NEXT: .byte 0 ## On action: cleanup
71+
; ASM-NEXT: .uleb128 Ltmp1-Lfunc_begin0 ## >> Call Site 2 <<
72+
; ASM-NEXT: .uleb128 Lfunc_end0-Ltmp1 ## Call between Ltmp1 and Lfunc_end0
73+
; ASM-NEXT: .byte 0 ## has no landing pad
74+
; ASM-NEXT: .byte 0 ## On action: cleanup
75+
; ASM-NEXT: Lcst_end0:
76+
; ASM-NEXT: .p2align 2, 0x0
77+
; ASM-NEXT: ## -- End function

llvm/test/CodeGen/X86/statepoint-invoke.ll

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,28 @@ declare ptr addrspace(1) @"some_other_call"(ptr addrspace(1))
99
declare i32 @"personality_function"()
1010

1111
define ptr addrspace(1) @test_basic(ptr addrspace(1) %obj,
12+
; CHECK-LABEL: test_basic:
13+
; CHECK: # %bb.0: # %entry
14+
; CHECK-NEXT: subq $24, %rsp
15+
; CHECK-NEXT: .cfi_def_cfa_offset 32
16+
; CHECK-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
17+
; CHECK-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
18+
; CHECK-NEXT: .Ltmp0:
19+
; CHECK-NEXT: callq some_call@PLT
20+
; CHECK-NEXT: .Ltmp3:
21+
; CHECK-NEXT: .Ltmp1:
22+
; CHECK-NEXT: # %bb.1: # %invoke_safepoint_normal_dest
23+
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax
24+
; CHECK-NEXT: addq $24, %rsp
25+
; CHECK-NEXT: .cfi_def_cfa_offset 8
26+
; CHECK-NEXT: retq
27+
; CHECK-NEXT: .LBB0_2: # %exceptional_return
28+
; CHECK-NEXT: .cfi_def_cfa_offset 32
29+
; CHECK-NEXT: .Ltmp2:
30+
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax
31+
; CHECK-NEXT: addq $24, %rsp
32+
; CHECK-NEXT: .cfi_def_cfa_offset 8
33+
; CHECK-NEXT: retq
1234
ptr addrspace(1) %obj1)
1335
gc "statepoint-example" personality ptr @"personality_function" {
1436
entry:
@@ -37,6 +59,26 @@ exceptional_return:
3759
; CHECK: .p2align 4
3860

3961
define ptr addrspace(1) @test_result(ptr addrspace(1) %obj,
62+
; CHECK-LABEL: test_result:
63+
; CHECK: # %bb.0: # %entry
64+
; CHECK-NEXT: pushq %rax
65+
; CHECK-NEXT: .cfi_def_cfa_offset 16
66+
; CHECK-NEXT: movq %rdi, (%rsp)
67+
; CHECK-NEXT: .Ltmp4:
68+
; CHECK-NEXT: callq some_other_call@PLT
69+
; CHECK-NEXT: .Ltmp7:
70+
; CHECK-NEXT: .Ltmp5:
71+
; CHECK-NEXT: # %bb.1: # %normal_return
72+
; CHECK-NEXT: popq %rcx
73+
; CHECK-NEXT: .cfi_def_cfa_offset 8
74+
; CHECK-NEXT: retq
75+
; CHECK-NEXT: .LBB1_2: # %exceptional_return
76+
; CHECK-NEXT: .cfi_def_cfa_offset 16
77+
; CHECK-NEXT: .Ltmp6:
78+
; CHECK-NEXT: movq (%rsp), %rax
79+
; CHECK-NEXT: popq %rcx
80+
; CHECK-NEXT: .cfi_def_cfa_offset 8
81+
; CHECK-NEXT: retq
4082
ptr addrspace(1) %obj1)
4183
gc "statepoint-example" personality ptr @personality_function {
4284
entry:
@@ -60,6 +102,57 @@ exceptional_return:
60102
; CHECK: .p2align 4
61103

62104
define ptr addrspace(1) @test_same_val(i1 %cond, ptr addrspace(1) %val1, ptr addrspace(1) %val2, ptr addrspace(1) %val3)
105+
; CHECK-LABEL: test_same_val:
106+
; CHECK: # %bb.0: # %entry
107+
; CHECK-NEXT: pushq %rbx
108+
; CHECK-NEXT: .cfi_def_cfa_offset 16
109+
; CHECK-NEXT: subq $16, %rsp
110+
; CHECK-NEXT: .cfi_def_cfa_offset 32
111+
; CHECK-NEXT: .cfi_offset %rbx, -16
112+
; CHECK-NEXT: movl %edi, %ebx
113+
; CHECK-NEXT: testb $1, %bl
114+
; CHECK-NEXT: je .LBB2_3
115+
; CHECK-NEXT: # %bb.1: # %left
116+
; CHECK-NEXT: movq %rsi, (%rsp)
117+
; CHECK-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
118+
; CHECK-NEXT: .Ltmp11:
119+
; CHECK-NEXT: movq %rsi, %rdi
120+
; CHECK-NEXT: callq some_call@PLT
121+
; CHECK-NEXT: .Ltmp14:
122+
; CHECK-NEXT: .Ltmp12:
123+
; CHECK-NEXT: # %bb.2: # %left.relocs
124+
; CHECK-NEXT: movq (%rsp), %rax
125+
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rcx
126+
; CHECK-NEXT: jmp .LBB2_5
127+
; CHECK-NEXT: .LBB2_3: # %right
128+
; CHECK-NEXT: movq %rdx, (%rsp)
129+
; CHECK-NEXT: movq %rcx, {{[0-9]+}}(%rsp)
130+
; CHECK-NEXT: .Ltmp8:
131+
; CHECK-NEXT: movq %rsi, %rdi
132+
; CHECK-NEXT: callq some_call@PLT
133+
; CHECK-NEXT: .Ltmp15:
134+
; CHECK-NEXT: .Ltmp9:
135+
; CHECK-NEXT: # %bb.4: # %right.relocs
136+
; CHECK-NEXT: movq (%rsp), %rcx
137+
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax
138+
; CHECK-NEXT: .LBB2_5: # %normal_return
139+
; CHECK-NEXT: testb $1, %bl
140+
; CHECK-NEXT: cmoveq %rcx, %rax
141+
; CHECK-NEXT: .LBB2_6: # %normal_return
142+
; CHECK-NEXT: addq $16, %rsp
143+
; CHECK-NEXT: .cfi_def_cfa_offset 16
144+
; CHECK-NEXT: popq %rbx
145+
; CHECK-NEXT: .cfi_def_cfa_offset 8
146+
; CHECK-NEXT: retq
147+
; CHECK-NEXT: .LBB2_9: # %exceptional_return.right
148+
; CHECK-NEXT: .cfi_def_cfa_offset 32
149+
; CHECK-NEXT: .Ltmp10:
150+
; CHECK-NEXT: movq (%rsp), %rax
151+
; CHECK-NEXT: jmp .LBB2_6
152+
; CHECK-NEXT: .LBB2_7: # %exceptional_return.left
153+
; CHECK-NEXT: .Ltmp13:
154+
; CHECK-NEXT: movq (%rsp), %rax
155+
; CHECK-NEXT: jmp .LBB2_6
63156
gc "statepoint-example" personality ptr @"personality_function" {
64157
entry:
65158
br i1 %cond, label %left, label %right
@@ -102,6 +195,23 @@ exceptional_return.right:
102195
}
103196

104197
define ptr addrspace(1) @test_null_undef(ptr addrspace(1) %val1)
198+
; CHECK-LABEL: test_null_undef:
199+
; CHECK: # %bb.0: # %entry
200+
; CHECK-NEXT: pushq %rax
201+
; CHECK-NEXT: .cfi_def_cfa_offset 16
202+
; CHECK-NEXT: .Ltmp16:
203+
; CHECK-NEXT: callq some_call@PLT
204+
; CHECK-NEXT: .Ltmp19:
205+
; CHECK-NEXT: .Ltmp17:
206+
; CHECK-NEXT: .LBB3_1: # %normal_return
207+
; CHECK-NEXT: xorl %eax, %eax
208+
; CHECK-NEXT: popq %rcx
209+
; CHECK-NEXT: .cfi_def_cfa_offset 8
210+
; CHECK-NEXT: retq
211+
; CHECK-NEXT: .LBB3_2: # %exceptional_return
212+
; CHECK-NEXT: .cfi_def_cfa_offset 16
213+
; CHECK-NEXT: .Ltmp18:
214+
; CHECK-NEXT: jmp .LBB3_1
105215
gc "statepoint-example" personality ptr @"personality_function" {
106216
entry:
107217
%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)]
@@ -121,6 +231,26 @@ exceptional_return:
121231
}
122232

123233
define ptr addrspace(1) @test_alloca_and_const(ptr addrspace(1) %val1)
234+
; CHECK-LABEL: test_alloca_and_const:
235+
; CHECK: # %bb.0: # %entry
236+
; CHECK-NEXT: pushq %rax
237+
; CHECK-NEXT: .cfi_def_cfa_offset 16
238+
; CHECK-NEXT: .Ltmp20:
239+
; CHECK-NEXT: callq some_call@PLT
240+
; CHECK-NEXT: .Ltmp23:
241+
; CHECK-NEXT: .Ltmp21:
242+
; CHECK-NEXT: # %bb.1: # %normal_return
243+
; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rax
244+
; CHECK-NEXT: popq %rcx
245+
; CHECK-NEXT: .cfi_def_cfa_offset 8
246+
; CHECK-NEXT: retq
247+
; CHECK-NEXT: .LBB4_2: # %exceptional_return
248+
; CHECK-NEXT: .cfi_def_cfa_offset 16
249+
; CHECK-NEXT: .Ltmp22:
250+
; CHECK-NEXT: movl $15, %eax
251+
; CHECK-NEXT: popq %rcx
252+
; CHECK-NEXT: .cfi_def_cfa_offset 8
253+
; CHECK-NEXT: retq
124254
gc "statepoint-example" personality ptr @"personality_function" {
125255
entry:
126256
%a = alloca i32

llvm/test/CodeGen/X86/statepoint-spill-lowering.ll

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,29 @@ target triple = "x86_64-pc-linux-gnu"
88
declare void @"some_call"(ptr addrspace(1))
99
declare i32 @"personality_function"()
1010

11-
; CHECK-LABEL: test_invoke:
1211
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)
12+
; CHECK-LABEL: test_invoke:
13+
; CHECK: # %bb.0: # %entry
14+
; CHECK-NEXT: pushq %rax
15+
; CHECK-NEXT: .cfi_def_cfa_offset 16
16+
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rdi
17+
; CHECK-NEXT: movq %rdi, (%rsp)
18+
; CHECK-NEXT: .Ltmp0:
19+
; CHECK-NEXT: callq some_call@PLT
20+
; CHECK-NEXT: .Ltmp3:
21+
; CHECK-NEXT: .Ltmp1:
22+
; CHECK-NEXT: # %bb.1: # %invoke_safepoint_normal_dest
23+
; CHECK-NEXT: movq (%rsp), %rax
24+
; CHECK-NEXT: popq %rcx
25+
; CHECK-NEXT: .cfi_def_cfa_offset 8
26+
; CHECK-NEXT: retq
27+
; CHECK-NEXT: .LBB0_2: # %exceptional_return
28+
; CHECK-NEXT: .cfi_def_cfa_offset 16
29+
; CHECK-NEXT: .Ltmp2:
30+
; CHECK-NEXT: xorl %eax, %eax
31+
; CHECK-NEXT: popq %rcx
32+
; CHECK-NEXT: .cfi_def_cfa_offset 8
33+
; CHECK-NEXT: retq
1334
gc "statepoint-example" personality ptr @"personality_function" {
1435
entry:
1536
%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)]
@@ -25,8 +46,19 @@ exceptional_return:
2546
ret ptr addrspace(1) null
2647
}
2748

28-
; CHECK-LABEL: test_call:
2949
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)
50+
; CHECK-LABEL: test_call:
51+
; CHECK: # %bb.0: # %entry
52+
; CHECK-NEXT: pushq %rax
53+
; CHECK-NEXT: .cfi_def_cfa_offset 16
54+
; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rdi
55+
; CHECK-NEXT: movq %rdi, (%rsp)
56+
; CHECK-NEXT: callq some_call@PLT
57+
; CHECK-NEXT: .Ltmp4:
58+
; CHECK-NEXT: movq (%rsp), %rax
59+
; CHECK-NEXT: popq %rcx
60+
; CHECK-NEXT: .cfi_def_cfa_offset 8
61+
; CHECK-NEXT: retq
3062
gc "statepoint-example" personality ptr @"personality_function" {
3163
entry:
3264
%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)]

0 commit comments

Comments
 (0)