Refresh of the generic scheduling model to use A510 instead of A55. Main benefits are to the little core, and introducing SVE scheduling information. Changes tested on various OoO cores, no performance degradation is seen. Differential Revision: https://reviews.llvm.org/D156799
78 lines
2.6 KiB
LLVM
78 lines
2.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple arm64-none-eabi -o - %s | FileCheck %s --check-prefixes=CHECK,SDISEL
|
|
; RUN: llc -mtriple arm64-none-eabi -global-isel -o - %s | FileCheck %s --check-prefixes=CHECK,GISEL
|
|
|
|
@out = internal global i32 0, align 4
|
|
|
|
; Ensure that we transform select(C0, x, select(C1, x, y)) towards
|
|
; select(C0 | C1, x, y) so we can use CMP;CCMP for the implementation.
|
|
define i32 @test0(i32 %v0, i32 %v1, i32 %v2) {
|
|
; SDISEL-LABEL: test0:
|
|
; SDISEL: // %bb.0:
|
|
; SDISEL-NEXT: cmp w0, #7
|
|
; SDISEL-NEXT: ccmp w1, #0, #0, ne
|
|
; SDISEL-NEXT: csel w0, w1, w2, gt
|
|
; SDISEL-NEXT: ret
|
|
;
|
|
; GISEL-LABEL: test0:
|
|
; GISEL: // %bb.0:
|
|
; GISEL-NEXT: cmp w0, #7
|
|
; GISEL-NEXT: csel w8, w1, w2, eq
|
|
; GISEL-NEXT: cmp w1, #0
|
|
; GISEL-NEXT: csel w0, w1, w8, gt
|
|
; GISEL-NEXT: ret
|
|
%cmp1 = icmp eq i32 %v0, 7
|
|
%cmp2 = icmp sgt i32 %v1, 0
|
|
%sel0 = select i1 %cmp1, i32 %v1, i32 %v2
|
|
%sel1 = select i1 %cmp2, i32 %v1, i32 %sel0
|
|
ret i32 %sel1
|
|
}
|
|
|
|
; Usually we keep select(C0 | C1, x, y) as is on aarch64 to create CMP;CCMP
|
|
; sequences. This case should be transformed to select(C0, select(C1, x, y), y)
|
|
; anyway to get CSE effects.
|
|
define void @test1(i32 %bitset, i32 %val0, i32 %val1) {
|
|
; SDISEL-LABEL: test1:
|
|
; SDISEL: // %bb.0:
|
|
; SDISEL-NEXT: cmp w0, #7
|
|
; SDISEL-NEXT: adrp x9, out
|
|
; SDISEL-NEXT: csel w8, w1, w2, eq
|
|
; SDISEL-NEXT: cmp w8, #13
|
|
; SDISEL-NEXT: csel w8, w1, w2, lo
|
|
; SDISEL-NEXT: cmp w0, #42
|
|
; SDISEL-NEXT: csel w10, w1, w8, eq
|
|
; SDISEL-NEXT: str w8, [x9, :lo12:out]
|
|
; SDISEL-NEXT: str w10, [x9, :lo12:out]
|
|
; SDISEL-NEXT: ret
|
|
;
|
|
; GISEL-LABEL: test1:
|
|
; GISEL: // %bb.0:
|
|
; GISEL-NEXT: cmp w0, #7
|
|
; GISEL-NEXT: csel w8, w1, w2, eq
|
|
; GISEL-NEXT: cmp w8, #13
|
|
; GISEL-NEXT: cset w8, lo
|
|
; GISEL-NEXT: tst w8, #0x1
|
|
; GISEL-NEXT: csel w9, w1, w2, ne
|
|
; GISEL-NEXT: cmp w0, #42
|
|
; GISEL-NEXT: cset w10, eq
|
|
; GISEL-NEXT: orr w8, w10, w8
|
|
; GISEL-NEXT: tst w8, #0x1
|
|
; GISEL-NEXT: adrp x8, out
|
|
; GISEL-NEXT: csel w10, w1, w2, ne
|
|
; GISEL-NEXT: str w9, [x8, :lo12:out]
|
|
; GISEL-NEXT: str w10, [x8, :lo12:out]
|
|
; GISEL-NEXT: ret
|
|
%cmp1 = icmp eq i32 %bitset, 7
|
|
%cond = select i1 %cmp1, i32 %val0, i32 %val1
|
|
%cmp5 = icmp ult i32 %cond, 13
|
|
%cond11 = select i1 %cmp5, i32 %val0, i32 %val1
|
|
%cmp3 = icmp eq i32 %bitset, 42
|
|
%or.cond = or i1 %cmp3, %cmp5
|
|
%cond17 = select i1 %or.cond, i32 %val0, i32 %val1
|
|
store volatile i32 %cond11, ptr @out, align 4
|
|
store volatile i32 %cond17, ptr @out, align 4
|
|
ret void
|
|
}
|
|
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
|
; CHECK: {{.*}}
|