www: Add Michael's thesis
[polly-mirror.git] / test / ScopInfo / assume_gep_bounds_2.ll
blobf872a7f251e290f046fa8213c1f633e4ec2482ea
1 ; RUN: opt %loadPolly -basicaa -polly-scops -analyze < %s | FileCheck %s
3 ;    void foo(float A[restrict][20], float B[restrict][20], long n, long m,
4 ;             long p) {
5 ;      for (long i = 0; i < n; i++)
6 ;        for (long j = 0; j < m; j++)
7 ;          A[i][j] = i + j;
8 ;      for (long i = 0; i < m; i++)
9 ;        for (long j = 0; j < p; j++)
10 ;          B[i][j] = i + j;
11 ;    }
13 ; This code is within bounds either if m and p are smaller than the array sizes,
14 ; but also if only p is smaller than the size of the second B dimension and n
15 ; is such that the first loop is never executed and consequently A is never
16 ; accessed. In this case the value of m does not matter.
18 ; CHECK:      Assumed Context:
19 ; CHECK-NEXT: [n, m, p] -> {  : p <= 20 and (n <= 0 or (n > 0 and m <= 20)) }
21 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
23 define void @foo([20 x float]* noalias %A, [20 x float]* noalias %B, i64 %n, i64 %m, i64 %p) {
24 entry:
25   br label %for.cond
27 for.cond:                                         ; preds = %for.inc5, %entry
28   %i.0 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
29   %cmp = icmp slt i64 %i.0, %n
30   br i1 %cmp, label %for.body, label %for.end7
32 for.body:                                         ; preds = %for.cond
33   br label %for.cond1
35 for.cond1:                                        ; preds = %for.inc, %for.body
36   %j.0 = phi i64 [ 0, %for.body ], [ %inc, %for.inc ]
37   %cmp2 = icmp slt i64 %j.0, %m
38   br i1 %cmp2, label %for.body3, label %for.end
40 for.body3:                                        ; preds = %for.cond1
41   %add = add nsw i64 %i.0, %j.0
42   %conv = sitofp i64 %add to float
43   %arrayidx4 = getelementptr inbounds [20 x float], [20 x float]* %A, i64 %i.0, i64 %j.0
44   store float %conv, float* %arrayidx4, align 4
45   br label %for.inc
47 for.inc:                                          ; preds = %for.body3
48   %inc = add nsw i64 %j.0, 1
49   br label %for.cond1
51 for.end:                                          ; preds = %for.cond1
52   br label %for.inc5
54 for.inc5:                                         ; preds = %for.end
55   %inc6 = add nsw i64 %i.0, 1
56   br label %for.cond
58 for.end7:                                         ; preds = %for.cond
59   br label %for.cond9
61 for.cond9:                                        ; preds = %for.inc25, %for.end7
62   %i8.0 = phi i64 [ 0, %for.end7 ], [ %inc26, %for.inc25 ]
63   %cmp10 = icmp slt i64 %i8.0, %m
64   br i1 %cmp10, label %for.body12, label %for.end27
66 for.body12:                                       ; preds = %for.cond9
67   br label %for.cond14
69 for.cond14:                                       ; preds = %for.inc22, %for.body12
70   %j13.0 = phi i64 [ 0, %for.body12 ], [ %inc23, %for.inc22 ]
71   %cmp15 = icmp slt i64 %j13.0, %p
72   br i1 %cmp15, label %for.body17, label %for.end24
74 for.body17:                                       ; preds = %for.cond14
75   %add18 = add nsw i64 %i8.0, %j13.0
76   %conv19 = sitofp i64 %add18 to float
77   %arrayidx21 = getelementptr inbounds [20 x float], [20 x float]* %B, i64 %i8.0, i64 %j13.0
78   store float %conv19, float* %arrayidx21, align 4
79   br label %for.inc22
81 for.inc22:                                        ; preds = %for.body17
82   %inc23 = add nsw i64 %j13.0, 1
83   br label %for.cond14
85 for.end24:                                        ; preds = %for.cond14
86   br label %for.inc25
88 for.inc25:                                        ; preds = %for.end24
89   %inc26 = add nsw i64 %i8.0, 1
90   br label %for.cond9
92 for.end27:                                        ; preds = %for.cond9
93   ret void