blob: 860fe2d983cdf1ea29feb7ef0ad264fafc87c616 [file] [log] [blame]
Sanjay Patelb653de12014-09-10 17:58:16 +00001; RUN: opt -S -loop-vectorize -force-vector-width=2 -force-vector-interleave=1 < %s | FileCheck %s
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +00002
3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4
5; Make sure we can vectorize loops which contain lifetime markers.
6
Matt Arsenaulte64c7c72013-10-02 20:29:00 +00007; CHECK-LABEL: @test(
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +00008; CHECK: call void @llvm.lifetime.end
9; CHECK: store <2 x i32>
10; CHECK: call void @llvm.lifetime.start
11
12define void @test(i32 *%d) {
13entry:
14 %arr = alloca [1024 x i32], align 16
15 %0 = bitcast [1024 x i32]* %arr to i8*
Matt Arsenaultf10061e2017-04-10 20:18:21 +000016 call void @llvm.lifetime.start.p0i8(i64 4096, i8* %0) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000017 br label %for.body
18
19for.body:
20 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
Matt Arsenaultf10061e2017-04-10 20:18:21 +000021 call void @llvm.lifetime.end.p0i8(i64 4096, i8* %0) #1
David Blaikie79e6c742015-02-27 19:29:02 +000022 %arrayidx = getelementptr inbounds i32, i32* %d, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000023 %1 = load i32, i32* %arrayidx, align 8
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000024 store i32 100, i32* %arrayidx, align 8
Matt Arsenaultf10061e2017-04-10 20:18:21 +000025 call void @llvm.lifetime.start.p0i8(i64 4096, i8* %0) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000026 %indvars.iv.next = add i64 %indvars.iv, 1
27 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
28 %exitcond = icmp ne i32 %lftr.wideiv, 128
29 br i1 %exitcond, label %for.body, label %for.end
30
31for.end:
Matt Arsenaultf10061e2017-04-10 20:18:21 +000032 call void @llvm.lifetime.end.p0i8(i64 4096, i8* %0) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000033 ret void
34}
35
Matt Arsenaulte64c7c72013-10-02 20:29:00 +000036; CHECK-LABEL: @testbitcast(
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000037; CHECK: call void @llvm.lifetime.end
38; CHECK: store <2 x i32>
39; CHECK: call void @llvm.lifetime.start
40
41define void @testbitcast(i32 *%d) {
42entry:
43 %arr = alloca [1024 x i32], align 16
44 %0 = bitcast [1024 x i32]* %arr to i8*
Matt Arsenaultf10061e2017-04-10 20:18:21 +000045 call void @llvm.lifetime.start.p0i8(i64 4096, i8* %0) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000046 br label %for.body
47
48for.body:
49 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
50 %1 = bitcast [1024 x i32]* %arr to i8*
Matt Arsenaultf10061e2017-04-10 20:18:21 +000051 call void @llvm.lifetime.end.p0i8(i64 4096, i8* %1) #1
David Blaikie79e6c742015-02-27 19:29:02 +000052 %arrayidx = getelementptr inbounds i32, i32* %d, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000053 %2 = load i32, i32* %arrayidx, align 8
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000054 store i32 100, i32* %arrayidx, align 8
Matt Arsenaultf10061e2017-04-10 20:18:21 +000055 call void @llvm.lifetime.start.p0i8(i64 4096, i8* %1) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000056 %indvars.iv.next = add i64 %indvars.iv, 1
57 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
58 %exitcond = icmp ne i32 %lftr.wideiv, 128
59 br i1 %exitcond, label %for.body, label %for.end
60
61for.end:
Matt Arsenaultf10061e2017-04-10 20:18:21 +000062 call void @llvm.lifetime.end.p0i8(i64 4096, i8* %0) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000063 ret void
64}
65
Matt Arsenaulte64c7c72013-10-02 20:29:00 +000066; CHECK-LABEL: @testloopvariant(
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000067; CHECK: call void @llvm.lifetime.end
68; CHECK: store <2 x i32>
69; CHECK: call void @llvm.lifetime.start
70
71define void @testloopvariant(i32 *%d) {
72entry:
73 %arr = alloca [1024 x i32], align 16
74 br label %for.body
75
76for.body:
77 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +000078 %0 = getelementptr [1024 x i32], [1024 x i32]* %arr, i32 0, i64 %indvars.iv
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000079 %1 = bitcast [1024 x i32]* %arr to i8*
Matt Arsenaultf10061e2017-04-10 20:18:21 +000080 call void @llvm.lifetime.end.p0i8(i64 4096, i8* %1) #1
David Blaikie79e6c742015-02-27 19:29:02 +000081 %arrayidx = getelementptr inbounds i32, i32* %d, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000082 %2 = load i32, i32* %arrayidx, align 8
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000083 store i32 100, i32* %arrayidx, align 8
Matt Arsenaultf10061e2017-04-10 20:18:21 +000084 call void @llvm.lifetime.start.p0i8(i64 4096, i8* %1) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000085 %indvars.iv.next = add i64 %indvars.iv, 1
86 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
87 %exitcond = icmp ne i32 %lftr.wideiv, 128
88 br i1 %exitcond, label %for.body, label %for.end
89
90for.end:
91 ret void
92}
93
Matt Arsenaultf10061e2017-04-10 20:18:21 +000094declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
Arnold Schwaighofera7cd6bf2013-08-06 22:37:52 +000095
Matt Arsenaultf10061e2017-04-10 20:18:21 +000096declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1