1; RUN: llc -mtriple=bpf < %s | FileCheck %s 2; 3; The IR is generated from a bpftrace script (https://github.com/iovisor/bpftrace/issues/1305) 4; and then slightly adapted for easy unit testing. 5; The llvm bugzilla link: https://bugs.llvm.org/show_bug.cgi?id=47591 6 7%printf_t = type { i64, i64 } 8 9define i64 @"kprobe:blk_update_request"(ptr %0) local_unnamed_addr section "s_kprobe:blk_update_request_1" { 10entry: 11 %"struct kernfs_node.parent" = alloca i64, align 8 12 %printf_args = alloca %printf_t, align 8 13 %"struct cgroup.kn" = alloca i64, align 8 14 %"struct cgroup_subsys_state.cgroup" = alloca i64, align 8 15 %"struct blkcg_gq.blkcg" = alloca i64, align 8 16 %"struct bio.bi_blkg" = alloca i64, align 8 17 %"struct request.bio" = alloca i64, align 8 18 %1 = getelementptr i8, ptr %0, i64 112 19 %arg0 = load volatile i64, ptr %1, align 8 20 %2 = add i64 %arg0, 56 21 %3 = bitcast ptr %"struct request.bio" to ptr 22 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %3) 23 %probe_read = call i64 inttoptr (i64 4 to ptr)(ptr nonnull %"struct request.bio", i32 8, i64 %2) 24 %4 = load i64, ptr %"struct request.bio", align 8 25 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %3) 26 %5 = add i64 %4, 72 27 %6 = bitcast ptr %"struct bio.bi_blkg" to ptr 28 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %6) 29 %probe_read1 = call i64 inttoptr (i64 5 to ptr)(ptr nonnull %"struct bio.bi_blkg", i32 8, i64 %5) 30 %7 = load i64, ptr %"struct bio.bi_blkg", align 8 31 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %6) 32 %8 = add i64 %7, 40 33 %9 = bitcast ptr %"struct blkcg_gq.blkcg" to ptr 34 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %9) 35 %probe_read2 = call i64 inttoptr (i64 6 to ptr)(ptr nonnull %"struct blkcg_gq.blkcg", i32 8, i64 %8) 36 %10 = load i64, ptr %"struct blkcg_gq.blkcg", align 8 37 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %9) 38 %11 = bitcast ptr %"struct cgroup_subsys_state.cgroup" to ptr 39 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %11) 40 %probe_read3 = call i64 inttoptr (i64 7 to ptr)(ptr nonnull %"struct cgroup_subsys_state.cgroup", i32 8, i64 %10) 41 %12 = load i64, ptr %"struct cgroup_subsys_state.cgroup", align 8 42 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %11) 43 %13 = add i64 %12, 288 44 %14 = bitcast ptr %"struct cgroup.kn" to ptr 45 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %14) 46 %probe_read4 = call i64 inttoptr (i64 8 to ptr)(ptr nonnull %"struct cgroup.kn", i32 8, i64 %13) 47 %15 = load i64, ptr %"struct cgroup.kn", align 8 48 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %14) 49 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %printf_args) 50 %16 = add i64 %15, 8 51 %17 = bitcast ptr %"struct kernfs_node.parent" to ptr 52 store i64 0, ptr %printf_args, align 8 53 call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %17) 54 55; CHECK: call 8 56; CHECK-NOT: r{{[0-9]+}} = 0 57; CHECK: [[REG3:r[0-9]+]] = *(u64 *)(r10 - 24) 58; CHECK: [[REG1:r[0-9]+]] = 0 59; CHECK: *(u64 *)(r10 - 24) = [[REG1]] 60 61 %probe_read5 = call i64 inttoptr (i64 9 to ptr)(ptr nonnull %"struct kernfs_node.parent", i32 8, i64 %16) 62 %18 = load i64, ptr %"struct kernfs_node.parent", align 8 63 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %17) 64 %19 = getelementptr inbounds %printf_t, ptr %printf_args, i64 0, i32 1 65 store i64 %18, ptr %19, align 8 66 %get_cpu_id = call i64 inttoptr (i64 18 to ptr)() 67 %perf_event_output = call i64 inttoptr (i64 10 to ptr)(ptr %0, i64 2, i64 %get_cpu_id, ptr nonnull %printf_args, i64 16) 68 call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull %printf_args) 69 ret i64 0 70} 71 72; Function Attrs: argmemonly nounwind willreturn 73declare void @llvm.lifetime.start.p0(i64 immarg %0, ptr nocapture %1) #1 74 75; Function Attrs: argmemonly nounwind willreturn 76declare void @llvm.lifetime.end.p0(i64 immarg %0, ptr nocapture %1) #1 77 78attributes #0 = { nounwind } 79attributes #1 = { argmemonly nounwind willreturn } 80