• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; REQUIRES: asserts
2; RUN: opt -loop-vectorize -S -mcpu=skx --debug-only=loop-vectorize < %s 2>&1| FileCheck %s
3
4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5target triple = "x86_64-unknown-linux-gnu"
6
7@A = global [10240 x i8] zeroinitializer, align 16
8@B = global [10240 x i8] zeroinitializer, align 16
9
10; Function Attrs: nounwind uwtable
11define void @load_i8_stride2() {
12;CHECK-LABEL: load_i8_stride2
13;CHECK: Found an estimated cost of 1 for VF 1 For instruction:   %1 = load
14;CHECK: Found an estimated cost of 1 for VF 2 For instruction:   %1 = load
15;CHECK: Found an estimated cost of 1 for VF 4 For instruction:   %1 = load
16;CHECK: Found an estimated cost of 1 for VF 8 For instruction:   %1 = load
17;CHECK: Found an estimated cost of 3 for VF 16 For instruction:   %1 = load
18;CHECK: Found an estimated cost of 8 for VF 32 For instruction:   %1 = load
19;CHECK: Found an estimated cost of 20 for VF 64 For instruction:   %1 = load
20entry:
21  br label %for.body
22
23for.body:                                         ; preds = %for.body, %entry
24  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
25  %0 = shl nsw i64 %indvars.iv, 1
26  %arrayidx = getelementptr inbounds [10240 x i8], [10240 x i8]* @A, i64 0, i64 %0
27  %1 = load i8, i8* %arrayidx, align 2
28  %arrayidx2 = getelementptr inbounds [10240 x i8], [10240 x i8]* @B, i64 0, i64 %indvars.iv
29  store i8 %1, i8* %arrayidx2, align 1
30  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
31  %exitcond = icmp eq i64 %indvars.iv.next, 1024
32  br i1 %exitcond, label %for.end, label %for.body
33
34for.end:                                          ; preds = %for.body
35  ret void
36}
37
38define void @load_i8_stride3() {
39;CHECK-LABEL: load_i8_stride3
40;CHECK: Found an estimated cost of 1 for VF 1 For instruction:   %1 = load
41;CHECK: Found an estimated cost of 1 for VF 2 For instruction:   %1 = load
42;CHECK: Found an estimated cost of 1 for VF 4 For instruction:   %1 = load
43;CHECK: Found an estimated cost of 3 for VF 8 For instruction:   %1 = load
44;CHECK: Found an estimated cost of 13 for VF 16 For instruction:   %1 = load
45;CHECK: Found an estimated cost of 16 for VF 32 For instruction:   %1 = load
46;CHECK: Found an estimated cost of 25 for VF 64 For instruction:   %1 = load
47entry:
48  br label %for.body
49
50for.body:                                         ; preds = %for.body, %entry
51  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
52  %0 = mul nsw i64 %indvars.iv, 3
53  %arrayidx = getelementptr inbounds [10240 x i8], [10240 x i8]* @A, i64 0, i64 %0
54  %1 = load i8, i8* %arrayidx, align 2
55  %arrayidx2 = getelementptr inbounds [10240 x i8], [10240 x i8]* @B, i64 0, i64 %indvars.iv
56  store i8 %1, i8* %arrayidx2, align 1
57  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
58  %exitcond = icmp eq i64 %indvars.iv.next, 1024
59  br i1 %exitcond, label %for.end, label %for.body
60
61for.end:                                          ; preds = %for.body
62  ret void
63}
64
65define void @load_i8_stride4() {
66;CHECK-LABEL: load_i8_stride4
67;CHECK: Found an estimated cost of 1 for VF 1 For instruction:   %1 = load
68;CHECK: Found an estimated cost of 1 for VF 2 For instruction:   %1 = load
69;CHECK: Found an estimated cost of 1 for VF 4 For instruction:   %1 = load
70;CHECK: Found an estimated cost of 3 for VF 8 For instruction:   %1 = load
71;CHECK: Found an estimated cost of 8 for VF 16 For instruction:   %1 = load
72;CHECK: Found an estimated cost of 20 for VF 32 For instruction:   %1 = load
73;CHECK: Found an estimated cost of 59 for VF 64 For instruction:   %1 = load
74entry:
75  br label %for.body
76
77for.body:                                         ; preds = %for.body, %entry
78  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
79  %0 = shl nsw i64 %indvars.iv, 2
80  %arrayidx = getelementptr inbounds [10240 x i8], [10240 x i8]* @A, i64 0, i64 %0
81  %1 = load i8, i8* %arrayidx, align 2
82  %arrayidx2 = getelementptr inbounds [10240 x i8], [10240 x i8]* @B, i64 0, i64 %indvars.iv
83  store i8 %1, i8* %arrayidx2, align 1
84  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
85  %exitcond = icmp eq i64 %indvars.iv.next, 1024
86  br i1 %exitcond, label %for.end, label %for.body
87
88for.end:                                          ; preds = %for.body
89  ret void
90}
91
92define void @load_i8_stride5() {
93;CHECK-LABEL: load_i8_stride5
94;CHECK: Found an estimated cost of 1 for VF 1 For instruction:   %1 = load
95;CHECK: Found an estimated cost of 1 for VF 2 For instruction:   %1 = load
96;CHECK: Found an estimated cost of 3 for VF 4 For instruction:   %1 = load
97;CHECK: Found an estimated cost of 8 for VF 8 For instruction:   %1 = load
98;CHECK: Found an estimated cost of 20 for VF 16 For instruction:   %1 = load
99;CHECK: Found an estimated cost of 39 for VF 32 For instruction:   %1 = load
100;CHECK: Found an estimated cost of 78 for VF 64 For instruction:   %1 = load
101entry:
102  br label %for.body
103
104for.body:                                         ; preds = %for.body, %entry
105  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
106  %0 = mul nsw i64 %indvars.iv, 5
107  %arrayidx = getelementptr inbounds [10240 x i8], [10240 x i8]* @A, i64 0, i64 %0
108  %1 = load i8, i8* %arrayidx, align 2
109  %arrayidx2 = getelementptr inbounds [10240 x i8], [10240 x i8]* @B, i64 0, i64 %indvars.iv
110  store i8 %1, i8* %arrayidx2, align 1
111  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
112  %exitcond = icmp eq i64 %indvars.iv.next, 1024
113  br i1 %exitcond, label %for.end, label %for.body
114
115for.end:                                          ; preds = %for.body
116  ret void
117}
118