@@ -37,110 +37,4 @@ define void @test2(ptr %P) {
37
37
ret void
38
38
}
39
39
40
- ; lifetime.end only marks the first two bytes of %A as dead. Make sure
41
- ; `store i8 20, ptr %A.2 is not removed.
42
- define void @test3_lifetime_end_partial () {
43
- ; CHECK-LABEL: @test3_lifetime_end_partial(
44
- ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
45
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 2, ptr [[A]])
46
- ; CHECK-NEXT: [[A_1:%.*]] = getelementptr i8, ptr [[A]], i64 1
47
- ; CHECK-NEXT: [[A_2:%.*]] = getelementptr i8, ptr [[A]], i64 2
48
- ; CHECK-NEXT: store i8 20, ptr [[A_2]], align 1
49
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 2, ptr [[A]])
50
- ; CHECK-NEXT: call void @use(ptr [[A_1]])
51
- ; CHECK-NEXT: ret void
52
- ;
53
- %A = alloca i32
54
-
55
- call void @llvm.lifetime.start.p0 (i64 2 , ptr %A )
56
- %A.1 = getelementptr i8 , ptr %A , i64 1
57
- %A.2 = getelementptr i8 , ptr %A , i64 2
58
-
59
- store i8 0 , ptr %A
60
- store i8 10 , ptr %A.1
61
- store i8 20 , ptr %A.2
62
-
63
- call void @llvm.lifetime.end.p0 (i64 2 , ptr %A )
64
- call void @use (ptr %A.1 )
65
- ret void
66
- }
67
-
68
- ; lifetime.end only marks the first two bytes of %A as dead. Make sure
69
- ; `store i8 20, ptr %A.2 is not removed.
70
- define void @test4_lifetime_end_partial_loop () {
71
- ; CHECK-LABEL: @test4_lifetime_end_partial_loop(
72
- ; CHECK-NEXT: entry:
73
- ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
74
- ; CHECK-NEXT: br label [[LOOP:%.*]]
75
- ; CHECK: loop:
76
- ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
77
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 2, ptr [[A]])
78
- ; CHECK-NEXT: [[A_1:%.*]] = getelementptr i8, ptr [[A]], i64 1
79
- ; CHECK-NEXT: [[A_2:%.*]] = getelementptr i8, ptr [[A]], i64 2
80
- ; CHECK-NEXT: call void @use(ptr [[A_1]])
81
- ; CHECK-NEXT: store i8 20, ptr [[A_2]], align 1
82
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 2, ptr [[A]])
83
- ; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 10
84
- ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i8 [[IV_NEXT]], 10
85
- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[LOOP]]
86
- ; CHECK: exit:
87
- ; CHECK-NEXT: ret void
88
- ;
89
- entry:
90
- %A = alloca i32
91
-
92
- br label %loop
93
-
94
- loop:
95
- %iv = phi i8 [ 0 , %entry ], [ %iv.next , %loop ]
96
- call void @llvm.lifetime.start.p0 (i64 2 , ptr %A )
97
- %A.1 = getelementptr i8 , ptr %A , i64 1
98
- %A.2 = getelementptr i8 , ptr %A , i64 2
99
-
100
- call void @use (ptr %A.1 )
101
-
102
- store i8 20 , ptr %A.2
103
- store i8 10 , ptr %A.1
104
- store i8 0 , ptr %A
105
- call void @llvm.lifetime.end.p0 (i64 2 , ptr %A )
106
-
107
- %iv.next = add i8 %iv , 10
108
- %exitcond = icmp eq i8 %iv.next , 10
109
- br i1 %exitcond , label %exit , label %loop
110
-
111
- exit:
112
- ret void
113
- }
114
-
115
- ; lifetime.end only marks the first two bytes of %A as dead. Make sure
116
- ; `store i8 20, ptr %A.2 is not removed.
117
- define void @test5_lifetime_end_partial () {
118
- ; CHECK-LABEL: @test5_lifetime_end_partial(
119
- ; CHECK-NEXT: [[A:%.*]] = alloca [4 x i8], align 1
120
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 2, ptr [[A]])
121
- ; CHECK-NEXT: [[A_1:%.*]] = getelementptr i8, ptr [[A]], i64 1
122
- ; CHECK-NEXT: [[A_2:%.*]] = getelementptr i8, ptr [[A]], i64 2
123
- ; CHECK-NEXT: store i8 20, ptr [[A_2]], align 1
124
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 2, ptr [[A]])
125
- ; CHECK-NEXT: call void @use(ptr [[A_1]])
126
- ; CHECK-NEXT: ret void
127
- ;
128
-
129
- %A = alloca [4 x i8 ]
130
- call void @llvm.lifetime.start.p0 (i64 2 , ptr %A )
131
- %A.1 = getelementptr i8 , ptr %A , i64 1
132
- %A.2 = getelementptr i8 , ptr %A , i64 2
133
-
134
- store i8 0 , ptr %A
135
- store i8 10 , ptr %A.1
136
- store i8 20 , ptr %A.2
137
-
138
- call void @llvm.lifetime.end.p0 (i64 2 , ptr %A )
139
-
140
- call void @use (ptr %A.1 )
141
- store i8 30 , ptr %A.1
142
- store i8 40 , ptr %A.2
143
- ret void
144
- }
145
-
146
40
declare void @use (ptr ) readonly
0 commit comments