-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make late_gc_lowering more robust (#57380)
There are cases where we optimize the SRet more than the pass expected so try and handle those. I'm tryin to get a test for this, this is separated from #52850 to make merging both easier --------- Co-authored-by: Jameson Nash <[email protected]>
- Loading branch information
Showing
4 changed files
with
153 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
; This file is a part of Julia. License is MIT: https://julialang.org/license | ||
|
||
; RUN: opt --load-pass-plugin=libjulia-codegen%shlibext -passes='function(LateLowerGCFrame)' -S %s | FileCheck %s | ||
|
||
declare ptr @julia.get_pgcstack() | ||
|
||
declare swiftcc void @sret_call(ptr noalias nocapture noundef nonnull sret([3 x ptr addrspace(10)]), ptr nonnull swiftself, ptr addrspace(10) nonnull) | ||
|
||
define hidden swiftcc nonnull ptr addrspace(10) @sret_select(ptr nonnull swiftself %0, ptr addrspace(10) noundef nonnull align 8 dereferenceable(88) %1, i1 %unpredictable) { | ||
; CHECK-LABEL: @sret_select | ||
; CHECK: %gcframe = call ptr @julia.new_gc_frame(i32 6) | ||
; CHECK: call ptr @julia.get_gc_frame_slot(ptr %gcframe, i32 3) | ||
; CHECK: call ptr @julia.get_gc_frame_slot(ptr %gcframe, i32 0) | ||
; CHECK: %pgcstack = call ptr @julia.get_pgcstack() | ||
; CHECK: call void @julia.push_gc_frame(ptr %gcframe, i32 6) | ||
%pgcstack = call ptr @julia.get_pgcstack() | ||
%3 = alloca [3 x i64], align 8 | ||
%4 = alloca [3 x i64], align 8 | ||
%5 = select i1 %unpredictable, ptr %3, ptr %4 | ||
call swiftcc void @sret_call(ptr noalias nocapture noundef nonnull sret([3 x ptr addrspace(10)]) %5, ptr nonnull swiftself %0, ptr addrspace(10) nonnull %1) | ||
; CHECK: call void @julia.pop_gc_frame(ptr %gcframe) | ||
ret ptr addrspace(10) %1 | ||
} | ||
|
||
define hidden swiftcc nonnull ptr addrspace(10) @sret_phi(ptr nonnull swiftself %0, ptr addrspace(10) noundef nonnull align 8 dereferenceable(88) %1, i1 %unpredictable) { | ||
top: | ||
; CHECK-LABEL: @sret_phi | ||
; CHECK: %gcframe = call ptr @julia.new_gc_frame(i32 6) | ||
; CHECK: call ptr @julia.get_gc_frame_slot(ptr %gcframe, i32 3) | ||
; CHECK: call ptr @julia.get_gc_frame_slot(ptr %gcframe, i32 0) | ||
; CHECK: %pgcstack = call ptr @julia.get_pgcstack() | ||
; CHECK: call void @julia.push_gc_frame(ptr %gcframe, i32 6) | ||
%pgcstack = call ptr @julia.get_pgcstack() | ||
%2 = alloca [3 x i64], align 8 | ||
%3 = alloca [3 x i64], align 8 | ||
br i1 %unpredictable, label %true, label %false | ||
|
||
true: ; preds = %top | ||
br label %ret | ||
|
||
false: ; preds = %top | ||
br label %ret | ||
|
||
ret: ; preds = %false, %true | ||
%4 = phi ptr [ %2, %true ], [ %3, %false ] | ||
call swiftcc void @sret_call(ptr noalias nocapture noundef nonnull sret([3 x ptr addrspace(10)]) %4, ptr nonnull swiftself %0, ptr addrspace(10) nonnull %1) | ||
; CHECK: call void @julia.pop_gc_frame(ptr %gcframe) | ||
ret ptr addrspace(10) %1 | ||
} |