forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtuples.swift
101 lines (89 loc) · 4.19 KB
/
tuples.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// RUN: %target-swift-frontend -emit-silgen %s | %FileCheck %s
class C {}
enum Foo {
case X(C, Int)
}
// <rdar://problem/16020428>
// CHECK-LABEL: sil hidden @_TF6tuples8matchFooFT1xOS_3Foo_T_
func matchFoo(x x: Foo) {
switch x {
case .X(let x):
()
}
}
protocol P { func foo() }
struct A : P { func foo() {} }
func make_int() -> Int { return 0 }
func make_p() -> P { return A() }
func make_xy() -> (x: Int, y: P) { return (make_int(), make_p()) }
// CHECK-LABEL: sil hidden @_TF6tuples17testShuffleOpaqueFT_T_
func testShuffleOpaque() {
// CHECK: [[X:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <P>
// CHECK-NEXT: [[PBX:%.*]] = project_box [[X]]
// CHECK: [[Y:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <Int>
// CHECK-NEXT: [[PBY:%.*]] = project_box [[Y]]
// CHECK: [[T0:%.*]] = function_ref @_TF6tuples7make_xyFT_T1xSi1yPS_1P__
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[PBX]])
// CHECK-NEXT: store [[T1]] to [trivial] [[PBY]]
var (x,y) : (y:P, x:Int) = make_xy()
// CHECK-NEXT: [[PAIR:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <(y: P, x: Int)>
// CHECK-NEXT: [[PBPAIR:%.*]] = project_box [[PAIR]]
// CHECK-NEXT: [[PAIR_0:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 0
// CHECK-NEXT: [[PAIR_1:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 1
// CHECK-NEXT: // function_ref
// CHECK-NEXT: [[T0:%.*]] = function_ref @_TF6tuples7make_xyFT_T1xSi1yPS_1P__
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[PAIR_0]])
// CHECK-NEXT: store [[T1]] to [trivial] [[PAIR_1]]
var pair : (y:P, x:Int) = make_xy()
// CHECK-NEXT: // function_ref
// CHECK-NEXT: [[T0:%.*]] = function_ref @_TF6tuples7make_xyFT_T1xSi1yPS_1P__
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $P
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[TEMP]])
// CHECK-NEXT: [[PAIR_0:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 0
// CHECK-NEXT: copy_addr [take] [[TEMP]] to [[PAIR_0]]
// CHECK-NEXT: [[PAIR_1:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 1
// CHECK-NEXT: assign [[T1]] to [[PAIR_1]]
// CHECK-NEXT: dealloc_stack [[TEMP]]
pair = make_xy()
}
// CHECK-LABEL: testShuffleTuple
func testShuffleTuple() {
// CHECK: [[X:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <P>
// CHECK-NEXT: [[PBX:%.*]] = project_box [[X]]
// CHECK: [[Y:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <Int>
// CHECK-NEXT: [[PBY:%.*]] = project_box [[Y]]
// CHECK: [[T0:%.*]] = function_ref @_TF6tuples8make_intFT_Si
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]()
// CHECK-NEXT: store [[T1]] to [trivial] [[PBY]]
// CHECK-NEXT: // function_ref
// CHECK-NEXT: [[T0:%.*]] = function_ref @_TF6tuples6make_pFT_PS_1P_
// CHECK-NEXT: apply [[T0]]([[PBX]])
var (x,y) : (y:P, x:Int) = (x: make_int(), y: make_p())
// CHECK-NEXT: [[PAIR:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <(y: P, x: Int)>
// CHECK-NEXT: [[PBPAIR:%.*]] = project_box [[PAIR]]
// CHECK-NEXT: [[PAIR_0:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 0
// CHECK-NEXT: [[PAIR_1:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 1
// CHECK-NEXT: // function_ref
// CHECK: [[T0:%.*]] = function_ref @_TF6tuples8make_intFT_Si
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]()
// CHECK-NEXT: store [[T1]] to [trivial] [[PAIR_1]]
// CHECK-NEXT: // function_ref
// CHECK-NEXT: [[T0:%.*]] = function_ref @_TF6tuples6make_pFT_PS_1P_
// CHECK-NEXT: apply [[T0]]([[PAIR_0]])
var pair : (y:P, x:Int) = (x: make_int(), y: make_p())
// This isn't really optimal; we should be evaluating make_p directly
// into the temporary.
// CHECK-NEXT: // function_ref
// CHECK: [[T0:%.*]] = function_ref @_TF6tuples8make_intFT_Si
// CHECK-NEXT: [[INT:%.*]] = apply [[T0]]()
// CHECK-NEXT: // function_ref
// CHECK-NEXT: [[T0:%.*]] = function_ref @_TF6tuples6make_pFT_PS_1P_
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $P
// CHECK-NEXT: apply [[T0]]([[TEMP]])
// CHECK-NEXT: [[PAIR_0:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 0
// CHECK-NEXT: copy_addr [take] [[TEMP]] to [[PAIR_0]]
// CHECK-NEXT: [[PAIR_1:%.*]] = tuple_element_addr [[PBPAIR]] : $*(y: P, x: Int), 1
// CHECK-NEXT: assign [[INT]] to [[PAIR_1]]
// CHECK-NEXT: dealloc_stack [[TEMP]]
pair = (x: make_int(), y: make_p())
}