From 34637bbe27d3971025cba02dfd4e52a46024f3d7 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Tue, 9 Mar 2021 11:39:10 -0800 Subject: [PATCH] [tests] precommit test for an upcoming change --- llvm/test/CodeGen/X86/usub_inc_iv.ll | 99 ++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/llvm/test/CodeGen/X86/usub_inc_iv.ll b/llvm/test/CodeGen/X86/usub_inc_iv.ll index a3097e9..da0fde1 100644 --- a/llvm/test/CodeGen/X86/usub_inc_iv.ll +++ b/llvm/test/CodeGen/X86/usub_inc_iv.ll @@ -306,3 +306,102 @@ exit: ; preds = %loop failure: ; preds = %backedge unreachable } + + +; test_01, but with an additional use of %iv.next outside the loop +define i32 @test_06(i32* %p, i64 %len, i32 %x) { +; CHECK-LABEL: @test_06( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], 0 +; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] +; CHECK: backedge: +; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV]], 4 +; CHECK-NEXT: [[TMP0:%.*]] = bitcast i32* [[P:%.*]] to i8* +; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, i8* [[TMP0]], i64 [[SUNKADDR]] +; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, i8* [[SUNKADDR1]], i64 -4 +; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[SUNKADDR2]] to i32* +; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, i32* [[TMP1]] unordered, align 4 +; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], -1 +; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] +; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] +; CHECK: exit: +; CHECK-NEXT: ret i32 -1 +; CHECK: failure: +; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[IV_NEXT]] to i32 +; CHECK-NEXT: ret i32 [[TRUNC]] +; +entry: + %scevgep = getelementptr i32, i32* %p, i64 -1 + br label %loop + +loop: ; preds = %backedge, %entry + %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ] + %cond_1 = icmp eq i64 %iv, 0 + br i1 %cond_1, label %exit, label %backedge + +backedge: ; preds = %loop + %scevgep1 = getelementptr i32, i32* %scevgep, i64 %iv + %loaded = load atomic i32, i32* %scevgep1 unordered, align 4 + %iv.next = add i64 %iv, -1 + %cond_2 = icmp eq i32 %loaded, %x + br i1 %cond_2, label %failure, label %loop + +exit: + ret i32 -1 + +failure: + %trunc = trunc i64 %iv.next to i32 + ret i32 %trunc +} + + +; Extra use outside loop which prevents us moving the increment to the cmp +define i32 @test_07_neg(i32* %p, i64 %len, i32 %x) { +; CHECK-LABEL: @test_07_neg( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], -1 +; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV_NEXT]], 4 +; CHECK-NEXT: [[TMP0:%.*]] = bitcast i32* [[P:%.*]] to i8* +; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, i8* [[TMP0]], i64 [[SUNKADDR]] +; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[SUNKADDR1]] to i32* +; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, i32* [[TMP1]] unordered, align 4 +; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] +; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[BACKEDGE]] +; CHECK: backedge: +; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], 0 +; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[LOOP]] +; CHECK: exit: +; CHECK-NEXT: ret i32 -1 +; CHECK: failure: +; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[IV_NEXT]] to i32 +; CHECK-NEXT: ret i32 [[TRUNC]] +; +entry: + %scevgep = getelementptr i32, i32* %p, i64 -1 + br label %loop + +loop: + %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ] + %iv.next = add i64 %iv, -1 + %scevgep1 = getelementptr i32, i32* %scevgep, i64 %iv + %loaded = load atomic i32, i32* %scevgep1 unordered, align 4 + %cond_2 = icmp eq i32 %loaded, %x + br i1 %cond_2, label %failure, label %backedge + +backedge: + %cond_1 = icmp eq i64 %iv, 0 + br i1 %cond_1, label %exit, label %loop + +exit: + ret i32 -1 + +failure: + %trunc = trunc i64 %iv.next to i32 + ret i32 %trunc +} -- 2.7.4