1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s 2 3 ; ModuleID = 'WeakCrossingSIV.bc' 4 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-S128" 5 target triple = "x86_64-apple-macosx10.6.0" 6 7 8 ;; for (long unsigned i = 0; i < n; i++) { 9 ;; A[1 + n*i] = i; 10 ;; *B++ = A[1 - n*i]; 11 12 define void @weakcrossing0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 13 entry: 14 %cmp1 = icmp eq i64 %n, 0 15 br i1 %cmp1, label %for.end, label %for.body.preheader 16 17 for.body.preheader: ; preds = %entry 18 br label %for.body 19 20 ; CHECK: da analyze - none! 21 ; CHECK: da analyze - flow [0|<]! 22 ; CHECK: da analyze - confused! 23 ; CHECK: da analyze - none! 24 ; CHECK: da analyze - confused! 25 ; CHECK: da analyze - none! 26 27 for.body: ; preds = %for.body.preheader, %for.body 28 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 29 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 30 %conv = trunc i64 %i.03 to i32 31 %mul = mul i64 %i.03, %n 32 %add = add i64 %mul, 1 33 %arrayidx = getelementptr inbounds i32* %A, i64 %add 34 store i32 %conv, i32* %arrayidx, align 4 35 %mul1 = mul i64 %i.03, %n 36 %sub = sub i64 1, %mul1 37 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub 38 %0 = load i32* %arrayidx2, align 4 39 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 40 store i32 %0, i32* %B.addr.02, align 4 41 %inc = add i64 %i.03, 1 42 %exitcond = icmp ne i64 %inc, %n 43 br i1 %exitcond, label %for.body, label %for.end.loopexit 44 45 for.end.loopexit: ; preds = %for.body 46 br label %for.end 47 48 for.end: ; preds = %for.end.loopexit, %entry 49 ret void 50 } 51 52 53 ;; for (long unsigned i = 0; i < n; i++) { 54 ;; A[n + i] = i; 55 ;; *B++ = A[1 + n - i]; 56 57 define void @weakcrossing1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 58 entry: 59 %cmp1 = icmp eq i64 %n, 0 60 br i1 %cmp1, label %for.end, label %for.body.preheader 61 62 ; CHECK: da analyze - none! 63 ; CHECK: da analyze - flow [<>] splitable! 64 ; CHECK: da analyze - split level = 1, iteration = 0! 65 ; CHECK: da analyze - confused! 66 ; CHECK: da analyze - none! 67 ; CHECK: da analyze - confused! 68 ; CHECK: da analyze - none! 69 70 for.body.preheader: ; preds = %entry 71 br label %for.body 72 73 for.body: ; preds = %for.body.preheader, %for.body 74 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 75 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 76 %conv = trunc i64 %i.03 to i32 77 %add = add i64 %i.03, %n 78 %arrayidx = getelementptr inbounds i32* %A, i64 %add 79 store i32 %conv, i32* %arrayidx, align 4 80 %add1 = add i64 %n, 1 81 %sub = sub i64 %add1, %i.03 82 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub 83 %0 = load i32* %arrayidx2, align 4 84 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 85 store i32 %0, i32* %B.addr.02, align 4 86 %inc = add i64 %i.03, 1 87 %exitcond = icmp ne i64 %inc, %n 88 br i1 %exitcond, label %for.body, label %for.end.loopexit 89 90 for.end.loopexit: ; preds = %for.body 91 br label %for.end 92 93 for.end: ; preds = %for.end.loopexit, %entry 94 ret void 95 } 96 97 98 ;; for (long unsigned i = 0; i < 3; i++) { 99 ;; A[i] = i; 100 ;; *B++ = A[6 - i]; 101 102 define void @weakcrossing2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 103 entry: 104 br label %for.body 105 106 ; CHECK: da analyze - none! 107 ; CHECK: da analyze - none! 108 ; CHECK: da analyze - confused! 109 ; CHECK: da analyze - none! 110 ; CHECK: da analyze - confused! 111 ; CHECK: da analyze - none! 112 113 for.body: ; preds = %entry, %for.body 114 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 115 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 116 %conv = trunc i64 %i.02 to i32 117 %arrayidx = getelementptr inbounds i32* %A, i64 %i.02 118 store i32 %conv, i32* %arrayidx, align 4 119 %sub = sub i64 6, %i.02 120 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub 121 %0 = load i32* %arrayidx1, align 4 122 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 123 store i32 %0, i32* %B.addr.01, align 4 124 %inc = add i64 %i.02, 1 125 %exitcond = icmp ne i64 %inc, 3 126 br i1 %exitcond, label %for.body, label %for.end 127 128 for.end: ; preds = %for.body 129 ret void 130 } 131 132 133 ;; for (long unsigned i = 0; i < 4; i++) { 134 ;; A[i] = i; 135 ;; *B++ = A[6 - i]; 136 137 define void @weakcrossing3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 138 entry: 139 br label %for.body 140 141 ; CHECK: da analyze - none! 142 ; CHECK: da analyze - flow [0|<]! 143 ; CHECK: da analyze - confused! 144 ; CHECK: da analyze - none! 145 ; CHECK: da analyze - confused! 146 ; CHECK: da analyze - none! 147 148 for.body: ; preds = %entry, %for.body 149 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 150 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 151 %conv = trunc i64 %i.02 to i32 152 %arrayidx = getelementptr inbounds i32* %A, i64 %i.02 153 store i32 %conv, i32* %arrayidx, align 4 154 %sub = sub i64 6, %i.02 155 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub 156 %0 = load i32* %arrayidx1, align 4 157 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 158 store i32 %0, i32* %B.addr.01, align 4 159 %inc = add i64 %i.02, 1 160 %exitcond = icmp ne i64 %inc, 4 161 br i1 %exitcond, label %for.body, label %for.end 162 163 for.end: ; preds = %for.body 164 ret void 165 } 166 167 168 ;; for (long unsigned i = 0; i < 10; i++) { 169 ;; A[i] = i; 170 ;; *B++ = A[-6 - i]; 171 172 define void @weakcrossing4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 173 entry: 174 br label %for.body 175 176 ; CHECK: da analyze - none! 177 ; CHECK: da analyze - none! 178 ; CHECK: da analyze - confused! 179 ; CHECK: da analyze - none! 180 ; CHECK: da analyze - confused! 181 ; CHECK: da analyze - none! 182 183 for.body: ; preds = %entry, %for.body 184 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 185 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 186 %conv = trunc i64 %i.02 to i32 187 %arrayidx = getelementptr inbounds i32* %A, i64 %i.02 188 store i32 %conv, i32* %arrayidx, align 4 189 %sub = sub i64 -6, %i.02 190 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub 191 %0 = load i32* %arrayidx1, align 4 192 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 193 store i32 %0, i32* %B.addr.01, align 4 194 %inc = add i64 %i.02, 1 195 %exitcond = icmp ne i64 %inc, 10 196 br i1 %exitcond, label %for.body, label %for.end 197 198 for.end: ; preds = %for.body 199 ret void 200 } 201 202 203 ;; for (long unsigned i = 0; i < n; i++) { 204 ;; A[3*i] = i; 205 ;; *B++ = A[5 - 3*i]; 206 207 define void @weakcrossing5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 208 entry: 209 %cmp1 = icmp eq i64 %n, 0 210 br i1 %cmp1, label %for.end, label %for.body.preheader 211 212 ; CHECK: da analyze - none! 213 ; CHECK: da analyze - none! 214 ; CHECK: da analyze - confused! 215 ; CHECK: da analyze - none! 216 ; CHECK: da analyze - confused! 217 ; CHECK: da analyze - none! 218 219 for.body.preheader: ; preds = %entry 220 br label %for.body 221 222 for.body: ; preds = %for.body.preheader, %for.body 223 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 224 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 225 %conv = trunc i64 %i.03 to i32 226 %mul = mul i64 %i.03, 3 227 %arrayidx = getelementptr inbounds i32* %A, i64 %mul 228 store i32 %conv, i32* %arrayidx, align 4 229 %0 = mul i64 %i.03, -3 230 %sub = add i64 %0, 5 231 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub 232 %1 = load i32* %arrayidx2, align 4 233 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 234 store i32 %1, i32* %B.addr.02, align 4 235 %inc = add i64 %i.03, 1 236 %exitcond = icmp ne i64 %inc, %n 237 br i1 %exitcond, label %for.body, label %for.end.loopexit 238 239 for.end.loopexit: ; preds = %for.body 240 br label %for.end 241 242 for.end: ; preds = %for.end.loopexit, %entry 243 ret void 244 } 245 246 247 ;; for (long unsigned i = 0; i < 4; i++) { 248 ;; A[i] = i; 249 ;; *B++ = A[5 - i]; 250 251 define void @weakcrossing6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 252 entry: 253 br label %for.body 254 255 ; CHECK: da analyze - none! 256 ; CHECK: da analyze - flow [<>] splitable! 257 ; CHECK: da analyze - split level = 1, iteration = 2! 258 ; CHECK: da analyze - confused! 259 ; CHECK: da analyze - none! 260 ; CHECK: da analyze - confused! 261 ; CHECK: da analyze - none! 262 263 for.body: ; preds = %entry, %for.body 264 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 265 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 266 %conv = trunc i64 %i.02 to i32 267 %arrayidx = getelementptr inbounds i32* %A, i64 %i.02 268 store i32 %conv, i32* %arrayidx, align 4 269 %sub = sub i64 5, %i.02 270 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub 271 %0 = load i32* %arrayidx1, align 4 272 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 273 store i32 %0, i32* %B.addr.01, align 4 274 %inc = add i64 %i.02, 1 275 %exitcond = icmp ne i64 %inc, 4 276 br i1 %exitcond, label %for.body, label %for.end 277 278 for.end: ; preds = %for.body 279 ret void 280 } 281