Fixes to thread local pointer handling.

This commit is contained in:
Christoffer Lerno
2025-07-05 22:29:24 +02:00
committed by Christoffer Lerno
parent 7cdb1ce9eb
commit a20e74c401
19 changed files with 663 additions and 671 deletions

View File

@@ -304,90 +304,91 @@ entry:
%retparam14 = alloca %"char[]", align 8
%taddr15 = alloca %"char[]", align 8
store ptr null, ptr %.cachedtype, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator, ptr align 8 @std.core.mem.allocator.thread_allocator, i32 16, i1 false)
%0 = call ptr @llvm.threadlocal.address.p0(ptr @std.core.mem.allocator.thread_allocator)
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator, ptr align 8 %0, i32 16, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator1, ptr align 8 %allocator, i32 16, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator2, ptr align 8 %allocator1, i32 16, i1 false)
br label %if.exit
if.exit: ; preds = %entry
%ptradd = getelementptr inbounds i8, ptr %allocator2, i64 8
%0 = load i64, ptr %ptradd, align 8
%1 = inttoptr i64 %0 to ptr
%1 = load i64, ptr %ptradd, align 8
%2 = inttoptr i64 %1 to ptr
%type = load ptr, ptr %.cachedtype, align 8
%2 = icmp eq ptr %1, %type
br i1 %2, label %cache_hit, label %cache_miss
%3 = icmp eq ptr %2, %type
br i1 %3, label %cache_hit, label %cache_miss
cache_miss: ; preds = %if.exit
%ptradd3 = getelementptr inbounds i8, ptr %1, i64 16
%3 = load ptr, ptr %ptradd3, align 8
%4 = call ptr @.dyn_search(ptr %3, ptr @"$sel.acquire")
store ptr %4, ptr %.inlinecache, align 8
store ptr %1, ptr %.cachedtype, align 8
br label %5
%ptradd3 = getelementptr inbounds i8, ptr %2, i64 16
%4 = load ptr, ptr %ptradd3, align 8
%5 = call ptr @.dyn_search(ptr %4, ptr @"$sel.acquire")
store ptr %5, ptr %.inlinecache, align 8
store ptr %2, ptr %.cachedtype, align 8
br label %6
cache_hit: ; preds = %if.exit
%cache_hit_fn = load ptr, ptr %.inlinecache, align 8
br label %5
br label %6
5: ; preds = %cache_hit, %cache_miss
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %4, %cache_miss ]
%6 = icmp eq ptr %fn_phi, null
br i1 %6, label %missing_function, label %match
6: ; preds = %cache_hit, %cache_miss
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %5, %cache_miss ]
%7 = icmp eq ptr %fn_phi, null
br i1 %7, label %missing_function, label %match
missing_function: ; preds = %5
missing_function: ; preds = %6
store %"char[]" { ptr @.panic_msg, i64 44 }, ptr %taddr, align 8
%7 = load [2 x i64], ptr %taddr, align 8
%8 = load [2 x i64], ptr %taddr, align 8
store %"char[]" { ptr @.file, i64 16 }, ptr %taddr4, align 8
%8 = load [2 x i64], ptr %taddr4, align 8
%9 = load [2 x i64], ptr %taddr4, align 8
store %"char[]" { ptr @.func, i64 4 }, ptr %taddr5, align 8
%9 = load [2 x i64], ptr %taddr5, align 8
%10 = load ptr, ptr @std.core.builtin.panic, align 8
call void %10([2 x i64] %7, [2 x i64] %8, [2 x i64] %9
%10 = load [2 x i64], ptr %taddr5, align 8
%11 = load ptr, ptr @std.core.builtin.panic, align 8
call void %11([2 x i64] %8, [2 x i64] %9, [2 x i64] %10, i32 97) #4
unreachable
match: ; preds = %5
%11 = load ptr, ptr %allocator2, align 8
%12 = call i64 %fn_phi(ptr %retparam, ptr %11, i64 12, i32 1, i64 0)
%not_err = icmp eq i64 %12, 0
%13 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %13, label %after_check, label %assign_optional
match: ; preds = %6
%12 = load ptr, ptr %allocator2, align 8
%13 = call i64 %fn_phi(ptr %retparam, ptr %12, i64 12, i32 1, i64 0)
%not_err = icmp eq i64 %13, 0
%14 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %14, label %after_check, label %assign_optional
assign_optional: ; preds = %match
store i64 %12, ptr %error_var, align 8
store i64 %13, ptr %error_var, align 8
br label %panic_block
after_check: ; preds = %match
%14 = load ptr, ptr %retparam, align 8
store ptr %14, ptr %taddr6, align 8
%15 = load ptr, ptr %taddr6, align 8
%16 = insertvalue %"char[]" undef, ptr %15, 0
%17 = insertvalue %"char[]" %16, i64 12, 1
%15 = load ptr, ptr %retparam, align 8
store ptr %15, ptr %taddr6, align 8
%16 = load ptr, ptr %taddr6, align 8
%17 = insertvalue %"char[]" undef, ptr %16, 0
%18 = insertvalue %"char[]" %17, i64 12, 1
br label %noerr_block
panic_block: ; preds = %assign_optional
%18 = insertvalue %any undef, ptr %error_var, 0
%19 = insertvalue %any %18, i64 ptrtoint (ptr @"$ct.fault" to i64), 1
%19 = insertvalue %any undef, ptr %error_var, 0
%20 = insertvalue %any %19, i64 ptrtoint (ptr @"$ct.fault" to i64), 1
store %"char[]" { ptr @.panic_msg.4, i64 36 }, ptr %taddr7, align 8
%20 = load [2 x i64], ptr %taddr7, align 8
%21 = load [2 x i64], ptr %taddr7, align 8
store %"char[]" { ptr @.file, i64 16 }, ptr %taddr8, align 8
%21 = load [2 x i64], ptr %taddr8, align 8
%22 = load [2 x i64], ptr %taddr8, align 8
store %"char[]" { ptr @.func, i64 4 }, ptr %taddr9, align 8
%22 = load [2 x i64], ptr %taddr9, align 8
store %any %19, ptr %varargslots, align 8
%23 = insertvalue %"any[]" undef, ptr %varargslots, 0
%"$$temp" = insertvalue %"any[]" %23, i64 1, 1
%23 = load [2 x i64], ptr %taddr9, align 8
store %any %20, ptr %varargslots, align 8
%24 = insertvalue %"any[]" undef, ptr %varargslots, 0
%"$$temp" = insertvalue %"any[]" %24, i64 1, 1
store %"any[]" %"$$temp", ptr %taddr10, align 8
%24 = load [2 x i64], ptr %taddr10, align 8
call void @std.core.builtin.panicf([2 x i64] %20, [2 x i64] %21, [2 x i64] %22
%25 = load [2 x i64], ptr %taddr10, align 8
call void @std.core.builtin.panicf([2 x i64] %21, [2 x i64] %22, [2 x i64] %23, i32 261, [2 x i64] %25) #4
unreachable
noerr_block: ; preds = %after_check
store %"char[]" %17, ptr %buffer, align 8
store %"char[]" %18, ptr %buffer, align 8
store i64 0, ptr %buffer.f, align 8
%optval = load i64, ptr %buffer.f, align 8
%not_err11 = icmp eq i64 %optval, 0
%25 = call i1 @llvm.expect.i1(i1 %not_err11, i1 true)
br i1 %25, label %after_check13, label %assign_optional12
%26 = call i1 @llvm.expect.i1(i1 %not_err11, i1 true)
br i1 %26, label %after_check13, label %assign_optional12
assign_optional12: ; preds = %noerr_block
store i64 %optval, ptr %buffer.f, align 8
@@ -395,15 +396,15 @@ assign_optional12: ; preds = %noerr_block
after_check13: ; preds = %noerr_block
store %"char[]" { ptr @.str.5, i64 13 }, ptr %taddr15, align 8
%26 = load [2 x i64], ptr %taddr15, align 8
%27 = load [2 x i64], ptr %buffer, align 8
%28 = call i64 @test.fileReader(ptr %retparam14, [2 x i64] %26, [2 x i64] %27)
%not_err16 = icmp eq i64 %28, 0
%29 = call i1 @llvm.expect.i1(i1 %not_err16, i1 true)
br i1 %29, label %after_check18, label %assign_optional17
%27 = load [2 x i64], ptr %taddr15, align 8
%28 = load [2 x i64], ptr %buffer, align 8
%29 = call i64 @test.fileReader(ptr %retparam14, [2 x i64] %27, [2 x i64] %28)
%not_err16 = icmp eq i64 %29, 0
%30 = call i1 @llvm.expect.i1(i1 %not_err16, i1 true)
br i1 %30, label %after_check18, label %assign_optional17
assign_optional17: ; preds = %after_check13
store i64 %28, ptr %buffer.f, align 8
store i64 %29, ptr %buffer.f, align 8
br label %after_assign
after_check18: ; preds = %after_check13