63 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes='require<collector-metadata>,function(gc-lowering)' < %s | FileCheck %s3 4declare ptr @llvm_gc_allocate(i32)5declare void @llvm_gc_initialize(i32)6 7declare void @llvm.gcroot(ptr, ptr)8declare void @llvm.gcwrite(ptr, ptr, ptr)9 10define 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 814; CHECK-NEXT: store ptr null, ptr [[A]], align 815; CHECK-NEXT: [[B:%.*]] = alloca ptr, align 816; CHECK-NEXT: store ptr null, ptr [[B]], align 817; 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 821; 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 824; CHECK-NEXT: [[B_1:%.*]] = load ptr, ptr [[B]], align 825; CHECK-NEXT: [[A_1:%.*]] = load ptr, ptr [[A]], align 826; CHECK-NEXT: store ptr [[A_1]], ptr [[B_1]], align 827; CHECK-NEXT: ret i32 028;29entry:30 %A = alloca ptr31 %B = alloca ptr32 33 call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap34 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 %A41 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 %B48 49 ;; *B = A;50 %B.1 = load ptr, ptr %B51 %A.1 = load ptr, ptr %A52 call void @llvm.gcwrite(ptr %A.1, ptr %B.upgrd.1, ptr %B.1)53 54 ret i32 055}56 57define void @no_gc() {58; CHECK-LABEL: define void @no_gc() {59; CHECK-NEXT: ret void60;61 ret void62}63