[flang][OpenMP] Fix build break after fe8b323f59
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / ARM / tail-folding-reduces-vf.ll
blob534f8aff1788da27bf09a0a576603e778f35149b
1 ; RUN: opt < %s -mattr=+mve,+mve.fp -passes=loop-vectorize -tail-predication=disabled -S | FileCheck %s --check-prefixes=DEFAULT
2 ; RUN: opt < %s -mattr=+mve,+mve.fp -passes=loop-vectorize -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue -S | FileCheck %s --check-prefixes=TAILPRED
4 target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
5 target triple = "thumbv8.1m.main-arm-none-eabi"
7 ; When TP is disabled, this test can vectorize with a VF of 16.
8 ; When TP is enabled, this test should vectorize with a VF of 8.
10 ; DEFAULT: load <16 x i8>, ptr
11 ; DEFAULT: sext <16 x i8> %{{.*}} to <16 x i16>
12 ; DEFAULT: add <16 x i16>
13 ; DEFAULT-NOT: llvm.masked.load
14 ; DEFAULT-NOT: llvm.masked.store
16 ; TAILPRED: llvm.masked.load.v8i8.p0
17 ; TAILPRED: sext <8 x i8> %{{.*}} to <8 x i16>
18 ; TAILPRED: add <8 x i16>
19 ; TAILPRED: call void @llvm.masked.store.v8i8.p0
20 ; TAILPRED-NOT: load <16 x i8>, ptr
22 define i32 @tp_reduces_vf(ptr nocapture %0, i32 %1, ptr %input) {
23   %3 = load ptr, ptr %input, align 8
24   %4 = sext i32 %1 to i64
25   %5 = icmp eq i32 %1, 0
26   br i1 %5, label %._crit_edge, label %.preheader47.preheader
28 .preheader47.preheader:
29   br label %.preheader47
31 .preheader47:
32   %.050 = phi i64 [ %54, %53 ], [ 0, %.preheader47.preheader ]
33   br label %.preheader
35 ._crit_edge.loopexit:
36   br label %._crit_edge
38 ._crit_edge:
39   ret i32 0
41 .preheader:
42   %indvars.iv51 = phi i32 [ 1, %.preheader47 ], [ %indvars.iv.next52, %52 ]
43   %6 = mul nuw nsw i32 %indvars.iv51, 320
44   br label %7
47   %indvars.iv = phi i32 [ 1, %.preheader ], [ %indvars.iv.next, %7 ]
48   %8 = add nuw nsw i32 %6, %indvars.iv
49   %9 = add nsw i32 %8, -320
50   %10 = add nsw i32 %8, -321
51   %11 = getelementptr inbounds i8, ptr %3, i32 %10
52   %12 = load i8, ptr %11, align 1
53   %13 = sext i8 %12 to i32
54   %14 = getelementptr inbounds i8, ptr %3, i32 %9
55   %15 = load i8, ptr %14, align 1
56   %16 = sext i8 %15 to i32
57   %17 = add nsw i32 %8, -319
58   %18 = getelementptr inbounds i8, ptr %3, i32 %17
59   %19 = load i8, ptr %18, align 1
60   %20 = sext i8 %19 to i32
61   %21 = add nsw i32 %8, -1
62   %22 = getelementptr inbounds i8, ptr %3, i32 %21
63   %23 = load i8, ptr %22, align 1
64   %24 = sext i8 %23 to i32
65   %25 = getelementptr inbounds i8, ptr %3, i32 %8
66   %26 = load i8, ptr %25, align 1
67   %27 = sext i8 %26 to i32
68   %28 = mul nsw i32 %27, 255
69   %29 = add nuw nsw i32 %8, 1
70   %30 = getelementptr inbounds i8, ptr %3, i32 %29
71   %31 = load i8, ptr %30, align 1
72   %32 = sext i8 %31 to i32
73   %33 = add nuw nsw i32 %8, 320
74   %34 = add nuw nsw i32 %8, 319
75   %35 = getelementptr inbounds i8, ptr %3, i32 %34
76   %36 = load i8, ptr %35, align 1
77   %37 = sext i8 %36 to i32
78   %38 = getelementptr inbounds i8, ptr %3, i32 %33
79   %39 = load i8, ptr %38, align 1
80   %40 = sext i8 %39 to i32
81   %41 = add nuw nsw i32 %8, 321
82   %42 = getelementptr inbounds i8, ptr %3, i32 %41
83   %43 = load i8, ptr %42, align 1
84   %44 = sext i8 %43 to i32
85   %reass.add = add nsw i32 %16, %13
86   %reass.add44 = add nsw i32 %reass.add, %20
87   %reass.add45 = add nsw i32 %reass.add44, %24
88   %45 = add nsw i32 %reass.add45, %32
89   %46 = add nsw i32 %45, %37
90   %47 = add nsw i32 %46, %40
91   %reass.add46 = add nsw i32 %47, %44
92   %reass.mul = mul nsw i32 %reass.add46, -28
93   %48 = add nsw i32 %reass.mul, %28
94   %49 = lshr i32 %48, 8
95   %50 = trunc i32 %49 to i8
96   %51 = getelementptr inbounds i8, ptr %0, i32 %8
97   store i8 %50, ptr %51, align 1
98   %indvars.iv.next = add nuw nsw i32 %indvars.iv, 1
99   %exitcond = icmp eq i32 %indvars.iv.next, 319
100   br i1 %exitcond, label %52, label %7
103   %indvars.iv.next52 = add nuw nsw i32 %indvars.iv51, 1
104   %exitcond53 = icmp eq i32 %indvars.iv.next52, 239
105   br i1 %exitcond53, label %53, label %.preheader
108   %54 = add nuw i64 %.050, 1
109   %55 = icmp ult i64 %54, %4
110   br i1 %55, label %.preheader47, label %._crit_edge.loopexit