This patch enables the case where we do not completely eliminate offset. Supposedly in this case we reduce live range overlap that never harms, but since there are doubts this is true, this goes as a separate change. Differential Revision: https://reviews.llvm.org/D96399 Reviewed By: reames
220 lines
7.0 KiB
LLVM
220 lines
7.0 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-apple-macosx | FileCheck %s
|
|
|
|
define i32 @test_01(i32* %p, i64 %len, i32 %x) {
|
|
; CHECK-LABEL: test_01:
|
|
; CHECK: ## %bb.0: ## %entry
|
|
; CHECK-NEXT: .p2align 4, 0x90
|
|
; CHECK-NEXT: LBB0_1: ## %loop
|
|
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: subq $1, %rsi
|
|
; CHECK-NEXT: jb LBB0_4
|
|
; CHECK-NEXT: ## %bb.2: ## %backedge
|
|
; CHECK-NEXT: ## in Loop: Header=BB0_1 Depth=1
|
|
; CHECK-NEXT: cmpl %edx, (%rdi,%rsi,4)
|
|
; CHECK-NEXT: jne LBB0_1
|
|
; CHECK-NEXT: ## %bb.3: ## %failure
|
|
; CHECK-NEXT: ud2
|
|
; CHECK-NEXT: LBB0_4: ## %exit
|
|
; CHECK-NEXT: movl $-1, %eax
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
br label %loop
|
|
|
|
loop: ; preds = %backedge, %entry
|
|
%iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ]
|
|
%iv.next = add nsw i64 %iv, -1
|
|
%cond_1 = icmp eq i64 %iv, 0
|
|
br i1 %cond_1, label %exit, label %backedge
|
|
|
|
backedge: ; preds = %loop
|
|
%addr = getelementptr inbounds i32, i32* %p, i64 %iv.next
|
|
%loaded = load atomic i32, i32* %addr unordered, align 4
|
|
%cond_2 = icmp eq i32 %loaded, %x
|
|
br i1 %cond_2, label %failure, label %loop
|
|
|
|
exit: ; preds = %loop
|
|
ret i32 -1
|
|
|
|
failure: ; preds = %backedge
|
|
unreachable
|
|
}
|
|
|
|
; Similar to test_01, but we use offsetted pointer as base.
|
|
define i32 @test_01a(i32* %p, i64 %len, i32 %x) {
|
|
; CHECK-LABEL: test_01a:
|
|
; CHECK: ## %bb.0: ## %entry
|
|
; CHECK-NEXT: .p2align 4, 0x90
|
|
; CHECK-NEXT: LBB1_1: ## %loop
|
|
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: subq $1, %rsi
|
|
; CHECK-NEXT: jb LBB1_4
|
|
; CHECK-NEXT: ## %bb.2: ## %backedge
|
|
; CHECK-NEXT: ## in Loop: Header=BB1_1 Depth=1
|
|
; CHECK-NEXT: cmpl %edx, -24(%rdi,%rsi,4)
|
|
; CHECK-NEXT: jne LBB1_1
|
|
; CHECK-NEXT: ## %bb.3: ## %failure
|
|
; CHECK-NEXT: ud2
|
|
; CHECK-NEXT: LBB1_4: ## %exit
|
|
; CHECK-NEXT: movl $-1, %eax
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
%base = getelementptr inbounds i32, i32* %p, i64 -6
|
|
br label %loop
|
|
|
|
loop: ; preds = %backedge, %entry
|
|
%iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ]
|
|
%iv.next = add nsw i64 %iv, -1
|
|
%cond_1 = icmp eq i64 %iv, 0
|
|
br i1 %cond_1, label %exit, label %backedge
|
|
|
|
backedge: ; preds = %loop
|
|
%addr = getelementptr inbounds i32, i32* %base, i64 %iv.next
|
|
%loaded = load atomic i32, i32* %addr unordered, align 4
|
|
%cond_2 = icmp eq i32 %loaded, %x
|
|
br i1 %cond_2, label %failure, label %loop
|
|
|
|
exit: ; preds = %loop
|
|
ret i32 -1
|
|
|
|
failure: ; preds = %backedge
|
|
unreachable
|
|
}
|
|
|
|
define i32 @test_02(i32* %p, i64 %len, i32 %x) {
|
|
; CHECK-LABEL: test_02:
|
|
; CHECK: ## %bb.0: ## %entry
|
|
; CHECK-NEXT: .p2align 4, 0x90
|
|
; CHECK-NEXT: LBB2_1: ## %loop
|
|
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: subq $1, %rsi
|
|
; CHECK-NEXT: jb LBB2_4
|
|
; CHECK-NEXT: ## %bb.2: ## %backedge
|
|
; CHECK-NEXT: ## in Loop: Header=BB2_1 Depth=1
|
|
; CHECK-NEXT: cmpl %edx, (%rdi,%rsi,4)
|
|
; CHECK-NEXT: jne LBB2_1
|
|
; CHECK-NEXT: ## %bb.3: ## %failure
|
|
; CHECK-NEXT: ud2
|
|
; CHECK-NEXT: LBB2_4: ## %exit
|
|
; CHECK-NEXT: movl $-1, %eax
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
%start = add i64 %len, -1
|
|
br label %loop
|
|
|
|
loop: ; preds = %backedge, %entry
|
|
%iv = phi i64 [ %iv.next, %backedge ], [ %start, %entry ]
|
|
%iv.next = add nsw i64 %iv, -1
|
|
%iv.offset = add i64 %iv, 1
|
|
%iv.next.offset = add i64 %iv.next, 1
|
|
%cond_1 = icmp eq i64 %iv.offset, 0
|
|
br i1 %cond_1, label %exit, label %backedge
|
|
|
|
backedge: ; preds = %loop
|
|
%addr = getelementptr inbounds i32, i32* %p, i64 %iv.next.offset
|
|
%loaded = load atomic i32, i32* %addr unordered, align 4
|
|
%cond_2 = icmp eq i32 %loaded, %x
|
|
br i1 %cond_2, label %failure, label %loop
|
|
|
|
exit: ; preds = %loop
|
|
ret i32 -1
|
|
|
|
failure: ; preds = %backedge
|
|
unreachable
|
|
}
|
|
|
|
define i32 @test_03(i32* %p, i64 %len, i32 %x) {
|
|
; CHECK-LABEL: test_03:
|
|
; CHECK: ## %bb.0: ## %entry
|
|
; CHECK-NEXT: .p2align 4, 0x90
|
|
; CHECK-NEXT: LBB3_1: ## %loop
|
|
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: subq $1, %rsi
|
|
; CHECK-NEXT: jb LBB3_4
|
|
; CHECK-NEXT: ## %bb.2: ## %backedge
|
|
; CHECK-NEXT: ## in Loop: Header=BB3_1 Depth=1
|
|
; CHECK-NEXT: cmpl %edx, (%rdi,%rsi,4)
|
|
; CHECK-NEXT: jne LBB3_1
|
|
; CHECK-NEXT: ## %bb.3: ## %failure
|
|
; CHECK-NEXT: ud2
|
|
; CHECK-NEXT: LBB3_4: ## %exit
|
|
; CHECK-NEXT: movl $-1, %eax
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
%start = add i64 %len, -100
|
|
br label %loop
|
|
|
|
loop: ; preds = %backedge, %entry
|
|
%iv = phi i64 [ %iv.next, %backedge ], [ %start, %entry ]
|
|
%iv.next = add nsw i64 %iv, -1
|
|
%iv.offset = add i64 %iv, 100
|
|
%iv.next.offset = add i64 %iv.next, 100
|
|
%cond_1 = icmp eq i64 %iv.offset, 0
|
|
br i1 %cond_1, label %exit, label %backedge
|
|
|
|
backedge: ; preds = %loop
|
|
%addr = getelementptr inbounds i32, i32* %p, i64 %iv.next.offset
|
|
%loaded = load atomic i32, i32* %addr unordered, align 4
|
|
%cond_2 = icmp eq i32 %loaded, %x
|
|
br i1 %cond_2, label %failure, label %loop
|
|
|
|
exit: ; preds = %loop
|
|
ret i32 -1
|
|
|
|
failure: ; preds = %backedge
|
|
unreachable
|
|
}
|
|
|
|
define void @test_04() {
|
|
; CHECK-LABEL: test_04:
|
|
; CHECK: ## %bb.0: ## %bb
|
|
; CHECK-NEXT: ud2
|
|
bb:
|
|
br label %bb1
|
|
|
|
bb1: ; preds = %bb10, %bb
|
|
%tmp = phi i64 [ 1, %bb ], [ %tmp2, %bb10 ]
|
|
%tmp2 = add nuw nsw i64 %tmp, 1
|
|
%tmp6 = bitcast i8 addrspace(1)* undef to i32 addrspace(1)*
|
|
br i1 undef, label %bb21, label %bb7
|
|
|
|
bb7: ; preds = %bb1
|
|
%tmp8 = add nsw i64 %tmp, -1
|
|
%tmp9 = getelementptr inbounds i32, i32 addrspace(1)* %tmp6, i64 %tmp8
|
|
store atomic i32 undef, i32 addrspace(1)* %tmp9 unordered, align 4
|
|
br label %bb11
|
|
|
|
bb10: ; preds = %bb16
|
|
br label %bb1
|
|
|
|
bb11: ; preds = %bb16, %bb7
|
|
switch i32 undef, label %bb19 [
|
|
i32 0, label %bb17
|
|
i32 1, label %bb16
|
|
i32 2, label %bb15
|
|
i32 3, label %bb14
|
|
i32 4, label %bb12
|
|
]
|
|
|
|
bb12: ; preds = %bb11
|
|
unreachable
|
|
|
|
bb14: ; preds = %bb11
|
|
unreachable
|
|
|
|
bb15: ; preds = %bb11
|
|
unreachable
|
|
|
|
bb16: ; preds = %bb11
|
|
br i1 undef, label %bb10, label %bb11
|
|
|
|
bb17: ; preds = %bb11
|
|
unreachable
|
|
|
|
bb19: ; preds = %bb11
|
|
unreachable
|
|
|
|
bb21: ; preds = %bb1
|
|
unreachable
|
|
}
|