42 lines · c
1// RUN: %clang_cc1 %s -emit-llvm -fextend-variable-liveness -o - | FileCheck %s --implicit-check-not=fake.use2// Make sure we don't generate fake.use for non-scalar variables, unless they3// are small enough that they may be represented as a scalar in LLVM IR.4// Make sure we don't generate fake.use for volatile variables5// and parameters even when they are scalar.6 7struct BigAggr {8 unsigned long t;9 char c[1024];10 unsigned char r[32];11};12 13struct SmallAggr {14 int i;15 int j;16};17 18int foo(volatile int vol_param, int param)19{20 struct BigAggr big;21 struct SmallAggr small;22 volatile int vol_local;23 int local;24 unsigned long_arr[5];25 unsigned short_arr[4];26 return 0;27}28 29// CHECK: [[SMALL_ARR_FAKE_USE:%.+]] = load [4 x i[[#UINT_SIZE:]]], ptr %short_arr30// CHECK: call void (...) @llvm.fake.use([4 x i[[#UINT_SIZE]]] [[SMALL_ARR_FAKE_USE]])31 32// CHECK: [[LOCAL_FAKE_USE:%.+]] = load i32, ptr %local33// CHECK: call void (...) @llvm.fake.use(i32 [[LOCAL_FAKE_USE]])34 35// CHECK: [[SMALL_FAKE_USE:%.+]] = load %struct.SmallAggr, ptr %small36// CHECK: call void (...) @llvm.fake.use(%struct.SmallAggr [[SMALL_FAKE_USE]])37 38// CHECK: [[PARAM_FAKE_USE:%.+]] = load i32, ptr %param.addr39// CHECK: call void (...) @llvm.fake.use(i32 [[PARAM_FAKE_USE]])40 41// CHECK: declare void @llvm.fake.use42