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 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 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; 29entry: 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 57define void @no_gc() { 58; CHECK-LABEL: define void @no_gc() { 59; CHECK-NEXT: ret void 60; 61 ret void 62} 63