xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/PR21585.ll (revision 46f9cddfd7e40998422d1e34a3f1193210ee2fb8)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -disable-output "-passes=print<da>"                            \
3; RUN: "-aa-pipeline=basic-aa,globals-aa" 2>&1 | FileCheck %s
4define void @i32_subscript(ptr %a) {
5; CHECK-LABEL: 'i32_subscript'
6; CHECK-NEXT:  Src: %0 = load i32, ptr %a.addr, align 4 --> Dst: %0 = load i32, ptr %a.addr, align 4
7; CHECK-NEXT:    da analyze - none!
8; CHECK-NEXT:  Src: %0 = load i32, ptr %a.addr, align 4 --> Dst: store i32 %1, ptr %a.addr.2, align 4
9; CHECK-NEXT:    da analyze - anti [*|<]!
10; CHECK-NEXT:  Src: store i32 %1, ptr %a.addr.2, align 4 --> Dst: store i32 %1, ptr %a.addr.2, align 4
11; CHECK-NEXT:    da analyze - consistent output [S]!
12;
13entry:
14  br label %for.body
15
16for.body:
17  %i = phi i32 [ 0, %entry ], [ %i.inc, %for.body ]
18  %a.addr = getelementptr i32, ptr %a, i32 %i
19  %a.addr.2 = getelementptr i32, ptr %a, i32 5
20  %0 = load i32, ptr %a.addr, align 4
21  %1 = add i32 %0, 1
22  store i32 %1, ptr %a.addr.2, align 4
23  %i.inc = add nsw i32 %i, 1
24  %i.inc.ext = sext i32 %i to i64
25  %exitcond = icmp ne i64 %i.inc.ext, 100
26  br i1 %exitcond, label %for.body, label %for.end
27
28for.end:
29  ret void
30}
31
32; Test for a bug, which caused an assert in ScalarEvolution because
33; the Dependence Analyzer attempted to zero extend a type to a smaller
34; type.
35
36; void t(unsigned int *a, unsigned int n) {
37;   for (unsigned int i = 0; i != n; i++) {
38;     a[(unsigned short)i] = g;
39;  }}
40
41@g = common global i32 0, align 4
42
43define void @t(ptr noalias %a, i32 %n) nounwind {
44; CHECK-LABEL: 't'
45; CHECK-NEXT:  Src: %0 = load i32, ptr @g, align 4 --> Dst: %0 = load i32, ptr @g, align 4
46; CHECK-NEXT:    da analyze - consistent input [S]!
47; CHECK-NEXT:  Src: %0 = load i32, ptr @g, align 4 --> Dst: store i32 %0, ptr %arrayidx, align 4
48; CHECK-NEXT:    da analyze - none!
49; CHECK-NEXT:  Src: store i32 %0, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %arrayidx, align 4
50; CHECK-NEXT:    da analyze - output [*]!
51;
52entry:
53  %cmp1 = icmp eq i32 %n, 0
54  br i1 %cmp1, label %for.end, label %for.body
55
56for.body:
57  %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
58  %0 = load i32, ptr @g, align 4
59  %idxprom = and i32 %i.02, 65535
60  %arrayidx = getelementptr inbounds i32, ptr %a, i32 %idxprom
61  store i32 %0, ptr %arrayidx, align 4
62  %inc = add i32 %i.02, 1
63  %cmp = icmp eq i32 %inc, %n
64  br i1 %cmp, label %for.end, label %for.body
65
66for.end:
67  ret void
68}
69
70define void @i16_wrap(ptr %a) {
71; CHECK-LABEL: 'i16_wrap'
72; CHECK-NEXT:  Src: %0 = load i64, ptr %idx, align 4 --> Dst: %0 = load i64, ptr %idx, align 4
73; CHECK-NEXT:    da analyze - input [*]!
74; CHECK-NEXT:  Src: %0 = load i64, ptr %idx, align 4 --> Dst: store i64 %1, ptr %idx, align 4
75; CHECK-NEXT:    da analyze - anti [*|<]!
76; CHECK-NEXT:  Src: store i64 %1, ptr %idx, align 4 --> Dst: store i64 %1, ptr %idx, align 4
77; CHECK-NEXT:    da analyze - output [*]!
78;
79entry:
80  br label %for.body
81for.body:
82  %i = phi i64 [0, %entry], [%i.inc, %for.inc]
83  %i.tr = trunc i64 %i to i16
84  %idx = getelementptr i64, ptr %a, i16 %i.tr
85  %0 = load i64, ptr %idx
86  %1 = add i64 %0, 1
87store i64 %1, ptr %idx
88  br label %for.inc
89
90for.inc:
91  %i.inc = add nuw i64 %i, 1
92  %cmp = icmp ult i64 %i.inc, 17179869184
93  br i1 %cmp, label %for.body, label %for.end
94for.end:
95  ret void
96}
97
98define void @i8_stride_wrap(ptr noalias %a, ptr noalias %b) {
99; CHECK-LABEL: 'i8_stride_wrap'
100; CHECK-NEXT:  Src: %0 = load i32, ptr %idx, align 4 --> Dst: %0 = load i32, ptr %idx, align 4
101; CHECK-NEXT:    da analyze - consistent input [S]!
102; CHECK-NEXT:  Src: %0 = load i32, ptr %idx, align 4 --> Dst: store i32 %1, ptr %idx.2, align 4
103; CHECK-NEXT:    da analyze - none!
104; CHECK-NEXT:  Src: store i32 %1, ptr %idx.2, align 4 --> Dst: store i32 %1, ptr %idx.2, align 4
105; CHECK-NEXT:    da analyze - none!
106;
107entry:
108  br label %for.body
109for.body:
110  %i = phi i32 [1,%entry], [%i.inc, %for.inc]
111  %i.tr = trunc i32 %i to i8
112  %idx = getelementptr i32, ptr %a, i8 %i.tr
113  %idx.2 = getelementptr i32, ptr %b, i32 %i
114  %0 = load i32, ptr %idx, align 4
115  %1 = add i32 %0, 1
116  store i32 %1, ptr %idx.2, align 4
117  br label %for.inc
118
119for.inc:
120  %i.inc = add nsw i32 %i, 256
121  %exitcond = icmp ult i32 %i, 65536
122  br i1 %exitcond, label %for.body, label %for.end
123
124for.end:
125  ret void
126}
127