xref: /llvm-project/llvm/test/Transforms/LoopVectorize/read-only.ll (revision 7d7577256b76e4293f455b8093504d5f7044ab4b)
1; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -S | FileCheck %s
2
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;CHECK-LABEL: @read_only_func(
6;CHECK: load <4 x i32>
7;CHECK: ret i32
8define i32 @read_only_func(ptr nocapture %A, ptr nocapture %B, i32 %n) nounwind uwtable readonly ssp {
9  %1 = icmp sgt i32 %n, 0
10  br i1 %1, label %.lr.ph, label %._crit_edge
11
12.lr.ph:                                           ; preds = %0, %.lr.ph
13  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ]
14  %sum.02 = phi i32 [ %9, %.lr.ph ], [ 0, %0 ]
15  %2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv
16  %3 = load i32, ptr %2, align 4
17  %4 = add nsw i64 %indvars.iv, 13
18  %5 = getelementptr inbounds i32, ptr %B, i64 %4
19  %6 = load i32, ptr %5, align 4
20  %7 = shl i32 %6, 1
21  %8 = add i32 %3, %sum.02
22  %9 = add i32 %8, %7
23  %indvars.iv.next = add i64 %indvars.iv, 1
24  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
25  %exitcond = icmp eq i32 %lftr.wideiv, %n
26  br i1 %exitcond, label %._crit_edge, label %.lr.ph
27
28._crit_edge:                                      ; preds = %.lr.ph, %0
29  %sum.0.lcssa = phi i32 [ 0, %0 ], [ %9, %.lr.ph ]
30  ret i32 %sum.0.lcssa
31}
32
33; Ensure that volatile loads are not vectorized in a read-only loop.
34
35;CHECK-LABEL: @read_only_func_volatile(
36;CHECK-NOT: load <4 x i32>
37;CHECK: ret i32
38define i32 @read_only_func_volatile(ptr nocapture %A, ptr nocapture %B, i32 %n) nounwind uwtable readonly ssp {
39  %1 = icmp sgt i32 %n, 0
40  br i1 %1, label %.lr.ph, label %._crit_edge
41
42.lr.ph:                                           ; preds = %0, %.lr.ph
43  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ]
44  %sum.02 = phi i32 [ %9, %.lr.ph ], [ 0, %0 ]
45  %2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv
46  %3 = load volatile i32, ptr %2, align 4
47  %4 = add nsw i64 %indvars.iv, 13
48  %5 = getelementptr inbounds i32, ptr %B, i64 %4
49  %6 = load i32, ptr %5, align 4
50  %7 = shl i32 %6, 1
51  %8 = add i32 %3, %sum.02
52  %9 = add i32 %8, %7
53  %indvars.iv.next = add i64 %indvars.iv, 1
54  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
55  %exitcond = icmp eq i32 %lftr.wideiv, %n
56  br i1 %exitcond, label %._crit_edge, label %.lr.ph
57
58._crit_edge:                                      ; preds = %.lr.ph, %0
59  %sum.0.lcssa = phi i32 [ 0, %0 ], [ %9, %.lr.ph ]
60  ret i32 %sum.0.lcssa
61}
62