| Tobias Grosser | f4ee371 | 2015-10-06 15:36:44 +0000 | [diff] [blame^] | 1 | ; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s | 
| Johannes Doerfert | 883f8c1 | 2015-09-15 22:52:53 +0000 | [diff] [blame] | 2 | ; | 
|  | 3 | ;    void f(int *A, int N, int p) { | 
|  | 4 | ;      for (int i = 0; i < N; i++) | 
|  | 5 | ;        A[i + 30] = 0; | 
|  | 6 | ;    } | 
|  | 7 | ; | 
|  | 8 | ; The wrap function has no inbounds GEP but the nowrap function has. Therefore, | 
|  | 9 | ; we will add the assumption that i+1 won't overflow only to the former. | 
|  | 10 | ; | 
|  | 11 | ; Note: 2147483618 + 30 == 2 ^ 31 | 
|  | 12 | ; | 
|  | 13 | ; CHECK:      Function: wrap | 
|  | 14 | ; CHECK:      Context: | 
|  | 15 | ; CHECK:        [N] -> {  : N <= 2147483647 and N >= -2147483648 } | 
|  | 16 | ; CHECK:      Boundary Context: | 
|  | 17 | ; CHECK:        [N] -> {  : N <= 2147483618 } | 
|  | 18 | ; | 
|  | 19 | target datalayout = "e-m:e-i32:64-f80:128-n8:16:32:64-S128" | 
|  | 20 |  | 
|  | 21 | define void @wrap(i32* %A, i32 %N, i32 %p) { | 
|  | 22 | bb: | 
|  | 23 | br label %bb2 | 
|  | 24 |  | 
|  | 25 | bb2:                                              ; preds = %bb7, %bb | 
|  | 26 | %indvars.iv = phi i32 [ %indvars.iv.next, %bb7 ], [ 0, %bb ] | 
|  | 27 | %tmp3 = icmp slt i32 %indvars.iv, %N | 
|  | 28 | br i1 %tmp3, label %bb4, label %bb8 | 
|  | 29 |  | 
|  | 30 | bb4:                                              ; preds = %bb2 | 
|  | 31 | %tmp5 = add i32 %indvars.iv, 30 | 
|  | 32 | %tmp6 = getelementptr i32, i32* %A, i32 %tmp5 | 
|  | 33 | store i32 0, i32* %tmp6, align 4 | 
|  | 34 | br label %bb7 | 
|  | 35 |  | 
|  | 36 | bb7:                                              ; preds = %bb4 | 
|  | 37 | %indvars.iv.next = add nuw nsw i32 %indvars.iv, 1 | 
|  | 38 | br label %bb2 | 
|  | 39 |  | 
|  | 40 | bb8:                                              ; preds = %bb2 | 
|  | 41 | ret void | 
|  | 42 | } |