@@ -257,3 +257,55 @@ exit:
257
257
failure:
258
258
unreachable
259
259
}
260
+
261
+ ; Here Cmp does not dominate latch.
262
+ define i32 @test_05_neg (i32* %p , i64 %len , i32 %x , i1 %cond ) {
263
+ ; CHECK-LABEL: @test_05_neg(
264
+ ; CHECK-NEXT: entry:
265
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
266
+ ; CHECK: loop:
267
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ]
268
+ ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], -1
269
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[BACKEDGE]]
270
+ ; CHECK: if.true:
271
+ ; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], 0
272
+ ; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]]
273
+ ; CHECK: backedge:
274
+ ; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV]], 4
275
+ ; CHECK-NEXT: [[TMP0:%.*]] = bitcast i32* [[P:%.*]] to i8*
276
+ ; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, i8* [[TMP0]], i64 [[SUNKADDR]]
277
+ ; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, i8* [[SUNKADDR1]], i64 -4
278
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[SUNKADDR2]] to i32*
279
+ ; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, i32* [[TMP1]] unordered, align 4
280
+ ; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]]
281
+ ; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]]
282
+ ; CHECK: exit:
283
+ ; CHECK-NEXT: ret i32 -1
284
+ ; CHECK: failure:
285
+ ; CHECK-NEXT: unreachable
286
+ ;
287
+ entry:
288
+ %scevgep = getelementptr i32 , i32* %p , i64 -1
289
+ br label %loop
290
+
291
+ loop: ; preds = %backedge, %entry
292
+ %iv = phi i64 [ %iv.next , %backedge ], [ %len , %entry ]
293
+ %iv.next = add i64 %iv , -1
294
+ br i1 %cond , label %if.true , label %backedge
295
+
296
+ if.true:
297
+ %cond_1 = icmp eq i64 %iv , 0
298
+ br i1 %cond_1 , label %exit , label %backedge
299
+
300
+ backedge: ; preds = %loop
301
+ %scevgep1 = getelementptr i32 , i32* %scevgep , i64 %iv
302
+ %loaded = load atomic i32 , i32* %scevgep1 unordered , align 4
303
+ %cond_2 = icmp eq i32 %loaded , %x
304
+ br i1 %cond_2 , label %failure , label %loop
305
+
306
+ exit: ; preds = %loop
307
+ ret i32 -1
308
+
309
+ failure: ; preds = %backedge
310
+ unreachable
311
+ }
0 commit comments