Skip to content

Commit af1cccf

Browse files
committed
[Test] Add test that exposed failure on reverted patch in codegen
1 parent 81bc136 commit af1cccf

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

llvm/test/CodeGen/X86/usub_inc_iv.ll

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,55 @@ exit:
257257
failure:
258258
unreachable
259259
}
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

Comments
 (0)