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