[llvm] edc2066 - [CodeGen][GC] Skip function without GC in `GCLoweringPass` (#84421)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 13 22:07:45 PDT 2024
Author: paperchalice
Date: 2024-03-14T13:07:41+08:00
New Revision: edc206646520ce07d5741e8360787bcf0217a509
URL: https://github.com/llvm/llvm-project/commit/edc206646520ce07d5741e8360787bcf0217a509
DIFF: https://github.com/llvm/llvm-project/commit/edc206646520ce07d5741e8360787bcf0217a509.diff
LOG: [CodeGen][GC] Skip function without GC in `GCLoweringPass` (#84421)
Added:
llvm/test/CodeGen/Generic/gc-lowering.ll
Modified:
llvm/lib/CodeGen/GCRootLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/GCRootLowering.cpp b/llvm/lib/CodeGen/GCRootLowering.cpp
index 894ab9a0486a7b..0d82f2bab8960b 100644
--- a/llvm/lib/CodeGen/GCRootLowering.cpp
+++ b/llvm/lib/CodeGen/GCRootLowering.cpp
@@ -81,6 +81,9 @@ class GCMachineCodeAnalysis : public MachineFunctionPass {
PreservedAnalyses GCLoweringPass::run(Function &F,
FunctionAnalysisManager &FAM) {
+ if (!F.hasGC())
+ return PreservedAnalyses::all();
+
auto &Info = FAM.getResult<GCFunctionAnalysis>(F);
bool Changed = DoLowering(F, Info.getStrategy());
diff --git a/llvm/test/CodeGen/Generic/gc-lowering.ll b/llvm/test/CodeGen/Generic/gc-lowering.ll
new file mode 100644
index 00000000000000..fa2e92ab495f4d
--- /dev/null
+++ b/llvm/test/CodeGen/Generic/gc-lowering.ll
@@ -0,0 +1,62 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -passes='require<collector-metadata>,function(gc-lowering)' < %s | FileCheck %s
+
+declare ptr @llvm_gc_allocate(i32)
+declare void @llvm_gc_initialize(i32)
+
+declare void @llvm.gcroot(ptr, ptr)
+declare void @llvm.gcwrite(ptr, ptr, ptr)
+
+define i32 @main() gc "shadow-stack" {
+; CHECK-LABEL: define i32 @main() gc "shadow-stack" {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[A:%.*]] = alloca ptr, align 8
+; CHECK-NEXT: store ptr null, ptr [[A]], align 8
+; CHECK-NEXT: [[B:%.*]] = alloca ptr, align 8
+; CHECK-NEXT: store ptr null, ptr [[B]], align 8
+; CHECK-NEXT: call void @llvm_gc_initialize(i32 1048576)
+; CHECK-NEXT: call void @llvm.gcroot(ptr [[A]], ptr null)
+; CHECK-NEXT: [[APTR:%.*]] = call ptr @llvm_gc_allocate(i32 10)
+; CHECK-NEXT: store ptr [[APTR]], ptr [[A]], align 8
+; CHECK-NEXT: call void @llvm.gcroot(ptr [[B]], ptr null)
+; CHECK-NEXT: [[B_UPGRD_1:%.*]] = call ptr @llvm_gc_allocate(i32 8)
+; CHECK-NEXT: store ptr [[B_UPGRD_1]], ptr [[B]], align 8
+; CHECK-NEXT: [[B_1:%.*]] = load ptr, ptr [[B]], align 8
+; CHECK-NEXT: [[A_1:%.*]] = load ptr, ptr [[A]], align 8
+; CHECK-NEXT: store ptr [[A_1]], ptr [[B_1]], align 8
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ %A = alloca ptr
+ %B = alloca ptr
+
+ call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap
+
+ ;; ptr A;
+ call void @llvm.gcroot(ptr %A, ptr null)
+
+ ;; A = gcalloc(10);
+ %Aptr = call ptr @llvm_gc_allocate(i32 10)
+ store ptr %Aptr, ptr %A
+
+ ;; ptr B;
+ call void @llvm.gcroot(ptr %B, ptr null)
+
+ ;; B = gcalloc(4);
+ %B.upgrd.1 = call ptr @llvm_gc_allocate(i32 8)
+ store ptr %B.upgrd.1, ptr %B
+
+ ;; *B = A;
+ %B.1 = load ptr, ptr %B
+ %A.1 = load ptr, ptr %A
+ call void @llvm.gcwrite(ptr %A.1, ptr %B.upgrd.1, ptr %B.1)
+
+ ret i32 0
+}
+
+define void @no_gc() {
+; CHECK-LABEL: define void @no_gc() {
+; CHECK-NEXT: ret void
+;
+ ret void
+}
More information about the llvm-commits
mailing list