xref: /llvm-project/llvm/test/Transforms/LoopVectorize/X86/interleaved-accesses-large-gap.ll (revision 7d7577256b76e4293f455b8093504d5f7044ab4b)
1; RUN: opt < %s -passes=loop-vectorize -mtriple x86_64 -S | FileCheck %s
2
3%struct.ST4 = type { i32, i32, i32, i32 }
4
5; The gaps between the memory access in this function are too large for
6; interleaving.
7
8; Test from https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7560
9define void @test1(ptr noalias %B) {
10; CHECK-LABEL: @test1
11; CHECK-NEXT:  entry:
12; CHECK-NEXT:    br label %for.body
13
14; CHECK-LABEL: for.body:
15; CHECK: store i32
16; CHECK: store i32
17; CHECK: store i32
18; CHECK: store i32
19; CHECK-NOT: store
20;
21entry:
22  br label %for.body
23
24for.body:                                         ; preds = %for.body, %entry
25  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
26  %p1 = getelementptr inbounds %struct.ST4, ptr %B, i64 %indvars.iv, i32 0
27  store i32 65536, ptr %p1, align 4
28  %p2 = getelementptr i32, ptr %p1, i32 -2147483648
29  store i32 65536, ptr %p2, align 4
30  %p3 = getelementptr inbounds %struct.ST4, ptr %B, i64 %indvars.iv, i32 2
31  store i32 10, ptr %p3, align 4
32  %p4 = getelementptr inbounds %struct.ST4, ptr %B, i64 %indvars.iv, i32 3
33  store i32 12, ptr %p4, align 4
34  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
35  %exitcond = icmp eq i64 %indvars.iv.next, 1024
36  br i1 %exitcond, label %for.cond.cleanup, label %for.body
37
38for.cond.cleanup:                                 ; preds = %for.body
39  ret void
40}
41
42; Make sure interleave groups with a key being the special 'empty' value for
43; the map do not cause a crash.
44define void @test_gap_empty_key() {
45; CHECK-LABEL: @test_gap_empty_key()
46; CHECK-NEXT:  entry:
47; CHECK-NEXT:    br label %for.body
48
49; CHECK-LABEL: for.body:
50; CHECK: store i32
51; CHECK: store i32
52; CHECK-NOT: store
53;
54entry:
55  br label %for.body
56
57for.body:
58  %iv = phi i64 [ 1, %entry ], [ %iv.next, %for.body ]
59  %iv.next = add nsw i64 %iv, 1
60  %arrayidx = getelementptr inbounds [3 x i32], ptr undef, i64 0, i64 %iv.next
61  %G2 = getelementptr i32, ptr %arrayidx, i64 %iv.next
62  %G9 = getelementptr i32, ptr %G2, i32 -2147483647
63  store i32 0, ptr %G2
64  store i32 1, ptr %G9
65  %cmp = icmp ule i64 %iv, 1000
66  br i1 false, label %for.body, label %exit
67
68exit:
69  ret void
70}
71
72; Make sure interleave groups with a key being the special 'tombstone' value for
73; the map do not cause a crash.
74define void @test_tombstone_key() {
75; CHECK-LABEL: @test_tombstone_key()
76; CHECK-NEXT:  entry:
77; CHECK-NEXT:    br label %for.body
78
79; CHECK-LABEL: for.body:
80; CHECK: store i32
81; CHECK: store i32
82; CHECK-NOT: store
83;
84entry:
85  br label %for.body
86
87for.body:
88  %iv = phi i64 [ 1, %entry ], [ %iv.next, %for.body ]
89  %iv.next = add nsw i64 %iv, 1
90  %arrayidx = getelementptr inbounds [3 x i32], ptr undef, i64 0, i64 %iv.next
91  %G2 = getelementptr i32, ptr %arrayidx, i64 %iv.next
92  %G9 = getelementptr i32, ptr %G2, i32 -2147483648
93  store i32 0, ptr %G2
94  store i32 1, ptr %G9
95  %cmp = icmp ule i64 %iv, 1000
96  br i1 false, label %for.body, label %exit
97
98exit:
99  ret void
100}
101