| // 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 |