extern func char*! readLine(); extern func int! atoi(char*); extern func int printf(char* fmt, ...); func void main() { char*! line = readLine(); if (try line) { int! val = atoi(line); if (try val) { printf("You typed the number %d\n", val); return; } } printf("You didn't type an integer :(\n"); } // #expect: try_with_unwrap.ll define void @main() #0 { entry: %line = alloca i8*, align 8 %line.f = alloca %error_union, align 8 %retparam = alloca i8*, align 8 %result = alloca %error_union, align 8 %val4 = alloca i32, align 4 %val.f = alloca %error_union, align 8 %retparam5 = alloca i32, align 4 %result6 = alloca %error_union, align 8 %0 = call { i64, i64 } @readLine(i8** %retparam) %1 = bitcast %error_union* %result to { i64, i64 }* store { i64, i64 } %0, { i64, i64 }* %1, align 8 %err_domain = getelementptr inbounds %error_union, %error_union* %result, i32 0, i32 0 %2 = load i64, i64* %err_domain, align 8 %not_err = icmp eq i64 %2, 0 br i1 %not_err, label %after_check, label %error error: ; preds = %entry %3 = bitcast %error_union* %line.f to i8* %4 = bitcast %error_union* %result to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 16, i1 false) br label %after_assign after_check: ; preds = %entry %5 = load i8*, i8** %retparam, align 8 store i8* %5, i8** %line, align 8 store %error_union zeroinitializer, %error_union* %line.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %error %err_domain1 = getelementptr inbounds %error_union, %error_union* %line.f, i32 0, i32 0 %6 = load i64, i64* %err_domain1, align 8 %not_err2 = icmp eq i64 %6, 0 br i1 %not_err2, label %after_check3, label %error_block after_check3: ; preds = %after_assign br label %noerr_block noerr_block: ; preds = %after_check3 br label %phi_trycatch_block error_block: ; preds = %after_assign br label %phi_trycatch_block phi_trycatch_block: ; preds = %error_block, %noerr_block %val = phi i8 [ 1, %noerr_block ], [ 0, %error_block ] %7 = trunc i8 %val to i1 br i1 %7, label %if.then, label %if.exit20 if.then: ; preds = %phi_trycatch_block %8 = load i8*, i8** %line, align 8 %9 = call { i64, i64 } @atoi(i32* %retparam5, i8* %8) %10 = bitcast %error_union* %result6 to { i64, i64 }* store { i64, i64 } %9, { i64, i64 }* %10, align 8 %err_domain7 = getelementptr inbounds %error_union, %error_union* %result6, i32 0, i32 0 %11 = load i64, i64* %err_domain7, align 8 %not_err8 = icmp eq i64 %11, 0 br i1 %not_err8, label %after_check10, label %error9 error9: ; preds = %if.then %12 = bitcast %error_union* %val.f to i8* %13 = bitcast %error_union* %result6 to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %12, i8* align 8 %13, i32 16, i1 false) br label %after_assign11 after_check10: ; preds = %if.then %14 = load i32, i32* %retparam5, align 4 store i32 %14, i32* %val4, align 4 store %error_union zeroinitializer, %error_union* %val.f, align 8 br label %after_assign11 after_assign11: ; preds = %after_check10, %error9 %err_domain12 = getelementptr inbounds %error_union, %error_union* %val.f, i32 0, i32 0 %15 = load i64, i64* %err_domain12, align 8 %not_err13 = icmp eq i64 %15, 0 br i1 %not_err13, label %after_check14, label %error_block16 after_check14: ; preds = %after_assign11 br label %noerr_block15 noerr_block15: ; preds = %after_check14 br label %phi_trycatch_block17 error_block16: ; preds = %after_assign11 br label %phi_trycatch_block17 phi_trycatch_block17: ; preds = %error_block16, %noerr_block15 %val18 = phi i8 [ 1, %noerr_block15 ], [ 0, %error_block16 ] %16 = trunc i8 %val18 to i1 br i1 %16, label %if.then19, label %if.exit if.then19: ; preds = %phi_trycatch_block17 %17 = load i32, i32* %val4, align 4 %18 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i32 0, i32 0), i32 %17) ret void if.exit: ; preds = %phi_trycatch_block17 br label %if.exit20 if.exit20: ; preds = %if.exit, %phi_trycatch_block %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.1, i32 0, i32 0)) ret void }