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