blob: c794fed824f75ac445c6ae8503ca38ad0d5390c0 [file] [log] [blame]
Florian Hahn9467ccf2018-04-03 20:54:04 +00001; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' -pass-remarks-output=%t
2; RUN: FileCheck --input-file=%t %s
Florian Hahn42840492017-07-31 09:00:52 +00003
4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5target triple = "x86_64-unknown-linux-gnu"
6
7@A = common global [100 x [100 x i32]] zeroinitializer
8
9declare void @foo(i64 %a)
10declare void @bar(i64 %a) readnone
11
12;;--------------------------------------Test case 01------------------------------------
13;; Not safe to interchange, because the called function `foo` is not marked as
14;; readnone, so it could introduce dependences.
15;;
Florian Hahn9467ccf2018-04-03 20:54:04 +000016;; for(int i=0;i<100;i++) {
17;; for(int j=1;j<100;j++) {
Florian Hahn42840492017-07-31 09:00:52 +000018;; foo(i);
19;; A[j][i] = A[j][i]+k;
20;; }
21;; }
22
Florian Hahn9467ccf2018-04-03 20:54:04 +000023; CHECK: --- !Missed
24; CHECK-NEXT: Pass: loop-interchange
25; CHECK-NEXT: Name: CallInst
26; CHECK-NEXT: Function: interchange_01
27; CHECK-NEXT: Args:
28; CHECK-NEXT - String: Cannot interchange loops due to call instruction.
Sebastian Popbf6e1c22018-03-06 21:55:59 +000029
Florian Hahn9467ccf2018-04-03 20:54:04 +000030define void @interchange_01(i32 %k) {
Florian Hahn42840492017-07-31 09:00:52 +000031entry:
Florian Hahn42840492017-07-31 09:00:52 +000032 br label %for1.header
33
34for1.header:
Florian Hahn9467ccf2018-04-03 20:54:04 +000035 %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc10 ]
Florian Hahn42840492017-07-31 09:00:52 +000036 br label %for2
37
38for2:
Florian Hahn9467ccf2018-04-03 20:54:04 +000039 %indvars.iv = phi i64 [ %indvars.iv.next, %for2 ], [ 1, %for1.header ]
Florian Hahn42840492017-07-31 09:00:52 +000040 call void @foo(i64 %indvars.iv23)
41 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23
Florian Hahn9467ccf2018-04-03 20:54:04 +000042 %lv = load i32, i32* %arrayidx5
43 %add = add nsw i32 %lv, %k
Florian Hahn42840492017-07-31 09:00:52 +000044 store i32 %add, i32* %arrayidx5
45 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
Florian Hahn9467ccf2018-04-03 20:54:04 +000046 %exitcond = icmp eq i64 %indvars.iv, 99
Florian Hahn42840492017-07-31 09:00:52 +000047 br i1 %exitcond, label %for2.loopexit , label %for2
48
49for2.loopexit:
50 br label %for1.inc10
51
52for1.inc10:
53 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1
Florian Hahn9467ccf2018-04-03 20:54:04 +000054 %exitcond26 = icmp eq i64 %indvars.iv23, 99
Florian Hahn42840492017-07-31 09:00:52 +000055 br i1 %exitcond26, label %for1.loopexit, label %for1.header
56
57for1.loopexit:
58 br label %exit
59
60exit:
61 ret void
62}
63
Florian Hahn42840492017-07-31 09:00:52 +000064;;--------------------------------------Test case 02------------------------------------
65;; Safe to interchange, because the called function `bar` is marked as readnone,
66;; so it cannot introduce dependences.
67;;
Florian Hahn9467ccf2018-04-03 20:54:04 +000068;; for(int i=0;i<100;i++) {
69;; for(int j=1;j<100;j++) {
Florian Hahn42840492017-07-31 09:00:52 +000070;; bar(i);
71;; A[j][i] = A[j][i]+k;
72;; }
73;; }
74
Florian Hahn9467ccf2018-04-03 20:54:04 +000075; CHECK: --- !Passed
76; CHECK-NEXT: Pass: loop-interchange
77; CHECK-NEXT: Name: Interchanged
78; CHECK-NEXT: Function: interchange_02
79; CHECK-NEXT: Args:
80; CHECK-NEXT: - String: Loop interchanged with enclosing loop.
81; CHECK-NEXT: ...
Sebastian Popbf6e1c22018-03-06 21:55:59 +000082
Florian Hahn9467ccf2018-04-03 20:54:04 +000083define void @interchange_02(i32 %k) {
Florian Hahn42840492017-07-31 09:00:52 +000084entry:
Florian Hahn42840492017-07-31 09:00:52 +000085 br label %for1.header
86
87for1.header:
Florian Hahn9467ccf2018-04-03 20:54:04 +000088 %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc10 ]
Florian Hahn42840492017-07-31 09:00:52 +000089 br label %for2
90
91for2:
Florian Hahn9467ccf2018-04-03 20:54:04 +000092 %indvars.iv = phi i64 [ %indvars.iv.next, %for2 ], [ 1, %for1.header ]
Florian Hahn42840492017-07-31 09:00:52 +000093 call void @bar(i64 %indvars.iv23)
94 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23
Florian Hahn9467ccf2018-04-03 20:54:04 +000095 %lv = load i32, i32* %arrayidx5
96 %add = add nsw i32 %lv, %k
Florian Hahn42840492017-07-31 09:00:52 +000097 store i32 %add, i32* %arrayidx5
98 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
Florian Hahn9467ccf2018-04-03 20:54:04 +000099 %exitcond = icmp eq i64 %indvars.iv, 99
Florian Hahn42840492017-07-31 09:00:52 +0000100 br i1 %exitcond, label %for2.loopexit , label %for2
101
102for2.loopexit:
103 br label %for1.inc10
104
105for1.inc10:
106 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1
Florian Hahn9467ccf2018-04-03 20:54:04 +0000107 %exitcond26 = icmp eq i64 %indvars.iv23, 99
Florian Hahn42840492017-07-31 09:00:52 +0000108 br i1 %exitcond26, label %for1.loopexit, label %for1.header
109
110for1.loopexit:
111 br label %exit
112
113exit:
114 ret void
115}