@@ -6,15 +6,11 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
6
6
; Tests to make sure no loads are introduced after a lifetime.end by multiply
7
7
; fusion.
8
8
9
- ; FIXME: Currently the tests are mis-compiled, with loads being introduced after
10
- ; llvm.lifetime.end calls.
11
-
12
9
define void @lifetime_for_first_arg_before_multiply (ptr noalias %B , ptr noalias %C ) {
13
10
; CHECK-LABEL: @lifetime_for_first_arg_before_multiply(
14
11
; CHECK-NEXT: entry:
15
12
; CHECK-NEXT: [[A:%.*]] = alloca <4 x double>, align 32
16
13
; CHECK-NEXT: call void @init(ptr [[A]])
17
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A]])
18
14
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A]], i64 0
19
15
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8
20
16
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr double, ptr [[TMP0]], i64 2
@@ -77,6 +73,7 @@ define void @lifetime_for_first_arg_before_multiply(ptr noalias %B, ptr noalias
77
73
; CHECK-NEXT: store <2 x double> [[TMP13]], ptr [[TMP26]], align 8
78
74
; CHECK-NEXT: [[VEC_GEP28:%.*]] = getelementptr double, ptr [[TMP26]], i64 2
79
75
; CHECK-NEXT: store <2 x double> [[TMP25]], ptr [[VEC_GEP28]], align 8
76
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A]])
80
77
; CHECK-NEXT: ret void
81
78
;
82
79
entry:
@@ -95,7 +92,6 @@ define void @lifetime_for_second_arg_before_multiply(ptr noalias %A, ptr noalias
95
92
; CHECK-NEXT: entry:
96
93
; CHECK-NEXT: [[B:%.*]] = alloca <4 x double>, align 32
97
94
; CHECK-NEXT: call void @init(ptr [[B]])
98
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B]])
99
95
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A:%.*]], i64 0
100
96
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8
101
97
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr double, ptr [[TMP0]], i64 2
@@ -158,6 +154,7 @@ define void @lifetime_for_second_arg_before_multiply(ptr noalias %A, ptr noalias
158
154
; CHECK-NEXT: store <2 x double> [[TMP13]], ptr [[TMP26]], align 8
159
155
; CHECK-NEXT: [[VEC_GEP28:%.*]] = getelementptr double, ptr [[TMP26]], i64 2
160
156
; CHECK-NEXT: store <2 x double> [[TMP25]], ptr [[VEC_GEP28]], align 8
157
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B]])
161
158
; CHECK-NEXT: ret void
162
159
;
163
160
entry:
@@ -177,7 +174,6 @@ define void @lifetime_for_first_arg_before_multiply_load_from_offset(ptr noalias
177
174
; CHECK-NEXT: [[A:%.*]] = alloca <8 x double>, align 64
178
175
; CHECK-NEXT: call void @init(ptr [[A]])
179
176
; CHECK-NEXT: [[GEP_8:%.*]] = getelementptr i8, ptr [[A]], i64 8
180
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A]])
181
177
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[GEP_8]], i64 0
182
178
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8
183
179
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr double, ptr [[TMP0]], i64 2
@@ -240,6 +236,7 @@ define void @lifetime_for_first_arg_before_multiply_load_from_offset(ptr noalias
240
236
; CHECK-NEXT: store <2 x double> [[TMP13]], ptr [[TMP26]], align 8
241
237
; CHECK-NEXT: [[VEC_GEP28:%.*]] = getelementptr double, ptr [[TMP26]], i64 2
242
238
; CHECK-NEXT: store <2 x double> [[TMP25]], ptr [[VEC_GEP28]], align 8
239
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A]])
243
240
; CHECK-NEXT: ret void
244
241
;
245
242
entry:
@@ -261,7 +258,6 @@ define void @lifetime_for_first_arg_before_multiply_lifetime_does_not_dominate(p
261
258
; CHECK-NEXT: call void @init(ptr [[A]])
262
259
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
263
260
; CHECK: then:
264
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A]])
265
261
; CHECK-NEXT: br label [[EXIT]]
266
262
; CHECK: exit:
267
263
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A]], i64 0
@@ -352,7 +348,6 @@ define void @lifetime_for_second_arg_before_multiply_lifetime_does_not_dominate(
352
348
; CHECK-NEXT: call void @init(ptr [[B]])
353
349
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
354
350
; CHECK: then:
355
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B]])
356
351
; CHECK-NEXT: br label [[EXIT]]
357
352
; CHECK: exit:
358
353
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A:%.*]], i64 0
@@ -441,10 +436,9 @@ define void @lifetime_for_ptr_first_arg_before_multiply(ptr noalias %A, ptr noal
441
436
; CHECK-NEXT: entry:
442
437
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
443
438
; CHECK: then:
444
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A:%.*]])
445
439
; CHECK-NEXT: br label [[EXIT]]
446
440
; CHECK: exit:
447
- ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A]], i64 0
441
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A:%.* ]], i64 0
448
442
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8
449
443
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr double, ptr [[TMP0]], i64 2
450
444
; CHECK-NEXT: [[COL_LOAD1:%.*]] = load <2 x double>, ptr [[VEC_GEP]], align 8
@@ -528,15 +522,13 @@ define void @lifetime_for_both_ptr_args_before_multiply(ptr noalias %A, ptr noal
528
522
; CHECK-NEXT: entry:
529
523
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
530
524
; CHECK: then:
531
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B:%.*]])
532
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A:%.*]])
533
525
; CHECK-NEXT: br label [[EXIT]]
534
526
; CHECK: exit:
535
- ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A]], i64 0
527
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[A:%.* ]], i64 0
536
528
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8
537
529
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr double, ptr [[TMP0]], i64 2
538
530
; CHECK-NEXT: [[COL_LOAD1:%.*]] = load <2 x double>, ptr [[VEC_GEP]], align 8
539
- ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr double, ptr [[B]], i64 0
531
+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr double, ptr [[B:%.* ]], i64 0
540
532
; CHECK-NEXT: [[COL_LOAD2:%.*]] = load <2 x double>, ptr [[TMP1]], align 8
541
533
; CHECK-NEXT: [[VEC_GEP3:%.*]] = getelementptr double, ptr [[TMP1]], i64 2
542
534
; CHECK-NEXT: [[COL_LOAD4:%.*]] = load <2 x double>, ptr [[VEC_GEP3]], align 8
@@ -618,7 +610,6 @@ define void @lifetime_for_ptr_select_before_multiply(ptr noalias %A, ptr noalias
618
610
; CHECK-NEXT: [[P:%.*]] = select i1 [[C_0:%.*]], ptr [[A:%.*]], ptr [[B:%.*]]
619
611
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
620
612
; CHECK: then:
621
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[P]])
622
613
; CHECK-NEXT: br label [[EXIT]]
623
614
; CHECK: exit:
624
615
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr double, ptr [[P]], i64 0
0 commit comments