text: #include "common.h"
  
  namespace bpftrace {
  namespace test {
  namespace codegen {
  
  TEST(codegen, intptrcast_assign_var)
  {
    test("kretprobe:f { @=*(int8*)(reg(\"bp\")-1) }",
  R"EXPECTED(; Function Attrs: nounwind
  declare i64 @llvm.bpf.pseudo(i64, i64) #0
  
  ; Function Attrs: argmemonly nounwind
  declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
  
  define i64 @"kretprobe:f"(i8* nocapture readonly) local_unnamed_addr section "s_kretprobe:f_1" {
  entry:
    %"@_val" = alloca i64, align 8
    %"@_key" = alloca i64, align 8
    %deref = alloca i8, align 1
    %1 = getelementptr i8, i8* %0, i64 32
    %reg_bp = load i64, i8* %1, align 8
    %2 = add i64 %reg_bp, -1
    call void @llvm.lifetime.start.p0i8(i64 -1, i8* nonnull %deref)
    %probe_read = call i64 inttoptr (i64 4 to i64 (i8*, i64, i8*)*)(i8* nonnull %deref, i64 1, i64 %2)
    %3 = load i8, i8* %deref, align 1
    call void @llvm.lifetime.end.p0i8(i64 -1, i8* nonnull %deref)
    %4 = bitcast i64* %"@_key" to i8*
    call void @llvm.lifetime.start.p0i8(i64 -1, i8* nonnull %4)
    store i64 0, i64* %"@_key", align 8
    %5 = sext i8 %3 to i64
    %6 = bitcast i64* %"@_val" to i8*
    call void @llvm.lifetime.start.p0i8(i64 -1, i8* nonnull %6)
    store i64 %5, i64* %"@_val", align 8
    %pseudo = call i64 @llvm.bpf.pseudo(i64 1, i64 1)
    %update_elem = call i64 inttoptr (i64 2 to i64 (i8*, i8*, i8*, i64)*)(i64 %pseudo, i64* nonnull %"@_key", i64* nonnull %"@_val", i64 0)
    call void @llvm.lifetime.end.p0i8(i64 -1, i8* nonnull %4)
    call void @llvm.lifetime.end.p0i8(i64 -1, i8* nonnull %6)
    ret i64 0
  }
  
  ; Function Attrs: argmemonly nounwind
  declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
  
  attributes #0 = { nounwind }
  attributes #1 = { argmemonly nounwind }
  )EXPECTED");
  }
  
  } // namespace codegen
  } // namespace test
  } // namespace bpftrace
  