]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Transforms/LoopInterchange/interchange-simple-count-up.ll
Vendor import of llvm trunk r321545:
[FreeBSD/FreeBSD.git] / test / Transforms / LoopInterchange / interchange-simple-count-up.ll
1 ; RUN: opt < %s -basicaa -loop-interchange -S | FileCheck %s
2 ;; We test the complete .ll for adjustment in outer loop header/latch and inner loop header/latch.
3
4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-linux-gnu"
6
7 @A = common global [100 x [100 x i32]] zeroinitializer
8 @B = common global [100 x i32] zeroinitializer
9
10 ;;  for(int i=0;i<N;i++)
11 ;;    for(int j=1;j<N;j++)
12 ;;      A[j][i] = A[j][i]+k;
13
14 define void @interchange_01(i32 %k, i32 %N) {
15 entry:
16   %cmp21 = icmp sgt i32 %N, 0
17   br i1 %cmp21, label %for.cond1.preheader.lr.ph, label %for.end12
18
19 for.cond1.preheader.lr.ph:
20   %cmp219 = icmp sgt i32 %N, 1
21   %0 = add i32 %N, -1
22   br label %for.cond1.preheader
23
24 for.cond1.preheader:
25   %indvars.iv23 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next24, %for.inc10 ]
26   br i1 %cmp219, label %for.body3, label %for.inc10
27
28 for.body3:
29   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 1, %for.cond1.preheader ]
30   %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23
31   %1 = load i32, i32* %arrayidx5
32   %add = add nsw i32 %1, %k
33   store i32 %add, i32* %arrayidx5
34   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
35   %lftr.wideiv = trunc i64 %indvars.iv to i32
36   %exitcond = icmp eq i32 %lftr.wideiv, %0
37   br i1 %exitcond, label %for.inc10, label %for.body3
38
39 for.inc10:
40   %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1
41   %lftr.wideiv25 = trunc i64 %indvars.iv23 to i32
42   %exitcond26 = icmp eq i32 %lftr.wideiv25, %0
43   br i1 %exitcond26, label %for.end12, label %for.cond1.preheader
44
45 for.end12:
46   ret void
47 }
48
49 ; CHECK-LABEL: @interchange_01
50 ; CHECK: entry:
51 ; CHECK:   %cmp21 = icmp sgt i32 %N, 0
52 ; CHECK:   br i1 %cmp21, label %for.body3.preheader, label %for.end12
53 ; CHECK: for.cond1.preheader.lr.ph:
54 ; CHECK:   br label %for.cond1.preheader
55 ; CHECK: for.cond1.preheader:
56 ; CHECK:   %indvars.iv23 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next24, %for.inc10 ]
57 ; CHECK:   br i1 %cmp219, label %for.body3.split1, label %for.end12.loopexit
58 ; CHECK: for.body3.preheader:
59 ; CHECK:   %cmp219 = icmp sgt i32 %N, 1
60 ; CHECK:   %0 = add i32 %N, -1
61 ; CHECK:   br label %for.body3
62 ; CHECK: for.body3:
63 ; CHECK:   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3.split ], [ 1, %for.body3.preheader ]
64 ; CHECK:   br label %for.cond1.preheader.lr.ph
65 ; CHECK: for.body3.split1:
66 ; CHECK:   %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23
67 ; CHECK:   %1 = load i32, i32* %arrayidx5
68 ; CHECK:   %add = add nsw i32 %1, %k
69 ; CHECK:   store i32 %add, i32* %arrayidx5
70 ; CHECK:   br label %for.inc10.loopexit
71 ; CHECK: for.body3.split:
72 ; CHECK:   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
73 ; CHECK:   %lftr.wideiv = trunc i64 %indvars.iv to i32
74 ; CHECK:   %exitcond = icmp eq i32 %lftr.wideiv, %0
75 ; CHECK:   br i1 %exitcond, label %for.end12.loopexit, label %for.body3
76 ; CHECK: for.inc10.loopexit:
77 ; CHECK:   br label %for.inc10
78 ; CHECK: for.inc10:
79 ; CHECK:   %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1
80 ; CHECK:   %lftr.wideiv25 = trunc i64 %indvars.iv23 to i32
81 ; CHECK:   %exitcond26 = icmp eq i32 %lftr.wideiv25, %0
82 ; CHECK:   br i1 %exitcond26, label %for.body3.split, label %for.cond1.preheader
83 ; CHECK: for.end12.loopexit:
84 ; CHECK:   br label %for.end12
85 ; CHECK: for.end12:
86 ; CHECK:   ret void