[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / read-only.ll
bloba749293fb365bd02bdfdeb732e02780d44bbb97f
1 ; RUN: opt < %s  -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
3 target 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"
5 ;CHECK-LABEL: @read_only_func(
6 ;CHECK: load <4 x i32>
7 ;CHECK: ret i32
8 define i32 @read_only_func(i32* nocapture %A, i32* 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
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, i32* %A, i64 %indvars.iv
16   %3 = load i32, i32* %2, align 4
17   %4 = add nsw i64 %indvars.iv, 13
18   %5 = getelementptr inbounds i32, i32* %B, i64 %4
19   %6 = load i32, i32* %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
28 ._crit_edge:                                      ; preds = %.lr.ph, %0
29   %sum.0.lcssa = phi i32 [ 0, %0 ], [ %9, %.lr.ph ]
30   ret i32 %sum.0.lcssa
33 ; Ensure that volatile loads are not vectorized in a read-only loop.
35 ;CHECK-LABEL: @read_only_func_volatile(
36 ;CHECK-NOT: load <4 x i32>
37 ;CHECK: ret i32
38 define i32 @read_only_func_volatile(i32* nocapture %A, i32* 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
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, i32* %A, i64 %indvars.iv
46   %3 = load volatile i32, i32* %2, align 4
47   %4 = add nsw i64 %indvars.iv, 13
48   %5 = getelementptr inbounds i32, i32* %B, i64 %4
49   %6 = load i32, i32* %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
58 ._crit_edge:                                      ; preds = %.lr.ph, %0
59   %sum.0.lcssa = phi i32 [ 0, %0 ], [ %9, %.lr.ph ]
60   ret i32 %sum.0.lcssa