[MLIR][TOSA] Update CustomOp input and output names (#118408)
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / X86 / CostModel / masked-interleaved-load-i16.ll
blobe867e5f5bcfc7ab013abe9d471eea5c030d205c1
1 ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter "LV: Found an estimated cost of [0-9]+ for VF [0-9]+ For instruction:\s*%i[2,4] = load i16, ptr %[a-zA-Z0-7]+, align 2"
2 ; RUN: opt -passes=loop-vectorize -enable-interleaved-mem-accesses -prefer-predicate-over-epilogue=predicate-dont-vectorize -S -mcpu=skx --debug-only=loop-vectorize < %s 2>&1 | FileCheck %s --check-prefix=DISABLED_MASKED_STRIDED
3 ; RUN: opt -passes=loop-vectorize -enable-interleaved-mem-accesses -enable-masked-interleaved-mem-accesses -prefer-predicate-over-epilogue=predicate-dont-vectorize -S -mcpu=skx --debug-only=loop-vectorize < %s 2>&1 | FileCheck %s --check-prefix=ENABLED_MASKED_STRIDED
4 ; REQUIRES: asserts
6 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
7 target triple = "x86_64-unknown-linux-gnu"
9 ; (1) Interleave-group with factor 4, storing only 2 members out of the 4.
10 ; Check that when we allow masked-memops to support interleave-group with gaps,
11 ; the store is vectorized using a wide masked store, with a 1,1,0,0,1,1,0,0,... mask.
12 ; Check that when we don't allow masked-memops to support interleave-group with gaps,
13 ; the store is scalarized.
14 ; The input IR was generated from this source:
15 ;     for(i=0;i<1024;i++){
16 ;       x[i] = points[i*4];
17 ;       y[i] = points[i*4 + 1];
18 ;     }
19 ; (relates to the testcase in PR50566)
21 define void @test1(ptr noalias nocapture %points, ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y) {
22 ; DISABLED_MASKED_STRIDED-LABEL: 'test1'
23 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
24 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
25 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 6 for VF 2 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
26 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 6 for VF 2 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
27 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 13 for VF 4 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
28 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 13 for VF 4 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
29 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 27 for VF 8 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
30 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 27 for VF 8 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
31 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 55 for VF 16 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
32 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 55 for VF 16 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
34 ; ENABLED_MASKED_STRIDED-LABEL: 'test1'
35 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
36 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
37 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 8 for VF 2 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
38 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 2 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
39 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 11 for VF 4 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
40 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 4 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
41 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 11 for VF 8 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
42 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 8 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
43 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 17 for VF 16 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
44 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 16 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
46 entry:
47   br label %for.body
49 for.body:
50   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
51   %i1 = shl nuw nsw i64 %indvars.iv, 2
52   %arrayidx2 = getelementptr inbounds i16, ptr %points, i64 %i1
53   %i2 = load i16, ptr %arrayidx2, align 2
54   %i3 = or disjoint i64 %i1, 1
55   %arrayidx7 = getelementptr inbounds i16, ptr %points, i64 %i3
56   %i4 = load i16, ptr %arrayidx7, align 2
57   %arrayidx = getelementptr inbounds i16, ptr %x, i64 %indvars.iv
58   store i16 %i2, ptr %arrayidx, align 2
59   %arrayidx4 = getelementptr inbounds i16, ptr %y, i64 %indvars.iv
60   store i16 %i4, ptr %arrayidx4, align 2
61   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
62   %exitcond.not = icmp eq i64 %indvars.iv.next, 1024
63   br i1 %exitcond.not, label %for.end, label %for.body
65 for.end:
66   ret void
69 ; (2) Same as above, but this time the gaps mask of the store is also And-ed with the
70 ; fold-tail mask. If using masked memops to vectorize interleaved-group with gaps is
71 ; not allowed, the store is scalarized and predicated.
72 ; The input IR was generated from this source:
73 ;     for(i=0;i<numPoints;i++){
74 ;       x[i] = points[i*4];
75 ;       y[i] = points[i*4 + 1];
76 ;     }
78 define void @test2(ptr noalias nocapture %points, i32 %numPoints, ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y) {
79 ; DISABLED_MASKED_STRIDED-LABEL: 'test2'
80 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
81 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
82 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 2 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
83 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 2 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
84 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 4 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
85 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 4 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
86 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 8 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
87 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 8 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
88 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 16 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
89 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 16 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
91 ; ENABLED_MASKED_STRIDED-LABEL: 'test2'
92 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
93 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
94 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 8 for VF 2 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
95 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 2 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
96 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 11 for VF 4 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
97 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 4 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
98 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 11 for VF 8 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
99 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 8 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
100 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 17 for VF 16 For instruction: %i2 = load i16, ptr %arrayidx2, align 2
101 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 0 for VF 16 For instruction: %i4 = load i16, ptr %arrayidx7, align 2
103 entry:
104   %cmp15 = icmp sgt i32 %numPoints, 0
105   br i1 %cmp15, label %for.body.preheader, label %for.end
107 for.body.preheader:
108   %wide.trip.count = zext i32 %numPoints to i64
109   br label %for.body
111 for.body:
112   %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
113   %i1 = shl nuw nsw i64 %indvars.iv, 2
114   %arrayidx2 = getelementptr inbounds i16, ptr %points, i64 %i1
115   %i2 = load i16, ptr %arrayidx2, align 2
116   %i3 = or disjoint i64 %i1, 1
117   %arrayidx7 = getelementptr inbounds i16, ptr %points, i64 %i3
118   %i4 = load i16, ptr %arrayidx7, align 2
119   %arrayidx = getelementptr inbounds i16, ptr %x, i64 %indvars.iv
120   store i16 %i2, ptr %arrayidx, align 2
121   %arrayidx4 = getelementptr inbounds i16, ptr %y, i64 %indvars.iv
122   store i16 %i4, ptr %arrayidx4, align 2
123   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
124   %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
125   br i1 %exitcond.not, label %for.end.loopexit, label %for.body
127 for.end.loopexit:
128   br label %for.end
130 for.end:
131   ret void
134 ; (3) Testing a scenario of a conditional store. The gaps mask of the store is also
135 ; And-ed with the condition mask (x[i] > 0).
136 ; If using masked memops to vectorize interleaved-group with gaps is
137 ; not allowed, the store is scalarized and predicated.
138 ; Here the Interleave-group is with factor 3, storing only 1 member out of the 3.
139 ; The input IR was generated from this source:
140 ;     for(i=0;i<1024;i++){
141 ;       if (x[i] > 0)
142 ;         x[i] = points[i*3];
143 ;     }
145 define void @test(ptr noalias nocapture %points, ptr noalias nocapture readonly %x, ptr noalias nocapture readnone %y) {
146 ; DISABLED_MASKED_STRIDED-LABEL: 'test'
147 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i2 = load i16, ptr %arrayidx, align 2
148 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
149 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 2 For instruction: %i2 = load i16, ptr %arrayidx, align 2
150 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 2 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
151 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 4 For instruction: %i2 = load i16, ptr %arrayidx, align 2
152 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 4 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
153 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 8 For instruction: %i2 = load i16, ptr %arrayidx, align 2
154 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 8 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
155 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 16 For instruction: %i2 = load i16, ptr %arrayidx, align 2
156 ; DISABLED_MASKED_STRIDED:  LV: Found an estimated cost of 3000000 for VF 16 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
158 ; ENABLED_MASKED_STRIDED-LABEL: 'test'
159 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i2 = load i16, ptr %arrayidx, align 2
160 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 1 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
161 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 2 For instruction: %i2 = load i16, ptr %arrayidx, align 2
162 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 7 for VF 2 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
163 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 4 For instruction: %i2 = load i16, ptr %arrayidx, align 2
164 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 9 for VF 4 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
165 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 8 For instruction: %i2 = load i16, ptr %arrayidx, align 2
166 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 9 for VF 8 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
167 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 1 for VF 16 For instruction: %i2 = load i16, ptr %arrayidx, align 2
168 ; ENABLED_MASKED_STRIDED:  LV: Found an estimated cost of 14 for VF 16 For instruction: %i4 = load i16, ptr %arrayidx6, align 2
170 entry:
171   br label %for.body
173 for.body:
174   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.inc ]
175   %arrayidx = getelementptr inbounds i16, ptr %x, i64 %indvars.iv
176   %i2 = load i16, ptr %arrayidx, align 2
177   %cmp1 = icmp sgt i16 %i2, 0
178   br i1 %cmp1, label %if.then, label %for.inc
180 if.then:
181   %i1 = mul nuw nsw i64 %indvars.iv, 3
182   %arrayidx6 = getelementptr inbounds i16, ptr %points, i64 %i1
183   %i4 = load i16, ptr %arrayidx6, align 2
184   store i16 %i4, ptr %arrayidx, align 2
185   br label %for.inc
187 for.inc:
188   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
189   %exitcond.not = icmp eq i64 %indvars.iv.next, 1024
190   br i1 %exitcond.not, label %for.end, label %for.body
192 for.end:
193   ret void