blob: 7fbed6fcc15cf6a1fef150f1cad15c74f33d3ef6 [file] [log] [blame]
Adam Nemete91cc6e2015-02-19 19:15:19 +00001; RUN: opt -loop-accesses -analyze < %s | FileCheck %s
Sean Silva284b0322016-07-07 01:01:53 +00002; RUN: opt -passes='require<scalar-evolution>,require<aa>,loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s
Adam Nemete91cc6e2015-02-19 19:15:19 +00003
4; Analyze this loop:
5; for (i = 0; i < n; i++)
6; A[i + 1] = A[i] * B[i] * C[i];
7
8target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
9target triple = "x86_64-apple-macosx10.10.0"
10
11; CHECK: Report: unsafe dependent memory operations in loop
Adam Nemeta2df7502015-11-03 21:39:52 +000012; CHECK-NEXT: Dependences:
Adam Nemet58913d62015-03-10 17:40:43 +000013; CHECK-NEXT: Backward:
14; CHECK-NEXT: %loadA = load i16, i16* %arrayidxA, align 2 ->
15; CHECK-NEXT: store i16 %mul1, i16* %arrayidxA_plus_2, align 2
Adam Nemete91cc6e2015-02-19 19:15:19 +000016; CHECK: Run-time memory checks:
17; CHECK-NEXT: 0:
Silviu Baranga1b6b50a2015-07-08 09:16:33 +000018; CHECK-NEXT: Comparing group
Silviu Barangace3877f2015-07-09 15:18:25 +000019; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, i16* %a, i64 %storemerge3
Silviu Barangaa647c302015-07-13 14:48:24 +000020; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
Silviu Baranga1b6b50a2015-07-08 09:16:33 +000021; CHECK-NEXT: Against group
David Blaikie79e6c742015-02-27 19:29:02 +000022; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, i16* %b, i64 %storemerge3
Adam Nemete91cc6e2015-02-19 19:15:19 +000023; CHECK-NEXT: 1:
Silviu Baranga1b6b50a2015-07-08 09:16:33 +000024; CHECK-NEXT: Comparing group
Silviu Barangace3877f2015-07-09 15:18:25 +000025; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, i16* %a, i64 %storemerge3
Silviu Barangaa647c302015-07-13 14:48:24 +000026; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
Silviu Baranga1b6b50a2015-07-08 09:16:33 +000027; CHECK-NEXT: Against group
David Blaikie79e6c742015-02-27 19:29:02 +000028; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %storemerge3
Adam Nemete91cc6e2015-02-19 19:15:19 +000029
Adam Nemete91cc6e2015-02-19 19:15:19 +000030@B = common global i16* null, align 8
31@A = common global i16* null, align 8
32@C = common global i16* null, align 8
33
34define void @f() {
35entry:
David Blaikiea79ac142015-02-27 21:17:42 +000036 %a = load i16*, i16** @A, align 8
37 %b = load i16*, i16** @B, align 8
38 %c = load i16*, i16** @C, align 8
Adam Nemete91cc6e2015-02-19 19:15:19 +000039 br label %for.body
40
41for.body: ; preds = %for.body, %entry
42 %storemerge3 = phi i64 [ 0, %entry ], [ %add, %for.body ]
43
David Blaikie79e6c742015-02-27 19:29:02 +000044 %arrayidxA = getelementptr inbounds i16, i16* %a, i64 %storemerge3
David Blaikiea79ac142015-02-27 21:17:42 +000045 %loadA = load i16, i16* %arrayidxA, align 2
Adam Nemete91cc6e2015-02-19 19:15:19 +000046
David Blaikie79e6c742015-02-27 19:29:02 +000047 %arrayidxB = getelementptr inbounds i16, i16* %b, i64 %storemerge3
David Blaikiea79ac142015-02-27 21:17:42 +000048 %loadB = load i16, i16* %arrayidxB, align 2
Adam Nemete91cc6e2015-02-19 19:15:19 +000049
David Blaikie79e6c742015-02-27 19:29:02 +000050 %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %storemerge3
David Blaikiea79ac142015-02-27 21:17:42 +000051 %loadC = load i16, i16* %arrayidxC, align 2
Adam Nemete91cc6e2015-02-19 19:15:19 +000052
53 %mul = mul i16 %loadB, %loadA
54 %mul1 = mul i16 %mul, %loadC
55
56 %add = add nuw nsw i64 %storemerge3, 1
David Blaikie79e6c742015-02-27 19:29:02 +000057 %arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
Adam Nemete91cc6e2015-02-19 19:15:19 +000058 store i16 %mul1, i16* %arrayidxA_plus_2, align 2
59
60 %exitcond = icmp eq i64 %add, 20
61 br i1 %exitcond, label %for.end, label %for.body
62
63for.end: ; preds = %for.body
64 ret void
65}