ldc/tests/codegen/gc2stack.d
2018-06-18 21:35:46 +03:00

138 lines
1.8 KiB
D

// RUN: %ldc -O2 -c -output-ll -of=%t.ll %s && FileCheck %s < %t.ll
// RUN: %ldc -O2 -disable-gc2stack -c -output-ll -of=%t.ll %s && FileCheck %s --check-prefix NOOPT < %t.ll
class Bar
{
int i;
}
// CHECK: define
int foo1()
{
// NOOPT: call{{.*}}_d_newarrayT
// CHECK-NOT: _d_newarrayT
int[] i = new int[5];
i[3] = 42;
// CHECK: ret
return i[3];
}
// CHECK: define
int foo2()
{
// NOOPT: call{{.*}}_d_allocmemoryT
// CHECK-NOT: _d_allocmemoryT
int* i = new int;
*i = 42;
// CHECK: ret
return *i;
}
// CHECK: define
int foo3()
{
// NOOPT: call{{.*}}_d_allocclass
// CHECK-NOT: _d_allocclass
Bar i = new Bar;
i.i = 42;
// CHECK: ret
return i.i;
}
int[] bar1()
{
// CHECK: _d_newarrayT
int[] i = new int[5];
// CHECK: ret
return i;
}
int* bar2()
{
// CHECK: _d_allocmemoryT
int* i = new int;
// CHECK: ret
return i;
}
Bar bar3()
{
// CHECK: _d_allocclass
Bar i = new Bar;
// CHECK: ret
return i;
}
extern void fun(int[]);
extern void fun(int*);
extern void fun(Bar);
// CHECK: define
int baz1()
{
// CHECK: _d_newarrayT
int[] i = new int[5];
fun(i);
i[3] = 42;
// CHECK: ret
return i[3];
}
// CHECK: define
int baz2()
{
// CHECK: _d_allocmemoryT
int* i = new int;
fun(i);
*i = 42;
// CHECK: ret
return *i;
}
// CHECK: define
int baz3()
{
// CHECK: _d_allocclass
Bar i = new Bar;
fun(i);
i.i = 42;
// CHECK: ret
return i.i;
}
__gshared int[] p1;
__gshared int* p2;
__gshared Bar p3;
// CHECK: define
int bzz1()
{
// CHECK: _d_newarrayT
int[] i = new int[5];
p1 = i;
i[3] = 42;
// CHECK: ret
return i[3];
}
// CHECK: define
int bzz2()
{
// CHECK: _d_allocmemoryT
int* i = new int;
p2 = i;
*i = 42;
// CHECK: ret
return *i;
}
// CHECK: define
int bzz3()
{
// CHECK: _d_allocclass
Bar i = new Bar;
p3 = i;
i.i = 42;
// CHECK: ret
return i.i;
}