summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopVectorize/X86/gather-vs-interleave.ll
blob: f38782cb7e597a49e1ea8d5dccfab1a75638184b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; RUN: opt -loop-vectorize -S -mattr=avx512f  < %s | FileCheck %s

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; This test checks that "gather" operation is choosen since it's cost is better
; than interleaving pattern.
;
;unsigned long A[SIZE];
;unsigned long B[SIZE];
;
;void foo() {
;  for (int i=0; i<N; i+=8) {
;    B[i] = A[i] + 5;
;  }
;}

@A = global [10240 x i64] zeroinitializer, align 16
@B = global [10240 x i64] zeroinitializer, align 16


; CHECK_LABEL: strided_load_i64
; CHECK: masked.gather
define void @strided_load_i64() {
  br label %1

; <label>:1:                                      ; preds = %0, %1
  %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  %2 = getelementptr inbounds [10240 x i64], [10240 x i64]* @A, i64 0, i64 %indvars.iv
  %3 = load i64, i64* %2, align 16
  %4 = add i64 %3, 5
  %5 = getelementptr inbounds [10240 x i64], [10240 x i64]* @B, i64 0, i64 %indvars.iv
  store i64 %4, i64* %5, align 16
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 8
  %6 = icmp slt i64 %indvars.iv.next, 1024
  br i1 %6, label %1, label %7

; <label>:7:                                      ; preds = %1
  ret void
}

OpenPOWER on IntegriCloud