blob: a7f692cef170749772013b98504db59aff931e67 [file] [log] [blame]
Tyler Nowicki5eaa5a92015-08-27 18:56:49 +00001; RUN: opt < %s -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -dce -instcombine -pass-remarks=loop-vectorize -pass-remarks-missed=loop-vectorize -S 2>&1 | FileCheck %s -check-prefix=OVERRIDE
2; RUN: opt < %s -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -pragma-vectorize-memory-check-threshold=6 -dce -instcombine -pass-remarks=loop-vectorize -pass-remarks-missed=loop-vectorize -S 2>&1 | FileCheck %s
Nadav Rotem13306812013-04-26 05:08:59 +00003
4target 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"
Nadav Rotem13306812013-04-26 05:08:59 +00005
Tyler Nowicki652b0da2015-08-10 23:01:55 +00006; First loop produced diagnostic pass remark.
Tyler Nowicki8f885462015-08-27 20:43:29 +00007;CHECK: remark: {{.*}}:0:0: vectorized loop (vectorization width: 4, interleaved count: 1)
Tyler Nowicki652b0da2015-08-10 23:01:55 +00008; Second loop produces diagnostic analysis remark.
Tyler Nowicki5eaa5a92015-08-27 18:56:49 +00009;CHECK: remark: {{.*}}:0:0: loop not vectorized: cannot prove it is safe to reorder memory operations
10
11; First loop produced diagnostic pass remark.
Tyler Nowicki8f885462015-08-27 20:43:29 +000012;OVERRIDE: remark: {{.*}}:0:0: vectorized loop (vectorization width: 4, interleaved count: 1)
Tyler Nowicki5eaa5a92015-08-27 18:56:49 +000013; Second loop produces diagnostic pass remark.
Tyler Nowicki8f885462015-08-27 20:43:29 +000014;OVERRIDE: remark: {{.*}}:0:0: vectorized loop (vectorization width: 4, interleaved count: 1)
Tyler Nowicki652b0da2015-08-10 23:01:55 +000015
Nadav Rotem13306812013-04-26 05:08:59 +000016; We are vectorizing with 6 runtime checks.
Matt Arsenaulte64c7c72013-10-02 20:29:00 +000017;CHECK-LABEL: func1x6(
Tyler Nowicki8f885462015-08-27 20:43:29 +000018;CHECK: <4 x i32>
Nadav Rotem13306812013-04-26 05:08:59 +000019;CHECK: ret
Tyler Nowicki5eaa5a92015-08-27 18:56:49 +000020;OVERRIDE-LABEL: func1x6(
21;OVERRIDE: <4 x i32>
22;OVERRIDE: ret
Nadav Rotem13306812013-04-26 05:08:59 +000023define i32 @func1x6(i32* nocapture %out, i32* nocapture %A, i32* nocapture %B, i32* nocapture %C, i32* nocapture %D, i32* nocapture %E, i32* nocapture %F) {
24entry:
25 br label %for.body
26
27for.body: ; preds = %for.body, %entry
28 %i.016 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +000029 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.016
David Blaikiea79ac142015-02-27 21:17:42 +000030 %0 = load i32, i32* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +000031 %arrayidx1 = getelementptr inbounds i32, i32* %B, i64 %i.016
David Blaikiea79ac142015-02-27 21:17:42 +000032 %1 = load i32, i32* %arrayidx1, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000033 %add = add nsw i32 %1, %0
David Blaikie79e6c742015-02-27 19:29:02 +000034 %arrayidx2 = getelementptr inbounds i32, i32* %C, i64 %i.016
David Blaikiea79ac142015-02-27 21:17:42 +000035 %2 = load i32, i32* %arrayidx2, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000036 %add3 = add nsw i32 %add, %2
David Blaikie79e6c742015-02-27 19:29:02 +000037 %arrayidx4 = getelementptr inbounds i32, i32* %E, i64 %i.016
David Blaikiea79ac142015-02-27 21:17:42 +000038 %3 = load i32, i32* %arrayidx4, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000039 %add5 = add nsw i32 %add3, %3
David Blaikie79e6c742015-02-27 19:29:02 +000040 %arrayidx6 = getelementptr inbounds i32, i32* %F, i64 %i.016
David Blaikiea79ac142015-02-27 21:17:42 +000041 %4 = load i32, i32* %arrayidx6, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000042 %add7 = add nsw i32 %add5, %4
David Blaikie79e6c742015-02-27 19:29:02 +000043 %arrayidx8 = getelementptr inbounds i32, i32* %out, i64 %i.016
Nadav Rotem13306812013-04-26 05:08:59 +000044 store i32 %add7, i32* %arrayidx8, align 4
45 %inc = add i64 %i.016, 1
46 %exitcond = icmp eq i64 %inc, 256
47 br i1 %exitcond, label %for.end, label %for.body
48
49for.end: ; preds = %for.body
50 ret i32 undef
51}
52
53; We are not vectorizing with 12 runtime checks.
Matt Arsenaulte64c7c72013-10-02 20:29:00 +000054;CHECK-LABEL: func2x6(
Tyler Nowicki8f885462015-08-27 20:43:29 +000055;CHECK-NOT: <4 x i32>
Nadav Rotem13306812013-04-26 05:08:59 +000056;CHECK: ret
Tyler Nowicki5eaa5a92015-08-27 18:56:49 +000057; We vectorize with 12 checks if a vectorization hint is provided.
58;OVERRIDE-LABEL: func2x6(
59;OVERRIDE: <4 x i32>
60;OVERRIDE: ret
Nadav Rotem13306812013-04-26 05:08:59 +000061define i32 @func2x6(i32* nocapture %out, i32* nocapture %out2, i32* nocapture %A, i32* nocapture %B, i32* nocapture %C, i32* nocapture %D, i32* nocapture %E, i32* nocapture %F) {
62entry:
63 br label %for.body
64
65for.body: ; preds = %for.body, %entry
66 %i.037 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +000067 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.037
David Blaikiea79ac142015-02-27 21:17:42 +000068 %0 = load i32, i32* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +000069 %arrayidx1 = getelementptr inbounds i32, i32* %B, i64 %i.037
David Blaikiea79ac142015-02-27 21:17:42 +000070 %1 = load i32, i32* %arrayidx1, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000071 %add = add nsw i32 %1, %0
David Blaikie79e6c742015-02-27 19:29:02 +000072 %arrayidx2 = getelementptr inbounds i32, i32* %C, i64 %i.037
David Blaikiea79ac142015-02-27 21:17:42 +000073 %2 = load i32, i32* %arrayidx2, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000074 %add3 = add nsw i32 %add, %2
David Blaikie79e6c742015-02-27 19:29:02 +000075 %arrayidx4 = getelementptr inbounds i32, i32* %E, i64 %i.037
David Blaikiea79ac142015-02-27 21:17:42 +000076 %3 = load i32, i32* %arrayidx4, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000077 %add5 = add nsw i32 %add3, %3
David Blaikie79e6c742015-02-27 19:29:02 +000078 %arrayidx6 = getelementptr inbounds i32, i32* %F, i64 %i.037
David Blaikiea79ac142015-02-27 21:17:42 +000079 %4 = load i32, i32* %arrayidx6, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000080 %add7 = add nsw i32 %add5, %4
David Blaikie79e6c742015-02-27 19:29:02 +000081 %arrayidx8 = getelementptr inbounds i32, i32* %out, i64 %i.037
Nadav Rotem13306812013-04-26 05:08:59 +000082 store i32 %add7, i32* %arrayidx8, align 4
David Blaikiea79ac142015-02-27 21:17:42 +000083 %5 = load i32, i32* %arrayidx, align 4
84 %6 = load i32, i32* %arrayidx1, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000085 %add11 = add nsw i32 %6, %5
David Blaikiea79ac142015-02-27 21:17:42 +000086 %7 = load i32, i32* %arrayidx2, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000087 %add13 = add nsw i32 %add11, %7
David Blaikiea79ac142015-02-27 21:17:42 +000088 %8 = load i32, i32* %arrayidx4, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000089 %add15 = add nsw i32 %add13, %8
David Blaikiea79ac142015-02-27 21:17:42 +000090 %9 = load i32, i32* %arrayidx6, align 4
Nadav Rotem13306812013-04-26 05:08:59 +000091 %add17 = add nsw i32 %add15, %9
David Blaikie79e6c742015-02-27 19:29:02 +000092 %arrayidx18 = getelementptr inbounds i32, i32* %out2, i64 %i.037
Nadav Rotem13306812013-04-26 05:08:59 +000093 store i32 %add17, i32* %arrayidx18, align 4
94 %inc = add i64 %i.037, 1
95 %exitcond = icmp eq i64 %inc, 256
96 br i1 %exitcond, label %for.end, label %for.body
97
98for.end: ; preds = %for.body
99 ret i32 undef
100}
101