mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 04:36:06 +00:00

Following the previous patch which adds the "extend lifetimes" flag without (almost) any functionality, this patch adds the real feature by allowing Clang to emit fake uses. These are emitted as a new form of cleanup, set for variable addresses, which just emits a fake use intrinsic when the variable falls out of scope. The code for achieving this is simple, with most of the logic centered on determining whether to emit a fake use for a given address, and on ensuring that fake uses are ignored in a few cases. Co-authored-by: Stephen Tozer <stephen.tozer@sony.com>
42 lines
1.3 KiB
C
42 lines
1.3 KiB
C
// RUN: %clang_cc1 %s -emit-llvm -fextend-variable-liveness -o - | FileCheck %s --implicit-check-not=fake.use
|
|
// Make sure we don't generate fake.use for non-scalar variables, unless they
|
|
// are small enough that they may be represented as a scalar in LLVM IR.
|
|
// Make sure we don't generate fake.use for volatile variables
|
|
// and parameters even when they are scalar.
|
|
|
|
struct BigAggr {
|
|
unsigned long t;
|
|
char c[1024];
|
|
unsigned char r[32];
|
|
};
|
|
|
|
struct SmallAggr {
|
|
int i;
|
|
int j;
|
|
};
|
|
|
|
int foo(volatile int vol_param, int param)
|
|
{
|
|
struct BigAggr big;
|
|
struct SmallAggr small;
|
|
volatile int vol_local;
|
|
int local;
|
|
unsigned long_arr[5];
|
|
unsigned short_arr[4];
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: [[SMALL_ARR_FAKE_USE:%.+]] = load [4 x i[[#UINT_SIZE:]]], ptr %short_arr
|
|
// CHECK: call void (...) @llvm.fake.use([4 x i[[#UINT_SIZE]]] [[SMALL_ARR_FAKE_USE]])
|
|
|
|
// CHECK: [[LOCAL_FAKE_USE:%.+]] = load i32, ptr %local
|
|
// CHECK: call void (...) @llvm.fake.use(i32 [[LOCAL_FAKE_USE]])
|
|
|
|
// CHECK: [[SMALL_FAKE_USE:%.+]] = load %struct.SmallAggr, ptr %small
|
|
// CHECK: call void (...) @llvm.fake.use(%struct.SmallAggr [[SMALL_FAKE_USE]])
|
|
|
|
// CHECK: [[PARAM_FAKE_USE:%.+]] = load i32, ptr %param.addr
|
|
// CHECK: call void (...) @llvm.fake.use(i32 [[PARAM_FAKE_USE]])
|
|
|
|
// CHECK: declare void @llvm.fake.use
|