Optimize temp variables in LLVM.

This commit is contained in:
Christoffer Lerno
2025-01-06 04:03:54 +01:00
committed by Christoffer Lerno
parent ea2dce0ab4
commit f801372074
25 changed files with 1504 additions and 1624 deletions

View File

@@ -683,7 +683,6 @@ switch.default: ; preds = %next_if6
define void @test.main() #0 {
entry:
%.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
@@ -694,110 +693,108 @@ entry:
%blockret = alloca i64, align 8
%f = alloca i64, align 8
%0 = load i64, ptr getelementptr inbounds (i8, ptr @main.URLS, i64 8), align 8
store i64 %0, ptr %.anon, align 8
store i64 0, ptr %.anon1, align 8
store i64 0, ptr %.anon, align 8
br label %loop.cond
loop.cond:
%1 = load i64, ptr %.anon1, align 8
%2 = load i64, ptr %.anon, align 8
%lt = icmp ult i64 %1, %2
loop.cond: ; preds = %phi_block19, %entry
%1 = load i64, ptr %.anon, align 8
%lt = icmp ult i64 %1, %0
br i1 %lt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%3 = load ptr, ptr @main.URLS, align 8
%4 = load i64, ptr %.anon1, align 8
%ptroffset = getelementptr inbounds [16 x i8], ptr %3, i64 %4
%2 = load ptr, ptr @main.URLS, align 8
%3 = load i64, ptr %.anon, align 8
%ptroffset = getelementptr inbounds [16 x i8], ptr %2, i64 %3
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %url, ptr align 8 %ptroffset, i32 16, i1 false)
%ptradd = getelementptr inbounds i8, ptr %url, i64 8
%5 = load i64, ptr %ptradd, align 8
%trunc = trunc i64 %5 to i32
%6 = load ptr, ptr %url, align 8
%7 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %trunc, ptr %6)
%4 = load i64, ptr %ptradd, align 8
%trunc = trunc i64 %4 to i32
%5 = load ptr, ptr %url, align 8
%6 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %trunc, ptr %5)
%lo = load ptr, ptr %url, align 8
%ptradd2 = getelementptr inbounds i8, ptr %url, i64 8
%hi = load i64, ptr %ptradd2, align 8
%8 = call { ptr, i8 } @test.readAndBuildSummary(ptr %lo, i64 %hi)
store { ptr, i8 } %8, ptr %result, align 8
%ptradd1 = getelementptr inbounds i8, ptr %url, i64 8
%hi = load i64, ptr %ptradd1, align 8
%7 = call { ptr, i8 } @test.readAndBuildSummary(ptr %lo, i64 %hi)
store { ptr, i8 } %7, ptr %result, align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %summary, ptr align 8 %result, i32 16, i1 false)
%9 = call i32 (ptr, ...) @printf(ptr @.str.22)
%10 = load ptr, ptr @__stdoutp, align 8
call void @test.Summary.print(ptr %summary, ptr %10)
%11 = call i32 (ptr, ...) @printf(ptr @.str.23)
%12 = load ptr, ptr %summary, align 8
%i2b = icmp ne ptr %12, null
%8 = call i32 (ptr, ...) @printf(ptr @.str.22)
%9 = load ptr, ptr @__stdoutp, align 8
call void @test.Summary.print(ptr %summary, ptr %9)
%10 = call i32 (ptr, ...) @printf(ptr @.str.23)
%11 = load ptr, ptr %summary, align 8
%i2b = icmp ne ptr %11, null
br i1 %i2b, label %cond.lhs, label %cond.rhs
cond.lhs: ; preds = %loop.body
%13 = load ptr, ptr %summary, align 8
%14 = load %"char[]", ptr %13, align 8
%12 = load ptr, ptr %summary, align 8
%13 = load %"char[]", ptr %12, 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[]" [ %14, %cond.lhs ], [ zeroinitializer, %cond.rhs ]
%val = phi %"char[]" [ %13, %cond.lhs ], [ zeroinitializer, %cond.rhs ]
store %"char[]" %val, ptr %title_sure, align 8
%ptradd3 = getelementptr inbounds i8, ptr %title_sure, i64 8
%15 = load i64, ptr %ptradd3, align 8
%trunc4 = trunc i64 %15 to i32
%16 = load ptr, ptr %title_sure, align 8
%17 = call i32 (ptr, ...) @printf(ptr @.str.24, i32 %trunc4, ptr %16)
%lo5 = load ptr, ptr %url, align 8
%ptradd6 = getelementptr inbounds i8, ptr %url, i64 8
%hi7 = load i64, ptr %ptradd6, align 8
%18 = call i64 @test.readWhetherTitleNonEmpty(ptr %retparam, ptr %lo5, i64 %hi7)
%not_err = icmp eq i64 %18, 0
%19 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %19, label %after_check, label %assign_optional
%ptradd2 = getelementptr inbounds i8, ptr %title_sure, i64 8
%14 = load i64, ptr %ptradd2, align 8
%trunc3 = trunc i64 %14 to i32
%15 = load ptr, ptr %title_sure, align 8
%16 = call i32 (ptr, ...) @printf(ptr @.str.24, i32 %trunc3, ptr %15)
%lo4 = load ptr, ptr %url, align 8
%ptradd5 = getelementptr inbounds i8, ptr %url, i64 8
%hi6 = load i64, ptr %ptradd5, align 8
%17 = call i64 @test.readWhetherTitleNonEmpty(ptr %retparam, ptr %lo4, i64 %hi6)
%not_err = icmp eq i64 %17, 0
%18 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %18, label %after_check, label %assign_optional
assign_optional: ; preds = %cond.phi
store i64 %18, ptr %has_title.f, align 8
store i64 %17, ptr %has_title.f, align 8
br label %after_assign
after_check: ; preds = %cond.phi
%20 = load i8, ptr %retparam, align 1
store i8 %20, ptr %has_title, align 1
%19 = load i8, ptr %retparam, align 1
store i8 %19, 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_err8 = icmp eq i64 %optval, 0
%21 = call i1 @llvm.expect.i1(i1 %not_err8, i1 true)
br i1 %21, label %after_check9, label %else_block
%not_err7 = icmp eq i64 %optval, 0
%20 = call i1 @llvm.expect.i1(i1 %not_err7, i1 true)
br i1 %20, label %after_check8, label %else_block
after_check9: ; preds = %after_assign
%22 = load i8, ptr %has_title, align 1
%23 = call ptr @test.bool_to_string(i8 zeroext %22)
after_check8: ; preds = %after_assign
%21 = load i8, ptr %has_title, align 1
%22 = call ptr @test.bool_to_string(i8 zeroext %21)
br label %phi_block
else_block: ; preds = %after_assign
br label %testblock
testblock: ; preds = %else_block
%optval10 = load i64, ptr %has_title.f, align 8
%not_err11 = icmp eq i64 %optval10, 0
%24 = call i1 @llvm.expect.i1(i1 %not_err11, i1 true)
br i1 %24, label %after_check13, label %assign_optional12
%optval9 = load i64, ptr %has_title.f, align 8
%not_err10 = icmp eq i64 %optval9, 0
%23 = call i1 @llvm.expect.i1(i1 %not_err10, i1 true)
br i1 %23, label %after_check12, label %assign_optional11
assign_optional12: ; preds = %testblock
store i64 %optval10, ptr %f, align 8
assign_optional11: ; preds = %testblock
store i64 %optval9, ptr %f, align 8
br label %end_block
after_check13: ; preds = %testblock
after_check12: ; preds = %testblock
store i64 0, ptr %f, align 8
br label %end_block
end_block: ; preds = %after_check13, %assign_optional12
%25 = load i64, ptr %f, align 8
%i2b14 = icmp ne i64 %25, 0
br i1 %i2b14, label %if.then, label %if.exit
end_block: ; preds = %after_check12, %assign_optional11
%24 = load i64, ptr %f, align 8
%i2b13 = icmp ne i64 %24, 0
br i1 %i2b13, label %if.then, label %if.exit
if.then: ; preds = %end_block
%26 = load i64, ptr %f, align 8
store i64 %26, ptr %blockret, align 8
%25 = load i64, ptr %f, align 8
store i64 %25, ptr %blockret, align 8
br label %expr_block.exit
if.exit: ; preds = %end_block
@@ -805,32 +802,32 @@ if.exit: ; preds = %end_block
br label %expr_block.exit
expr_block.exit: ; preds = %if.exit, %if.then
%27 = load i64, ptr %blockret, align 8
%28 = call ptr @test.nameFromError(i64 %27)
%26 = load i64, ptr %blockret, align 8
%27 = call ptr @test.nameFromError(i64 %26)
br label %phi_block
phi_block: ; preds = %expr_block.exit, %after_check9
%val15 = phi ptr [ %23, %after_check9 ], [ %28, %expr_block.exit ]
%optval16 = load i64, ptr %has_title.f, align 8
%not_err17 = icmp eq i64 %optval16, 0
%29 = call i1 @llvm.expect.i1(i1 %not_err17, i1 true)
br i1 %29, label %after_check18, label %else_block19
phi_block: ; preds = %expr_block.exit, %after_check8
%val14 = phi ptr [ %22, %after_check8 ], [ %27, %expr_block.exit ]
%optval15 = load i64, ptr %has_title.f, align 8
%not_err16 = icmp eq i64 %optval15, 0
%28 = call i1 @llvm.expect.i1(i1 %not_err16, i1 true)
br i1 %28, label %after_check17, label %else_block18
after_check18: ; preds = %phi_block
%30 = load i8, ptr %has_title, align 1
%31 = trunc i8 %30 to i1
br label %phi_block20
after_check17: ; preds = %phi_block
%29 = load i8, ptr %has_title, align 1
%30 = trunc i8 %29 to i1
br label %phi_block19
else_block19: ; preds = %phi_block
br label %phi_block20
else_block18: ; preds = %phi_block
br label %phi_block19
phi_block20: ; preds = %else_block19, %after_check18
%val21 = phi i1 [ %31, %after_check18 ], [ false, %else_block19 ]
%ternary = select i1 %val21, ptr @.str.26, ptr @.str.27
%32 = call i32 (ptr, ...) @printf(ptr @.str.25, ptr %val15, ptr %ternary)
%33 = load i64, ptr %.anon1, align 8
%addnuw = add nuw i64 %33, 1
store i64 %addnuw, ptr %.anon1, align 8
phi_block19: ; preds = %else_block18, %after_check17
%val20 = phi i1 [ %30, %after_check17 ], [ false, %else_block18 ]
%ternary = select i1 %val20, ptr @.str.26, ptr @.str.27
%31 = call i32 (ptr, ...) @printf(ptr @.str.25, ptr %val14, ptr %ternary)
%32 = load i64, ptr %.anon, align 8
%addnuw = add nuw i64 %32, 1
store i64 %addnuw, ptr %.anon, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond