// #target: x64-darwin module defer1; import std::io; func void test(int x) { defer io::println(); defer io::print("A"); if (x == 1) return; { defer io::print("B"); if (x == 0) return; } io::print("!"); } func void main() { test(1); // Prints "A" test(0); // Prints "BA" test(10); // Prints "B!A" } // #expect: defer1.ll define void @defer1.test(i32 %0) #0 { entry: %x = alloca i32, align 4 store i32 %0, i32* %x, align 4 %1 = load i32, i32* %x, align 4 %eq = icmp eq i32 %1, 1 br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry %2 = call i32 @"std::io.print"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) br label %exit exit: ; preds = %if.then %3 = call i32 @"std::io.println"(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.1, i32 0, i32 0)) #1 br label %exit1 exit1: ; preds = %exit ret void if.exit: ; preds = %entry %4 = load i32, i32* %x, align 4 %eq2 = icmp eq i32 %4, 0 br i1 %eq2, label %if.then3, label %if.exit7 if.then3: ; preds = %if.exit %5 = call i32 @"std::io.print"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i32 0, i32 0)) br label %exit4 exit4: ; preds = %if.then3 %6 = call i32 @"std::io.print"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0)) br label %exit5 exit5: ; preds = %exit4 %7 = call i32 @"std::io.println"(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.4, i32 0, i32 0)) #1 br label %exit6 exit6: ; preds = %exit5 ret void if.exit7: ; preds = %if.exit %8 = call i32 @"std::io.print"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) br label %exit8 exit8: ; preds = %if.exit7 %9 = call i32 @"std::io.print"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) %10 = call i32 @"std::io.print"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i32 0, i32 0)) br label %exit9 exit9: ; preds = %exit8 %11 = call i32 @"std::io.println"(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.8, i32 0, i32 0)) #1 br label %exit10 exit10: ; preds = %exit9 ret void } ; Function Attrs: nounwind define void @main() #0 { entry: call void @defer1.test(i32 1) call void @defer1.test(i32 0) call void @defer1.test(i32 10) ret void }