c3c05abda7e2f2f91ef92466bf4a3aa776aac174
[oota-llvm.git] / test / Transforms / LoopVectorize / reg-usage.ll
1 ; RUN: opt < %s -mtriple=x86_64-unknown-linux-gpu -mcpu=core2 -mattr=+sse2 -debug-only=loop-vectorize -loop-vectorize -vectorizer-maximize-bandwidth 2>&1 | FileCheck %s
2 ; REQUIRES: asserts
3
4
5 @a = global [1024 x i8] zeroinitializer, align 16
6 @b = global [1024 x i8] zeroinitializer, align 16
7
8 define i32 @foo() {
9 ; This function has a loop of SAD pattern. Here we check when VF = 16 the
10 ; register usage doesn't exceed 16.
11 ;
12 ; CHECK-LABEL: foo
13 ; CHECK:      LV(REG): VF = 4
14 ; CHECK-NEXT: LV(REG): Found max usage: 4
15 ; CHECK:      LV(REG): VF = 8
16 ; CHECK-NEXT: LV(REG): Found max usage: 7
17 ; CHECK:      LV(REG): VF = 16
18 ; CHECK-NEXT: LV(REG): Found max usage: 13
19
20 entry:
21   br label %for.body
22
23 for.cond.cleanup:
24   %add.lcssa = phi i32 [ %add, %for.body ]
25   ret i32 %add.lcssa
26
27 for.body:
28   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
29   %s.015 = phi i32 [ 0, %entry ], [ %add, %for.body ]
30   %arrayidx = getelementptr inbounds [1024 x i8], [1024 x i8]* @a, i64 0, i64 %indvars.iv
31   %0 = load i8, i8* %arrayidx, align 1
32   %conv = zext i8 %0 to i32
33   %arrayidx2 = getelementptr inbounds [1024 x i8], [1024 x i8]* @b, i64 0, i64 %indvars.iv
34   %1 = load i8, i8* %arrayidx2, align 1
35   %conv3 = zext i8 %1 to i32
36   %sub = sub nsw i32 %conv, %conv3
37   %ispos = icmp sgt i32 %sub, -1
38   %neg = sub nsw i32 0, %sub
39   %2 = select i1 %ispos, i32 %sub, i32 %neg
40   %add = add nsw i32 %2, %s.015
41   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
42   %exitcond = icmp eq i64 %indvars.iv.next, 1024
43   br i1 %exitcond, label %for.cond.cleanup, label %for.body
44 }
45
46 define i64 @bar(i64* nocapture %a) {
47 ; CHECK-LABEL: bar
48 ; CHECK:       LV(REG): VF = 2
49 ; CHECK:       LV(REG): Found max usage: 4
50 ;
51 entry:
52   br label %for.body
53
54 for.cond.cleanup:
55   %add2.lcssa = phi i64 [ %add2, %for.body ]
56   ret i64 %add2.lcssa
57
58 for.body:
59   %i.012 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
60   %s.011 = phi i64 [ 0, %entry ], [ %add2, %for.body ]
61   %arrayidx = getelementptr inbounds i64, i64* %a, i64 %i.012
62   %0 = load i64, i64* %arrayidx, align 8
63   %add = add nsw i64 %0, %i.012
64   store i64 %add, i64* %arrayidx, align 8
65   %add2 = add nsw i64 %add, %s.011
66   %inc = add nuw nsw i64 %i.012, 1
67   %exitcond = icmp eq i64 %inc, 1024
68   br i1 %exitcond, label %for.cond.cleanup, label %for.body
69 }