Update Polly tests to handle explicitly typed gep changes in LLVM
[polly-mirror.git] / test / Isl / CodeGen / loop_with_condition_ineq.ll
blob971c58b0afc553b1cc52a7fba0f594b53473da3e
1 ; RUN: opt %loadPolly -polly-detect-unprofitable -polly-no-early-exit -basicaa -polly-ast -analyze < %s | FileCheck %s
3 ;#include <string.h>
4 ;#define N 1024
5 ;int A[N];
6 ;int B[N];
8 ;void loop_with_condition_ineq() {
9 ;  int i;
11 ;  __sync_synchronize();
12 ;  for (i = 0; i < N; i++) {
13 ;    if (i != N / 2)
14 ;      A[i] = 1;
15 ;    else
16 ;      A[i] = 2;
17 ;    B[i] = 3;
18 ;  }
19 ;  __sync_synchronize();
22 ;int main () {
23 ;  int i;
25 ;  memset(A, 0, sizeof(int) * N);
26 ;  memset(B, 0, sizeof(int) * N);
28 ;  loop_with_condition_ineq();
30 ;  for (i = 0; i < N; i++)
31 ;    if (B[i] != 3)
32 ;      return 1;
34 ;  for (i = 0; i < N; i++)
35 ;    if (i != N / 2 && A[i] != 1)
36 ;      return 1;
37 ;    else if (i == N && A[i] != 2)
38 ;      return 1;
39 ;  return 0;
42 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
43 target triple = "x86_64-pc-linux-gnu"
45 @A = common global [1024 x i32] zeroinitializer, align 16 ; <[1024 x i32]*> [#uses=4]
46 @B = common global [1024 x i32] zeroinitializer, align 16 ; <[1024 x i32]*> [#uses=4]
48 define void @loop_with_condition_ineq() nounwind {
49 ; <label>:0
50   fence seq_cst
51   br label %1
53 ; <label>:1                                       ; preds = %7, %0
54   %indvar = phi i64 [ %indvar.next, %7 ], [ 0, %0 ] ; <i64> [#uses=5]
55   %scevgep = getelementptr [1024 x i32], [1024 x i32]* @A, i64 0, i64 %indvar ; <i32*> [#uses=2]
56   %scevgep1 = getelementptr [1024 x i32], [1024 x i32]* @B, i64 0, i64 %indvar ; <i32*> [#uses=1]
57   %i.0 = trunc i64 %indvar to i32                 ; <i32> [#uses=1]
58   %exitcond = icmp ne i64 %indvar, 1024           ; <i1> [#uses=1]
59   br i1 %exitcond, label %2, label %8
61 ; <label>:2                                       ; preds = %1
62   %3 = icmp ne i32 %i.0, 512                      ; <i1> [#uses=1]
63   br i1 %3, label %4, label %5
65 ; <label>:4                                       ; preds = %2
66   store i32 1, i32* %scevgep
67   br label %6
69 ; <label>:5                                       ; preds = %2
70   store i32 2, i32* %scevgep
71   br label %6
73 ; <label>:6                                       ; preds = %5, %4
74   store i32 3, i32* %scevgep1
75   br label %7
77 ; <label>:7                                       ; preds = %6
78   %indvar.next = add i64 %indvar, 1               ; <i64> [#uses=1]
79   br label %1
81 ; <label>:8                                       ; preds = %1
82   fence seq_cst
83   ret void
86 define i32 @main() nounwind {
87 ; <label>:0
88   call void @llvm.memset.p0i8.i64(i8* bitcast ([1024 x i32]* @A to i8*), i8 0, i64 4096, i32 1, i1 false)
89   call void @llvm.memset.p0i8.i64(i8* bitcast ([1024 x i32]* @B to i8*), i8 0, i64 4096, i32 1, i1 false)
90   call void @loop_with_condition_ineq()
91   br label %1
93 ; <label>:1                                       ; preds = %8, %0
94   %indvar1 = phi i64 [ %indvar.next2, %8 ], [ 0, %0 ] ; <i64> [#uses=3]
95   %scevgep3 = getelementptr [1024 x i32], [1024 x i32]* @B, i64 0, i64 %indvar1 ; <i32*> [#uses=1]
96   %i.0 = trunc i64 %indvar1 to i32                ; <i32> [#uses=1]
97   %2 = icmp slt i32 %i.0, 1024                    ; <i1> [#uses=1]
98   br i1 %2, label %3, label %9
100 ; <label>:3                                       ; preds = %1
101   %4 = load i32* %scevgep3                        ; <i32> [#uses=1]
102   %5 = icmp ne i32 %4, 3                          ; <i1> [#uses=1]
103   br i1 %5, label %6, label %7
105 ; <label>:6                                       ; preds = %3
106   br label %28
108 ; <label>:7                                       ; preds = %3
109   br label %8
111 ; <label>:8                                       ; preds = %7
112   %indvar.next2 = add i64 %indvar1, 1             ; <i64> [#uses=1]
113   br label %1
115 ; <label>:9                                       ; preds = %1
116   br label %10
118 ; <label>:10                                      ; preds = %26, %9
119   %indvar = phi i64 [ %indvar.next, %26 ], [ 0, %9 ] ; <i64> [#uses=3]
120   %scevgep = getelementptr [1024 x i32], [1024 x i32]* @A, i64 0, i64 %indvar ; <i32*> [#uses=2]
121   %i.1 = trunc i64 %indvar to i32                 ; <i32> [#uses=3]
122   %11 = icmp slt i32 %i.1, 1024                   ; <i1> [#uses=1]
123   br i1 %11, label %12, label %27
125 ; <label>:12                                      ; preds = %10
126   %13 = icmp ne i32 %i.1, 512                     ; <i1> [#uses=1]
127   br i1 %13, label %14, label %18
129 ; <label>:14                                      ; preds = %12
130   %15 = load i32* %scevgep                        ; <i32> [#uses=1]
131   %16 = icmp ne i32 %15, 1                        ; <i1> [#uses=1]
132   br i1 %16, label %17, label %18
134 ; <label>:17                                      ; preds = %14
135   br label %28
137 ; <label>:18                                      ; preds = %14, %12
138   %19 = icmp eq i32 %i.1, 1024                    ; <i1> [#uses=1]
139   br i1 %19, label %20, label %24
141 ; <label>:20                                      ; preds = %18
142   %21 = load i32* %scevgep                        ; <i32> [#uses=1]
143   %22 = icmp ne i32 %21, 2                        ; <i1> [#uses=1]
144   br i1 %22, label %23, label %24
146 ; <label>:23                                      ; preds = %20
147   br label %28
149 ; <label>:24                                      ; preds = %20, %18
150   br label %25
152 ; <label>:25                                      ; preds = %24
153   br label %26
155 ; <label>:26                                      ; preds = %25
156   %indvar.next = add i64 %indvar, 1               ; <i64> [#uses=1]
157   br label %10
159 ; <label>:27                                      ; preds = %10
160   br label %28
162 ; <label>:28                                      ; preds = %27, %23, %17, %6
163   %.0 = phi i32 [ 1, %6 ], [ 1, %17 ], [ 1, %23 ], [ 0, %27 ] ; <i32> [#uses=1]
164   ret i32 %.0
167 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
169 ; CHECK: for (int c0 = 0; c0 <= 1023; c0 += 1) {
170 ; CHECK:   if (c0 >= 513) {
171 ; CHECK:     Stmt_4(c0);
172 ; CHECK:   } else if (c0 <= 511) {
173 ; CHECK:     Stmt_4(c0);
174 ; CHECK:   } else
175 ; CHECK:     Stmt_5(512);
176 ; CHECK:   Stmt_6(c0);
177 ; CHECK: }