Files
c3c/test/test_suite/errors/error_regression_2.c3t
Christoffer Lerno 3b0370c8bb Fix of tests.
2023-07-10 20:21:12 +02:00

1201 lines
47 KiB
C

// #target: macos-x64
module test;
import std;
import libc;
struct Doc { Head *head; }
struct Head { char[]* title; }
struct Summary
{
char[]* title;
bool ok;
}
fn void Summary.print(Summary *s, CFile out)
{
// We don't have a native printf in C3 yet, so use libc,
// which is not all that nice for the strings but...
char[] title = s.title ? *s.title : "missing";
libc::fprintf(out, "Summary({ .title = %.*s, .ok = %s})", (int)title.len, title.ptr, s.ok ? (char*)"true" : (char*)"false");
}
fn bool contains(char[] haystack, char[] needle)
{
usz len = haystack.len;
usz needle_len = needle.len;
if (len < needle_len) return false;
if (!needle_len) return true;
len -= needle_len - 1;
for (usz i = 0; i < len; i++)
{
if (libc::memcmp(&haystack[i], needle.ptr, needle_len) == 0)
{
return true;
}
}
return false;
}
macro dupe(value)
{
$typeof(&value) temp = malloc($sizeof(value));
if (!temp) return ReadError.OUT_OF_MEMORY?;
*temp = value;
return temp;
}
fault ReadError
{
BAD_READ,
OUT_OF_MEMORY
}
fn Doc! readDoc(char[] url)
{
if (contains(url, "fail")) return ReadError.BAD_READ?;
if (contains(url, "head-missing")) return { .head = null };
if (contains(url, "title-missing")) return { dupe(Head { .title = null })! };
if (contains(url, "title-empty")) return { dupe(Head { .title = dupe((char[])"")! })! };
// Not particularly elegant due to missing string functions.
int len = libc::snprintf(null, 0, "Title of %.*s", (int)url.len, url.ptr);
char* str = malloc(len + 1);
if (!str) return ReadError.OUT_OF_MEMORY?;
libc::snprintf(str, len + 1, "Title of %.*s", (int)url.len, url.ptr);
return { dupe(Head { .title = dupe(str[..len - 1])! })! };
}
fn Summary buildSummary(Doc doc)
{
return Summary {
.title = doc.head ? doc.head.title : null,
.ok = true,
};
}
fn Summary readAndBuildSummary(char[] url)
{
return buildSummary(readDoc(url)) ?? Summary { .title = null, .ok = false };
/*
// or
Summary summary = buildSummary(readDoc(url));
if (catch summary) return Summary { .title = null, .ok = false };
return summary;
// or
Summary summary = buildSummary(readDoc(url));
if (try summary) return summary;
return Summary { .title = null, .ok = false };
*/
}
fault TitleResult
{
TITLE_MISSING
}
fn bool! isTitleNonEmpty(Doc doc)
{
if (!doc.head) return TitleResult.TITLE_MISSING?;
char[]* head = doc.head.title;
if (!head) return TitleResult.TITLE_MISSING?;
return (*head).len > 0;
}
fn bool! readWhetherTitleNonEmpty(char[] url)
{
return isTitleNonEmpty(readDoc(url));
}
fn char* bool_to_string(bool b)
{
return b ? "true" : "false";
}
fn char* nameFromError(anyfault e)
{
switch (e)
{
case TitleResult.TITLE_MISSING:
return "no title";
case ReadError.BAD_READ:
return "bad read";
case ReadError.OUT_OF_MEMORY:
return "out of memory";
default:
return "unknown error";
}
}
fn void main()
{
const char[][] URLS = { "good", "title-empty", "title-missing", "head-missing", "fail" };
foreach (char[] url : URLS)
{
// Yes, it's pretty onerous to print strings for the moment in C3
libc::printf(`Checking "https://%.*s/":` "\n", (int)url.len, url.ptr);
Summary summary = readAndBuildSummary(url);
libc::printf(" Summary: ");
summary.print(libc::stdout());
libc::printf("\n");
char[] title_sure = summary.title ? *summary.title : "";
libc::printf(" Title: %.*s\n", (int)title_sure.len, title_sure.ptr);
bool! has_title = readWhetherTitleNonEmpty(url);
// This looks a bit less than elegant, but as you see it's mostly due to having to
// use printf here.
libc::printf(" Has title: %s vs %s\n", bool_to_string(has_title) ?? nameFromError(@catchof(has_title)), (has_title ?? false) ? (char*)"true" : (char*)"false");
}
}
/* #expect: test.ll
define void @test.Summary.print(ptr %0, ptr %1) #0 {
entry:
%title = alloca %"char[]", align 8
%2 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0
%3 = load ptr, ptr %2, align 8
%ptrbool = icmp ne ptr %3, null
br i1 %ptrbool, label %cond.lhs, label %cond.rhs
cond.lhs: ; preds = %entry
%4 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0
%5 = load ptr, ptr %4, align 8
%6 = load %"char[]", ptr %5, align 8
br label %cond.phi
cond.rhs: ; preds = %entry
br label %cond.phi
cond.phi: ; preds = %cond.rhs, %cond.lhs
%val = phi %"char[]" [ %6, %cond.lhs ], [ { ptr @.str.26, i64 7 }, %cond.rhs ]
store %"char[]" %val, ptr %title, align 8
%7 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 1
%8 = load i64, ptr %7, align 8
%trunc = trunc i64 %8 to i32
%9 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 0
%10 = load ptr, ptr %9, align 8
%11 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 1
%12 = load i8, ptr %11, align 8
%13 = trunc i8 %12 to i1
%ternary = select i1 %13, ptr @.str.28, ptr @.str.29
%14 = call i32 (ptr, ptr, ...) @fprintf(ptr %1, ptr @.str.27, i32 %trunc, ptr %10, ptr %ternary)
ret void
}
; Function Attrs: nounwind
define zeroext i8 @test.contains(ptr %0, i64 %1, ptr %2, i64 %3) #0 {
entry:
%haystack = alloca %"char[]", align 8
%needle = alloca %"char[]", align 8
%len = alloca i64, align 8
%needle_len = alloca i64, align 8
%i = alloca i64, align 8
store ptr %0, ptr %haystack, align 8
%ptroffset = getelementptr inbounds i64, ptr %haystack, i64 1
store i64 %1, ptr %ptroffset, align 8
store ptr %2, ptr %needle, align 8
%ptroffset1 = getelementptr inbounds i64, ptr %needle, i64 1
store i64 %3, ptr %ptroffset1, align 8
%4 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 1
%5 = load i64, ptr %4, align 8
store i64 %5, ptr %len, align 8
%6 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 1
%7 = load i64, ptr %6, align 8
store i64 %7, ptr %needle_len, align 8
%8 = load i64, ptr %len, align 8
%9 = load i64, ptr %needle_len, align 8
%lt = icmp ult i64 %8, %9
br i1 %lt, label %if.then, label %if.exit
if.then: ; preds = %entry
ret i8 0
if.exit: ; preds = %entry
%10 = load i64, ptr %needle_len, align 8
%not = icmp eq i64 %10, 0
br i1 %not, label %if.then2, label %if.exit3
if.then2: ; preds = %if.exit
ret i8 1
if.exit3: ; preds = %if.exit
%11 = load i64, ptr %len, align 8
%12 = load i64, ptr %needle_len, align 8
%sub = sub i64 %12, 1
%sub4 = sub i64 %11, %sub
store i64 %sub4, ptr %len, align 8
store i64 0, ptr %i, align 8
br label %loop.cond
loop.cond: ; preds = %if.exit8, %if.exit3
%13 = load i64, ptr %i, align 8
%14 = load i64, ptr %len, align 8
%lt5 = icmp ult i64 %13, %14
br i1 %lt5, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%15 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 0
%16 = load ptr, ptr %15, align 8
%17 = load i64, ptr %i, align 8
%ptroffset6 = getelementptr inbounds i8, ptr %16, i64 %17
%18 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 0
%19 = load ptr, ptr %18, align 8
%20 = load i64, ptr %needle_len, align 8
%21 = call i32 @memcmp(ptr %ptroffset6, ptr %19, i64 %20)
%eq = icmp eq i32 %21, 0
br i1 %eq, label %if.then7, label %if.exit8
if.then7: ; preds = %loop.body
ret i8 1
if.exit8: ; preds = %loop.body
%22 = load i64, ptr %i, align 8
%add = add i64 %22, 1
store i64 %add, ptr %i, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond
ret i8 0
}
; Function Attrs: nounwind
define i64 @test.readDoc(ptr %0, ptr %1, i64 %2) #0 {
entry:
%url = alloca %"char[]", align 8
%reterr = alloca i64, align 8
%literal = alloca %Doc, align 8
%reterr8 = alloca i64, align 8
%literal9 = alloca %Doc, align 8
%error_var = alloca i64, align 8
%value = alloca %Head, align 8
%literal10 = alloca %Head, align 8
%temp = alloca ptr, align 8
%using = alloca ptr, align 8
%end_padding = alloca i64, align 8
%error_var11 = alloca i64, align 8
%using12 = alloca ptr, align 8
%end_padding13 = alloca i64, align 8
%.anon = alloca i64, align 8
%size = alloca i64, align 8
%retparam = alloca ptr, align 8
%varargslots = alloca [1 x %any], align 16
%indirectarg = alloca %"any[]", align 8
%reterr23 = alloca i64, align 8
%literal24 = alloca %Doc, align 8
%error_var25 = alloca i64, align 8
%value26 = alloca %Head, align 8
%literal27 = alloca %Head, align 8
%error_var28 = alloca i64, align 8
%value29 = alloca %"char[]", align 8
%temp30 = alloca ptr, align 8
%using31 = alloca ptr, align 8
%end_padding32 = alloca i64, align 8
%error_var33 = alloca i64, align 8
%using34 = alloca ptr, align 8
%end_padding35 = alloca i64, align 8
%.anon36 = alloca i64, align 8
%size38 = alloca i64, align 8
%retparam41 = alloca ptr, align 8
%varargslots46 = alloca [1 x %any], align 16
%indirectarg47 = alloca %"any[]", align 8
%temp54 = alloca ptr, align 8
%using55 = alloca ptr, align 8
%end_padding56 = alloca i64, align 8
%error_var57 = alloca i64, align 8
%using58 = alloca ptr, align 8
%end_padding59 = alloca i64, align 8
%.anon60 = alloca i64, align 8
%size62 = alloca i64, align 8
%retparam65 = alloca ptr, align 8
%varargslots70 = alloca [1 x %any], align 16
%indirectarg71 = alloca %"any[]", align 8
%len = alloca i32, align 4
%str = alloca ptr, align 8
%using79 = alloca ptr, align 8
%end_padding80 = alloca i64, align 8
%error_var81 = alloca i64, align 8
%using82 = alloca ptr, align 8
%end_padding83 = alloca i64, align 8
%.anon84 = alloca i32, align 4
%size86 = alloca i64, align 8
%retparam88 = alloca ptr, align 8
%varargslots93 = alloca [1 x %any], align 16
%indirectarg94 = alloca %"any[]", align 8
%reterr102 = alloca i64, align 8
%literal103 = alloca %Doc, align 8
%error_var104 = alloca i64, align 8
%value105 = alloca %Head, align 8
%literal106 = alloca %Head, align 8
%error_var107 = alloca i64, align 8
%value108 = alloca %"char[]", align 8
%temp112 = alloca ptr, align 8
%using113 = alloca ptr, align 8
%end_padding114 = alloca i64, align 8
%error_var115 = alloca i64, align 8
%using116 = alloca ptr, align 8
%end_padding117 = alloca i64, align 8
%.anon118 = alloca i64, align 8
%size120 = alloca i64, align 8
%retparam123 = alloca ptr, align 8
%varargslots128 = alloca [1 x %any], align 16
%indirectarg129 = alloca %"any[]", align 8
%temp136 = alloca ptr, align 8
%using137 = alloca ptr, align 8
%end_padding138 = alloca i64, align 8
%error_var139 = alloca i64, align 8
%using140 = alloca ptr, align 8
%end_padding141 = alloca i64, align 8
%.anon142 = alloca i64, align 8
%size144 = alloca i64, align 8
%retparam147 = alloca ptr, align 8
%varargslots152 = alloca [1 x %any], align 16
%indirectarg153 = alloca %"any[]", align 8
store ptr %1, ptr %url, align 8
%ptroffset = getelementptr inbounds i64, ptr %url, i64 1
store i64 %2, ptr %ptroffset, align 8
%3 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo = load ptr, ptr %3, align 8
%4 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi = load i64, ptr %4, align 8
%5 = call i8 @test.contains(ptr %lo, i64 %hi, ptr @.str, i64 4)
%6 = trunc i8 %5 to i1
br i1 %6, label %if.then, label %if.exit
if.then: ; preds = %entry
ret i64 ptrtoint (ptr @"test.ReadError$BAD_READ" to i64)
if.exit: ; preds = %entry
%7 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo1 = load ptr, ptr %7, align 8
%8 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi2 = load i64, ptr %8, align 8
%9 = call i8 @test.contains(ptr %lo1, i64 %hi2, ptr @.str.3, i64 12)
%10 = trunc i8 %9 to i1
br i1 %10, label %if.then3, label %if.exit4
if.then3: ; preds = %if.exit
%11 = getelementptr inbounds %Doc, ptr %literal, i32 0, i32 0
store ptr null, ptr %11, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal, i32 8, i1 false)
ret i64 0
if.exit4: ; preds = %if.exit
%12 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo5 = load ptr, ptr %12, align 8
%13 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi6 = load i64, ptr %13, align 8
%14 = call i8 @test.contains(ptr %lo5, i64 %hi6, ptr @.str.4, i64 13)
%15 = trunc i8 %14 to i1
br i1 %15, label %if.then7, label %if.exit19
if.then7: ; preds = %if.exit4
%16 = getelementptr inbounds %Doc, ptr %literal9, i32 0, i32 0
%17 = getelementptr inbounds %Head, ptr %literal10, i32 0, i32 0
store ptr null, ptr %17, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value, ptr align 8 %literal10, i32 8, i1 false)
%18 = load ptr, ptr @std.core.mem.thread_allocator, align 8
store ptr %18, ptr %using, align 8
store i64 0, ptr %end_padding, align 8
%19 = load ptr, ptr %using, align 8
store ptr %19, ptr %using12, align 8
%20 = load i64, ptr %end_padding, align 8
store i64 %20, ptr %end_padding13, align 8
store i64 8, ptr %.anon, align 8
%21 = load ptr, ptr %using12, align 8
%22 = load i64, ptr %.anon, align 8
%23 = load i64, ptr %end_padding13, align 8
%add = add i64 %22, %23
store i64 %add, ptr %size, align 8
%24 = getelementptr inbounds %Allocator, ptr %21, i32 0, i32 0
%25 = load ptr, ptr %24, align 8
%26 = load i64, ptr %size, align 8
%27 = call i64 %25(ptr %retparam, ptr %21, i64 %26, i64 0, i64 0, ptr null, i32 0)
%not_err = icmp eq i64 %27, 0
%28 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %28, label %after_check, label %assign_optional
assign_optional: ; preds = %if.then7
store i64 %27, ptr %error_var11, align 8
br label %panic_block
after_check: ; preds = %if.then7
%29 = load ptr, ptr %retparam, align 8
br label %noerr_block
panic_block: ; preds = %assign_optional
%30 = insertvalue %any undef, ptr %error_var11, 0
%31 = insertvalue %any %30, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
%32 = getelementptr inbounds [1 x %any], ptr %varargslots, i64 0, i64 0
store %any %31, ptr %32, align 16
%33 = insertvalue %"any[]" undef, ptr %varargslots, 0
%34 = insertvalue %"any[]" %33, i64 1, 1
store %"any[]" %34, ptr %indirectarg, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 36, ptr @.file, i64 6, ptr @.func, i64 7, i32 200, ptr byval(%"any[]") align 8 %indirectarg)
unreachable
noerr_block: ; preds = %after_check
store ptr %29, ptr %temp, align 8
%35 = load ptr, ptr %temp, align 8
%not = icmp eq ptr %35, null
br i1 %not, label %if.then16, label %if.exit17
if.then16: ; preds = %noerr_block
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var, align 8
br label %guard_block
if.exit17: ; preds = %noerr_block
%36 = load ptr, ptr %temp, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %36, ptr align 8 %value, i32 8, i1 false)
br label %noerr_block18
guard_block: ; preds = %if.then16
%37 = load i64, ptr %error_var, align 8
ret i64 %37
noerr_block18: ; preds = %if.exit17
%38 = load ptr, ptr %temp, align 8
store ptr %38, ptr %16, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal9, i32 8, i1 false)
ret i64 0
if.exit19: ; preds = %if.exit4
%39 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo20 = load ptr, ptr %39, align 8
%40 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi21 = load i64, ptr %40, align 8
%41 = call i8 @test.contains(ptr %lo20, i64 %hi21, ptr @.str.5, i64 11)
%42 = trunc i8 %41 to i1
br i1 %42, label %if.then22, label %if.exit78
if.then22: ; preds = %if.exit19
%43 = getelementptr inbounds %Doc, ptr %literal24, i32 0, i32 0
store ptr null, ptr %literal27, align 8
%44 = getelementptr inbounds %Head, ptr %literal27, i32 0, i32 0
store %"char[]" zeroinitializer, ptr %value29, align 8
%45 = load ptr, ptr @std.core.mem.thread_allocator, align 8
store ptr %45, ptr %using31, align 8
store i64 0, ptr %end_padding32, align 8
%46 = load ptr, ptr %using31, align 8
store ptr %46, ptr %using34, align 8
%47 = load i64, ptr %end_padding32, align 8
store i64 %47, ptr %end_padding35, align 8
store i64 16, ptr %.anon36, align 8
%48 = load ptr, ptr %using34, align 8
%49 = load i64, ptr %.anon36, align 8
%50 = load i64, ptr %end_padding35, align 8
%add39 = add i64 %49, %50
store i64 %add39, ptr %size38, align 8
%51 = getelementptr inbounds %Allocator, ptr %48, i32 0, i32 0
%52 = load ptr, ptr %51, align 8
%53 = load i64, ptr %size38, align 8
%54 = call i64 %52(ptr %retparam41, ptr %48, i64 %53, i64 0, i64 0, ptr null, i32 0)
%not_err42 = icmp eq i64 %54, 0
%55 = call i1 @llvm.expect.i1(i1 %not_err42, i1 true)
br i1 %55, label %after_check44, label %assign_optional43
assign_optional43: ; preds = %if.then22
store i64 %54, ptr %error_var33, align 8
br label %panic_block45
after_check44: ; preds = %if.then22
%56 = load ptr, ptr %retparam41, align 8
br label %noerr_block48
panic_block45: ; preds = %assign_optional43
%57 = insertvalue %any undef, ptr %error_var33, 0
%58 = insertvalue %any %57, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
%59 = getelementptr inbounds [1 x %any], ptr %varargslots46, i64 0, i64 0
store %any %58, ptr %59, align 16
%60 = insertvalue %"any[]" undef, ptr %varargslots46, 0
%61 = insertvalue %"any[]" %60, i64 1, 1
store %"any[]" %61, ptr %indirectarg47, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 36, ptr @.file, i64 6, ptr @.func, i64 7, i32 200, ptr byval(%"any[]") align 8 %indirectarg47)
unreachable
noerr_block48: ; preds = %after_check44
store ptr %56, ptr %temp30, align 8
%62 = load ptr, ptr %temp30, align 8
%not49 = icmp eq ptr %62, null
br i1 %not49, label %if.then50, label %if.exit51
if.then50: ; preds = %noerr_block48
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var28, align 8
br label %guard_block52
if.exit51: ; preds = %noerr_block48
%63 = load ptr, ptr %temp30, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %63, ptr align 8 %value29, i32 16, i1 false)
br label %noerr_block53
guard_block52: ; preds = %if.then50
%64 = load i64, ptr %error_var28, align 8
ret i64 %64
noerr_block53: ; preds = %if.exit51
%65 = load ptr, ptr %temp30, align 8
store ptr %65, ptr %44, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value26, ptr align 8 %literal27, i32 8, i1 false)
%66 = load ptr, ptr @std.core.mem.thread_allocator, align 8
store ptr %66, ptr %using55, align 8
store i64 0, ptr %end_padding56, align 8
%67 = load ptr, ptr %using55, align 8
store ptr %67, ptr %using58, align 8
%68 = load i64, ptr %end_padding56, align 8
store i64 %68, ptr %end_padding59, align 8
store i64 8, ptr %.anon60, align 8
%69 = load ptr, ptr %using58, align 8
%70 = load i64, ptr %.anon60, align 8
%71 = load i64, ptr %end_padding59, align 8
%add63 = add i64 %70, %71
store i64 %add63, ptr %size62, align 8
%72 = getelementptr inbounds %Allocator, ptr %69, i32 0, i32 0
%73 = load ptr, ptr %72, align 8
%74 = load i64, ptr %size62, align 8
%75 = call i64 %73(ptr %retparam65, ptr %69, i64 %74, i64 0, i64 0, ptr null, i32 0)
%not_err66 = icmp eq i64 %75, 0
%76 = call i1 @llvm.expect.i1(i1 %not_err66, i1 true)
br i1 %76, label %after_check68, label %assign_optional67
assign_optional67: ; preds = %noerr_block53
store i64 %75, ptr %error_var57, align 8
br label %panic_block69
after_check68: ; preds = %noerr_block53
%77 = load ptr, ptr %retparam65, align 8
br label %noerr_block72
panic_block69: ; preds = %assign_optional67
%78 = insertvalue %any undef, ptr %error_var57, 0
%79 = insertvalue %any %78, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
%80 = getelementptr inbounds [1 x %any], ptr %varargslots70, i64 0, i64 0
store %any %79, ptr %80, align 16
%81 = insertvalue %"any[]" undef, ptr %varargslots70, 0
%82 = insertvalue %"any[]" %81, i64 1, 1
store %"any[]" %82, ptr %indirectarg71, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 36, ptr @.file, i64 6, ptr @.func, i64 7, i32 200, ptr byval(%"any[]") align 8 %indirectarg71)
unreachable
noerr_block72: ; preds = %after_check68
store ptr %77, ptr %temp54, align 8
%83 = load ptr, ptr %temp54, align 8
%not73 = icmp eq ptr %83, null
br i1 %not73, label %if.then74, label %if.exit75
if.then74: ; preds = %noerr_block72
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var25, align 8
br label %guard_block76
if.exit75: ; preds = %noerr_block72
%84 = load ptr, ptr %temp54, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %84, ptr align 8 %value26, i32 8, i1 false)
br label %noerr_block77
guard_block76: ; preds = %if.then74
%85 = load i64, ptr %error_var25, align 8
ret i64 %85
noerr_block77: ; preds = %if.exit75
%86 = load ptr, ptr %temp54, align 8
store ptr %86, ptr %43, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal24, i32 8, i1 false)
ret i64 0
if.exit78: ; preds = %if.exit19
%87 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%88 = load i64, ptr %87, align 8
%trunc = trunc i64 %88 to i32
%89 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%90 = load ptr, ptr %89, align 8
%91 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @.str.6, i32 %trunc, ptr %90)
store i32 %91, ptr %len, align 4
%92 = load ptr, ptr @std.core.mem.thread_allocator, align 8
store ptr %92, ptr %using79, align 8
store i64 0, ptr %end_padding80, align 8
%93 = load ptr, ptr %using79, align 8
store ptr %93, ptr %using82, align 8
%94 = load i64, ptr %end_padding80, align 8
store i64 %94, ptr %end_padding83, align 8
%95 = load i32, ptr %len, align 4
%add85 = add i32 %95, 1
store i32 %add85, ptr %.anon84, align 4
%96 = load ptr, ptr %using82, align 8
%97 = load i32, ptr %.anon84, align 4
%sext = sext i32 %97 to i64
%98 = load i64, ptr %end_padding83, align 8
%add87 = add i64 %sext, %98
store i64 %add87, ptr %size86, align 8
%99 = getelementptr inbounds %Allocator, ptr %96, i32 0, i32 0
%100 = load ptr, ptr %99, align 8
%101 = load i64, ptr %size86, align 8
%102 = call i64 %100(ptr %retparam88, ptr %96, i64 %101, i64 0, i64 0, ptr null, i32 0)
%not_err89 = icmp eq i64 %102, 0
%103 = call i1 @llvm.expect.i1(i1 %not_err89, i1 true)
br i1 %103, label %after_check91, label %assign_optional90
assign_optional90: ; preds = %if.exit78
store i64 %102, ptr %error_var81, align 8
br label %panic_block92
after_check91: ; preds = %if.exit78
%104 = load ptr, ptr %retparam88, align 8
br label %noerr_block95
panic_block92: ; preds = %assign_optional90
%105 = insertvalue %any undef, ptr %error_var81, 0
%106 = insertvalue %any %105, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
%107 = getelementptr inbounds [1 x %any], ptr %varargslots93, i64 0, i64 0
store %any %106, ptr %107, align 16
%108 = insertvalue %"any[]" undef, ptr %varargslots93, 0
%109 = insertvalue %"any[]" %108, i64 1, 1
store %"any[]" %109, ptr %indirectarg94, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 36, ptr @.file, i64 6, ptr @.func, i64 7, i32 200, ptr byval(%"any[]") align 8 %indirectarg94)
unreachable
noerr_block95: ; preds = %after_check91
store ptr %104, ptr %str, align 8
%110 = load ptr, ptr %str, align 8
%not96 = icmp eq ptr %110, null
br i1 %not96, label %if.then97, label %if.exit98
if.then97: ; preds = %noerr_block95
ret i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64)
if.exit98: ; preds = %noerr_block95
%111 = load ptr, ptr %str, align 8
%112 = load i32, ptr %len, align 4
%sext99 = sext i32 %112 to i64
%add100 = add i64 %sext99, 1
%113 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%114 = load i64, ptr %113, align 8
%trunc101 = trunc i64 %114 to i32
%115 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%116 = load ptr, ptr %115, align 8
%117 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr %111, i64 %add100, ptr @.str.7, i32 %trunc101, ptr %116)
%118 = getelementptr inbounds %Doc, ptr %literal103, i32 0, i32 0
store ptr null, ptr %literal106, align 8
%119 = getelementptr inbounds %Head, ptr %literal106, i32 0, i32 0
%120 = load ptr, ptr %str, align 8
%121 = load i32, ptr %len, align 4
%sub = sub i32 %121, 1
%sext109 = sext i32 %sub to i64
%122 = add i64 %sext109, 1
%size110 = sub i64 %122, 0
%ptroffset111 = getelementptr inbounds i8, ptr %120, i64 0
%123 = insertvalue %"char[]" undef, ptr %ptroffset111, 0
%124 = insertvalue %"char[]" %123, i64 %size110, 1
store %"char[]" %124, ptr %value108, align 8
%125 = load ptr, ptr @std.core.mem.thread_allocator, align 8
store ptr %125, ptr %using113, align 8
store i64 0, ptr %end_padding114, align 8
%126 = load ptr, ptr %using113, align 8
store ptr %126, ptr %using116, align 8
%127 = load i64, ptr %end_padding114, align 8
store i64 %127, ptr %end_padding117, align 8
store i64 16, ptr %.anon118, align 8
%128 = load ptr, ptr %using116, align 8
%129 = load i64, ptr %.anon118, align 8
%130 = load i64, ptr %end_padding117, align 8
%add121 = add i64 %129, %130
store i64 %add121, ptr %size120, align 8
%131 = getelementptr inbounds %Allocator, ptr %128, i32 0, i32 0
%132 = load ptr, ptr %131, align 8
%133 = load i64, ptr %size120, align 8
%134 = call i64 %132(ptr %retparam123, ptr %128, i64 %133, i64 0, i64 0, ptr null, i32 0)
%not_err124 = icmp eq i64 %134, 0
%135 = call i1 @llvm.expect.i1(i1 %not_err124, i1 true)
br i1 %135, label %after_check126, label %assign_optional125
assign_optional125: ; preds = %if.exit98
store i64 %134, ptr %error_var115, align 8
br label %panic_block127
after_check126: ; preds = %if.exit98
%136 = load ptr, ptr %retparam123, align 8
br label %noerr_block130
panic_block127: ; preds = %assign_optional125
%137 = insertvalue %any undef, ptr %error_var115, 0
%138 = insertvalue %any %137, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
%139 = getelementptr inbounds [1 x %any], ptr %varargslots128, i64 0, i64 0
store %any %138, ptr %139, align 16
%140 = insertvalue %"any[]" undef, ptr %varargslots128, 0
%141 = insertvalue %"any[]" %140, i64 1, 1
store %"any[]" %141, ptr %indirectarg129, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 36, ptr @.file, i64 6, ptr @.func, i64 7, i32 200, ptr byval(%"any[]") align 8 %indirectarg129)
unreachable
noerr_block130: ; preds = %after_check126
store ptr %136, ptr %temp112, align 8
%142 = load ptr, ptr %temp112, align 8
%not131 = icmp eq ptr %142, null
br i1 %not131, label %if.then132, label %if.exit133
if.then132: ; preds = %noerr_block130
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var107, align 8
br label %guard_block134
if.exit133: ; preds = %noerr_block130
%143 = load ptr, ptr %temp112, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %143, ptr align 8 %value108, i32 16, i1 false)
br label %noerr_block135
guard_block134: ; preds = %if.then132
%144 = load i64, ptr %error_var107, align 8
ret i64 %144
noerr_block135: ; preds = %if.exit133
%145 = load ptr, ptr %temp112, align 8
store ptr %145, ptr %119, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value105, ptr align 8 %literal106, i32 8, i1 false)
%146 = load ptr, ptr @std.core.mem.thread_allocator, align 8
store ptr %146, ptr %using137, align 8
store i64 0, ptr %end_padding138, align 8
%147 = load ptr, ptr %using137, align 8
store ptr %147, ptr %using140, align 8
%148 = load i64, ptr %end_padding138, align 8
store i64 %148, ptr %end_padding141, align 8
store i64 8, ptr %.anon142, align 8
%149 = load ptr, ptr %using140, align 8
%150 = load i64, ptr %.anon142, align 8
%151 = load i64, ptr %end_padding141, align 8
%add145 = add i64 %150, %151
store i64 %add145, ptr %size144, align 8
%152 = getelementptr inbounds %Allocator, ptr %149, i32 0, i32 0
%153 = load ptr, ptr %152, align 8
%154 = load i64, ptr %size144, align 8
%155 = call i64 %153(ptr %retparam147, ptr %149, i64 %154, i64 0, i64 0, ptr null, i32 0)
%not_err148 = icmp eq i64 %155, 0
%156 = call i1 @llvm.expect.i1(i1 %not_err148, i1 true)
br i1 %156, label %after_check150, label %assign_optional149
assign_optional149: ; preds = %noerr_block135
store i64 %155, ptr %error_var139, align 8
br label %panic_block151
after_check150: ; preds = %noerr_block135
%157 = load ptr, ptr %retparam147, align 8
br label %noerr_block154
panic_block151: ; preds = %assign_optional149
%158 = insertvalue %any undef, ptr %error_var139, 0
%159 = insertvalue %any %158, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
%160 = getelementptr inbounds [1 x %any], ptr %varargslots152, i64 0, i64 0
store %any %159, ptr %160, align 16
%161 = insertvalue %"any[]" undef, ptr %varargslots152, 0
%162 = insertvalue %"any[]" %161, i64 1, 1
store %"any[]" %162, ptr %indirectarg153, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 36, ptr @.file, i64 6, ptr @.func, i64 7, i32 200, ptr byval(%"any[]") align 8 %indirectarg153)
unreachable
noerr_block154: ; preds = %after_check150
store ptr %157, ptr %temp136, align 8
%163 = load ptr, ptr %temp136, align 8
%not155 = icmp eq ptr %163, null
br i1 %not155, label %if.then156, label %if.exit157
if.then156: ; preds = %noerr_block154
store i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), ptr %error_var104, align 8
br label %guard_block158
if.exit157: ; preds = %noerr_block154
%164 = load ptr, ptr %temp136, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %164, ptr align 8 %value105, i32 8, i1 false)
br label %noerr_block159
guard_block158: ; preds = %if.then156
%165 = load i64, ptr %error_var104, align 8
ret i64 %165
noerr_block159: ; preds = %if.exit157
%166 = load ptr, ptr %temp136, align 8
store ptr %166, ptr %118, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal103, i32 8, i1 false)
ret i64 0
}
; Function Attrs: nounwind
define { ptr, i8 } @test.buildSummary(ptr %0) #0 {
entry:
%doc = alloca %Doc, align 8
%literal = alloca %Summary, align 8
store ptr %0, ptr %doc, align 8
%1 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0
store ptr null, ptr %1, align 8
%2 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1
store i8 0, ptr %2, align 8
%3 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0
%4 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
%5 = load ptr, ptr %4, align 8
%ptrbool = icmp ne ptr %5, null
br i1 %ptrbool, label %cond.lhs, label %cond.rhs
cond.lhs: ; preds = %entry
%6 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
%7 = load ptr, ptr %6, align 8
%8 = getelementptr inbounds %Head, ptr %7, i32 0, i32 0
%9 = load ptr, ptr %8, align 8
br label %cond.phi
cond.rhs: ; preds = %entry
br label %cond.phi
cond.phi: ; preds = %cond.rhs, %cond.lhs
%val = phi ptr [ %9, %cond.lhs ], [ null, %cond.rhs ]
store ptr %val, ptr %3, align 8
%10 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1
store i8 1, ptr %10, align 8
%11 = load { ptr, i8 }, ptr %literal, align 8
ret { ptr, i8 } %11
}
; Function Attrs: nounwind
define { ptr, i8 } @test.readAndBuildSummary(ptr %0, i64 %1) #0 {
entry:
%url = alloca %"char[]", align 8
%retparam = alloca %Doc, align 8
%result = alloca %Summary, align 8
%literal = alloca %Summary, align 8
%taddr = alloca %Summary, align 8
store ptr %0, ptr %url, align 8
%ptroffset = getelementptr inbounds i64, ptr %url, i64 1
store i64 %1, ptr %ptroffset, align 8
%2 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo = load ptr, ptr %2, align 8
%3 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi = load i64, ptr %3, align 8
%4 = call i64 @test.readDoc(ptr %retparam, ptr %lo, i64 %hi)
%not_err = icmp eq i64 %4, 0
%5 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %5, label %after_check, label %else_block
after_check: ; preds = %entry
%6 = load ptr, ptr %retparam, align 8
%7 = call { ptr, i8 } @test.buildSummary(ptr %6)
store { ptr, i8 } %7, ptr %result, align 8
%8 = load %Summary, ptr %result, align 8
br label %phi_block
else_block: ; preds = %entry
%9 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0
store ptr null, ptr %9, align 8
%10 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1
store i8 0, ptr %10, align 8
%11 = load %Summary, ptr %literal, align 8
br label %phi_block
phi_block: ; preds = %else_block, %after_check
%val = phi %Summary [ %8, %after_check ], [ %11, %else_block ]
store %Summary %val, ptr %taddr, align 8
%12 = load { ptr, i8 }, ptr %taddr, align 8
ret { ptr, i8 } %12
}
; Function Attrs: nounwind
define i64 @test.isTitleNonEmpty(ptr %0, ptr %1) #0 {
entry:
%doc = alloca %Doc, align 8
%head = alloca ptr, align 8
%reterr = alloca i64, align 8
store ptr %1, ptr %doc, align 8
%2 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
%3 = load ptr, ptr %2, align 8
%not = icmp eq ptr %3, null
br i1 %not, label %if.then, label %if.exit
if.then: ; preds = %entry
ret i64 ptrtoint (ptr @"test.TitleResult$TITLE_MISSING" to i64)
if.exit: ; preds = %entry
%4 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0
%5 = load ptr, ptr %4, align 8
%6 = getelementptr inbounds %Head, ptr %5, i32 0, i32 0
%7 = load ptr, ptr %6, align 8
store ptr %7, ptr %head, align 8
%8 = load ptr, ptr %head, align 8
%not1 = icmp eq ptr %8, null
br i1 %not1, label %if.then2, label %if.exit3
if.then2: ; preds = %if.exit
ret i64 ptrtoint (ptr @"test.TitleResult$TITLE_MISSING" to i64)
if.exit3: ; preds = %if.exit
%9 = load ptr, ptr %head, align 8
%10 = getelementptr inbounds %"char[]", ptr %9, i32 0, i32 1
%11 = load i64, ptr %10, align 8
%lt = icmp ult i64 0, %11
%12 = zext i1 %lt to i8
store i8 %12, ptr %0, align 1
ret i64 0
}
; Function Attrs: nounwind
define i64 @test.readWhetherTitleNonEmpty(ptr %0, ptr %1, i64 %2) #0 {
entry:
%url = alloca %"char[]", align 8
%reterr = alloca i64, align 8
%retparam = alloca i8, align 1
%retparam1 = alloca %Doc, align 8
store ptr %1, ptr %url, align 8
%ptroffset = getelementptr inbounds i64, ptr %url, i64 1
store i64 %2, ptr %ptroffset, align 8
%3 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo = load ptr, ptr %3, align 8
%4 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi = load i64, ptr %4, align 8
%5 = call i64 @test.readDoc(ptr %retparam1, ptr %lo, i64 %hi)
%not_err = icmp eq i64 %5, 0
%6 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %6, label %after_check, label %assign_optional
assign_optional: ; preds = %entry
store i64 %5, ptr %reterr, align 8
br label %err_retblock
after_check: ; preds = %entry
%7 = load ptr, ptr %retparam1, align 8
%8 = call i64 @test.isTitleNonEmpty(ptr %retparam, ptr %7)
%not_err2 = icmp eq i64 %8, 0
%9 = call i1 @llvm.expect.i1(i1 %not_err2, i1 true)
br i1 %9, label %after_check4, label %assign_optional3
assign_optional3: ; preds = %after_check
store i64 %8, ptr %reterr, align 8
br label %err_retblock
after_check4: ; preds = %after_check
%10 = load i8, ptr %retparam, align 1
store i8 %10, ptr %0, align 1
ret i64 0
err_retblock: ; preds = %assign_optional3, %assign_optional
%11 = load i64, ptr %reterr, align 8
ret i64 %11
}
; Function Attrs: nounwind
define ptr @test.bool_to_string(i8 zeroext %0) #0 {
entry:
%1 = trunc i8 %0 to i1
%ternary = select i1 %1, %"char[]" { ptr @.str.8, i64 4 }, %"char[]" { ptr @.str.9, i64 5 }
%2 = extractvalue %"char[]" %ternary, 0
ret ptr %2
}
; Function Attrs: nounwind
define ptr @test.nameFromError(i64 %0) #0 {
entry:
%switch = alloca i64, align 8
store i64 %0, ptr %switch, align 8
br label %switch.entry
switch.entry: ; preds = %entry
%1 = load i64, ptr %switch, align 8
%eq = icmp eq i64 ptrtoint (ptr @"test.TitleResult$TITLE_MISSING" to i64), %1
br i1 %eq, label %switch.case, label %next_if
switch.case: ; preds = %switch.entry
ret ptr @.str.10
next_if: ; preds = %switch.entry
%eq1 = icmp eq i64 ptrtoint (ptr @"test.ReadError$BAD_READ" to i64), %1
br i1 %eq1, label %switch.case2, label %next_if3
switch.case2: ; preds = %next_if
ret ptr @.str.11
next_if3: ; preds = %next_if
%eq4 = icmp eq i64 ptrtoint (ptr @"test.ReadError$OUT_OF_MEMORY" to i64), %1
br i1 %eq4, label %switch.case5, label %next_if6
switch.case5: ; preds = %next_if3
ret ptr @.str.12
next_if6: ; preds = %next_if3
br label %switch.default
switch.default: ; preds = %next_if6
ret ptr @.str.13
}
; Function Attrs: nounwind
define void @test.main() #0 {
entry:
%URLS = alloca %"char[][]", align 8
%literal = alloca [5 x %"char[]"], align 16
%.anon = alloca i64, align 8
%.anon1 = alloca i64, align 8
%url = alloca %"char[]", align 8
%summary = alloca %Summary, align 8
%result = alloca %Summary, align 8
%title_sure = alloca %"char[]", align 8
%has_title = alloca i8, align 1
%has_title.f = alloca i64, align 8
%retparam = alloca i8, align 1
%blockret = alloca i64, align 8
%f = alloca i64, align 8
%0 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 0
store %"char[]" { ptr @.str.14, i64 4 }, ptr %0, align 8
%1 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 1
store %"char[]" { ptr @.str.15, i64 11 }, ptr %1, align 8
%2 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 2
store %"char[]" { ptr @.str.16, i64 13 }, ptr %2, align 8
%3 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 3
store %"char[]" { ptr @.str.17, i64 12 }, ptr %3, align 8
%4 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 4
store %"char[]" { ptr @.str.18, i64 4 }, ptr %4, align 8
%5 = insertvalue %"char[][]" undef, ptr %literal, 0
%6 = insertvalue %"char[][]" %5, i64 5, 1
store %"char[][]" %6, ptr %URLS, align 8
%7 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 1
%8 = load i64, ptr %7, align 8
store i64 %8, ptr %.anon, align 8
store i64 0, ptr %.anon1, align 8
br label %loop.cond
loop.cond: ; preds = %phi_block16, %entry
%9 = load i64, ptr %.anon1, align 8
%10 = load i64, ptr %.anon, align 8
%lt = icmp ult i64 %9, %10
br i1 %lt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%11 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 0
%12 = load ptr, ptr %11, align 8
%13 = load i64, ptr %.anon1, align 8
%ptroffset = getelementptr inbounds %"char[]", ptr %12, i64 %13
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %url, ptr align 8 %ptroffset, i32 16, i1 false)
%14 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%15 = load i64, ptr %14, align 8
%trunc = trunc i64 %15 to i32
%16 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%17 = load ptr, ptr %16, align 8
%18 = call i32 (ptr, ...) @printf(ptr @.str.19, i32 %trunc, ptr %17)
%19 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo = load ptr, ptr %19, align 8
%20 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi = load i64, ptr %20, align 8
%21 = call { ptr, i8 } @test.readAndBuildSummary(ptr %lo, i64 %hi)
store { ptr, i8 } %21, ptr %result, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %summary, ptr align 8 %result, i32 16, i1 false)
%22 = call i32 (ptr, ...) @printf(ptr @.str.20)
%23 = load ptr, ptr @__stdoutp, align 8
call void @test.Summary.print(ptr %summary, ptr %23)
%24 = call i32 (ptr, ...) @printf(ptr @.str.21)
%25 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0
%26 = load ptr, ptr %25, align 8
%ptrbool = icmp ne ptr %26, null
br i1 %ptrbool, label %cond.lhs, label %cond.rhs
cond.lhs: ; preds = %loop.body
%27 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0
%28 = load ptr, ptr %27, align 8
%29 = load %"char[]", ptr %28, align 8
br label %cond.phi
cond.rhs: ; preds = %loop.body
br label %cond.phi
cond.phi: ; preds = %cond.rhs, %cond.lhs
%val = phi %"char[]" [ %29, %cond.lhs ], [ zeroinitializer, %cond.rhs ]
store %"char[]" %val, ptr %title_sure, align 8
%30 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 1
%31 = load i64, ptr %30, align 8
%trunc2 = trunc i64 %31 to i32
%32 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 0
%33 = load ptr, ptr %32, align 8
%34 = call i32 (ptr, ...) @printf(ptr @.str.22, i32 %trunc2, ptr %33)
%35 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0
%lo3 = load ptr, ptr %35, align 8
%36 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1
%hi4 = load i64, ptr %36, align 8
%37 = call i64 @test.readWhetherTitleNonEmpty(ptr %retparam, ptr %lo3, i64 %hi4)
%not_err = icmp eq i64 %37, 0
%38 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %38, label %after_check, label %assign_optional
assign_optional: ; preds = %cond.phi
store i64 %37, ptr %has_title.f, align 8
br label %after_assign
after_check: ; preds = %cond.phi
%39 = load i8, ptr %retparam, align 1
store i8 %39, ptr %has_title, align 1
store i64 0, ptr %has_title.f, align 8
br label %after_assign
after_assign: ; preds = %after_check, %assign_optional
%optval = load i64, ptr %has_title.f, align 8
%not_err5 = icmp eq i64 %optval, 0
%40 = call i1 @llvm.expect.i1(i1 %not_err5, i1 true)
br i1 %40, label %after_check6, label %else_block
after_check6: ; preds = %after_assign
%41 = load i8, ptr %has_title, align 1
%42 = call ptr @test.bool_to_string(i8 zeroext %41)
br label %phi_block
else_block: ; preds = %after_assign
br label %testblock
testblock: ; preds = %else_block
%optval7 = load i64, ptr %has_title.f, align 8
%not_err8 = icmp eq i64 %optval7, 0
%43 = call i1 @llvm.expect.i1(i1 %not_err8, i1 true)
br i1 %43, label %after_check10, label %assign_optional9
assign_optional9: ; preds = %testblock
store i64 %optval7, ptr %f, align 8
br label %end_block
after_check10: ; preds = %testblock
store i64 0, ptr %f, align 8
br label %end_block
end_block: ; preds = %after_check10, %assign_optional9
%44 = load i64, ptr %f, align 8
%neq = icmp ne i64 %44, 0
br i1 %neq, label %if.then, label %if.exit
if.then: ; preds = %end_block
%45 = load i64, ptr %f, align 8
store i64 %45, ptr %blockret, align 8
br label %expr_block.exit
if.exit: ; preds = %end_block
store i64 0, ptr %blockret, align 8
br label %expr_block.exit
expr_block.exit: ; preds = %if.exit, %if.then
%46 = load i64, ptr %blockret, align 8
%47 = call ptr @test.nameFromError(i64 %46)
br label %phi_block
phi_block: ; preds = %expr_block.exit, %after_check6
%val11 = phi ptr [ %42, %after_check6 ], [ %47, %expr_block.exit ]
%optval12 = load i64, ptr %has_title.f, align 8
%not_err13 = icmp eq i64 %optval12, 0
%48 = call i1 @llvm.expect.i1(i1 %not_err13, i1 true)
br i1 %48, label %after_check14, label %else_block15
after_check14: ; preds = %phi_block
%49 = load i8, ptr %has_title, align 1
%50 = trunc i8 %49 to i1
br label %phi_block16
else_block15: ; preds = %phi_block
br label %phi_block16
phi_block16: ; preds = %else_block15, %after_check14
%val17 = phi i1 [ %50, %after_check14 ], [ false, %else_block15 ]
%ternary = select i1 %val17, ptr @.str.24, ptr @.str.25
%51 = call i32 (ptr, ...) @printf(ptr @.str.23, ptr %val11, ptr %ternary)
%52 = load i64, ptr %.anon1, align 8
%add = add i64 %52, 1
store i64 %add, ptr %.anon1, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond
ret void
}