Commits
Chris Lattner committed dc9e21ed89f
implement support for conditional destruction of tuple elements.
a testcase like this:
func test(cond : Bool) {
var x : (SomeClass, SomeClass)
if cond {
x.0 = getSomeClass()
} else {
x.1 = getSomeClass()
}
}
now ends up with an epilog to destroy "x" that looks like this:
%1 = builtin_function_ref "lshr_Int2" : $@thin @callee_owned (Builtin.Int2, Builtin.Int2) -> Builtin.Int2 // user: %37
%2 = builtin_function_ref "trunc_Int2_Int1" : $@thin @callee_owned (Builtin.Int2) -> Builtin.Int1 // users: %38, %31
...
%30 = load %4#1 : $*Builtin.Int2 // users: %37, %31
%31 = apply %2(%30) : $@thin @callee_owned (Builtin.Int2) -> Builtin.Int1 // user: %32
cond_br %31, bb4, bb5 // id: %32
bb4: // Preds: bb3
%33 = tuple_element_addr %7#1 : $*(SomeClass, SomeClass), 0 // user: %34
destroy_addr %33 : $*SomeClass // id: %34
br bb5 // id: %35
bb5: // Preds: bb3 bb4
%36 = integer_literal $Builtin.Int2, 1 // user: %37
%37 = apply %1(%30, %36) : $@thin @callee_owned (Builtin.Int2, Builtin.Int2) -> Builtin.Int2 // user: %38
%38 = apply %2(%37) : $@thin @callee_owned (Builtin.Int2) -> Builtin.Int1 // user: %39
cond_br %38, bb6, bb7 // id: %39
bb6: // Preds: bb5
%40 = tuple_element_addr %7#1 : $*(SomeClass, SomeClass), 1 // user: %41
destroy_addr %40 : $*SomeClass // id: %41
br bb7 // id: %42
bb7: // Preds: bb5 bb6
dealloc_stack %7#0 : $*@local_storage (SomeClass, SomeClass) // id: %43
Swift SVN r10701