Skip to content

Commit edc2066

Browse files
authored
[CodeGen][GC] Skip function without GC in GCLoweringPass (#84421)
1 parent 162180d commit edc2066

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

llvm/lib/CodeGen/GCRootLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ class GCMachineCodeAnalysis : public MachineFunctionPass {
8181

8282
PreservedAnalyses GCLoweringPass::run(Function &F,
8383
FunctionAnalysisManager &FAM) {
84+
if (!F.hasGC())
85+
return PreservedAnalyses::all();
86+
8487
auto &Info = FAM.getResult<GCFunctionAnalysis>(F);
8588

8689
bool Changed = DoLowering(F, Info.getStrategy());
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -passes='require<collector-metadata>,function(gc-lowering)' < %s | FileCheck %s
3+
4+
declare ptr @llvm_gc_allocate(i32)
5+
declare void @llvm_gc_initialize(i32)
6+
7+
declare void @llvm.gcroot(ptr, ptr)
8+
declare void @llvm.gcwrite(ptr, ptr, ptr)
9+
10+
define i32 @main() gc "shadow-stack" {
11+
; CHECK-LABEL: define i32 @main() gc "shadow-stack" {
12+
; CHECK-NEXT: entry:
13+
; CHECK-NEXT: [[A:%.*]] = alloca ptr, align 8
14+
; CHECK-NEXT: store ptr null, ptr [[A]], align 8
15+
; CHECK-NEXT: [[B:%.*]] = alloca ptr, align 8
16+
; CHECK-NEXT: store ptr null, ptr [[B]], align 8
17+
; CHECK-NEXT: call void @llvm_gc_initialize(i32 1048576)
18+
; CHECK-NEXT: call void @llvm.gcroot(ptr [[A]], ptr null)
19+
; CHECK-NEXT: [[APTR:%.*]] = call ptr @llvm_gc_allocate(i32 10)
20+
; CHECK-NEXT: store ptr [[APTR]], ptr [[A]], align 8
21+
; CHECK-NEXT: call void @llvm.gcroot(ptr [[B]], ptr null)
22+
; CHECK-NEXT: [[B_UPGRD_1:%.*]] = call ptr @llvm_gc_allocate(i32 8)
23+
; CHECK-NEXT: store ptr [[B_UPGRD_1]], ptr [[B]], align 8
24+
; CHECK-NEXT: [[B_1:%.*]] = load ptr, ptr [[B]], align 8
25+
; CHECK-NEXT: [[A_1:%.*]] = load ptr, ptr [[A]], align 8
26+
; CHECK-NEXT: store ptr [[A_1]], ptr [[B_1]], align 8
27+
; CHECK-NEXT: ret i32 0
28+
;
29+
entry:
30+
%A = alloca ptr
31+
%B = alloca ptr
32+
33+
call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap
34+
35+
;; ptr A;
36+
call void @llvm.gcroot(ptr %A, ptr null)
37+
38+
;; A = gcalloc(10);
39+
%Aptr = call ptr @llvm_gc_allocate(i32 10)
40+
store ptr %Aptr, ptr %A
41+
42+
;; ptr B;
43+
call void @llvm.gcroot(ptr %B, ptr null)
44+
45+
;; B = gcalloc(4);
46+
%B.upgrd.1 = call ptr @llvm_gc_allocate(i32 8)
47+
store ptr %B.upgrd.1, ptr %B
48+
49+
;; *B = A;
50+
%B.1 = load ptr, ptr %B
51+
%A.1 = load ptr, ptr %A
52+
call void @llvm.gcwrite(ptr %A.1, ptr %B.upgrd.1, ptr %B.1)
53+
54+
ret i32 0
55+
}
56+
57+
define void @no_gc() {
58+
; CHECK-LABEL: define void @no_gc() {
59+
; CHECK-NEXT: ret void
60+
;
61+
ret void
62+
}

0 commit comments

Comments
 (0)