Files
clang-p2996/llvm/test/CodeGen/AArch64/combine-andintoload.ll
Harvin Iriawan db158c7c83 [AArch64] Update generic sched model to A510
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
2023-08-21 12:25:15 +01:00

457 lines
12 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=aarch64 -o - | FileCheck %s
; RUN: llc < %s -mtriple=aarch64_be -o - | FileCheck %s --check-prefix=CHECKBE
define i64 @load32_and16_and(ptr %p, i64 %y) {
; CHECK-LABEL: load32_and16_and:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_and:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%ym = and i64 %y, 65535
%r = and i64 %ym, %xz
ret i64 %r
}
define i64 @load32_and16_andr(ptr %p, i64 %y) {
; CHECK-LABEL: load32_and16_andr:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_andr:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%a = and i64 %y, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load32_and16_and_sext(ptr %p, i64 %y) {
; CHECK-LABEL: load32_and16_and_sext:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_and_sext:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = sext i32 %x to i64
%a = and i64 %y, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load32_and16_or(ptr %p, i64 %y) {
; CHECK-LABEL: load32_and16_or:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: orr w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_or:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: orr w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%a = or i64 %y, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load32_and16_orr(ptr %p, i64 %y) {
; CHECK-LABEL: load32_and16_orr:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: and x9, x1, #0xffff
; CHECK-NEXT: orr x0, x9, x8
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_orr:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: and x9, x1, #0xffff
; CHECKBE-NEXT: orr x0, x9, x8
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%ym = and i64 %y, 65535
%r = or i64 %ym, %xz
ret i64 %r
}
define i64 @load32_and16_xorm1(ptr %p) {
; CHECK-LABEL: load32_and16_xorm1:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: mvn w8, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_xorm1:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: mvn w8, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%a = xor i64 %xz, -1
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load64_and16(ptr %p, i128 %y) {
; CHECK-LABEL: load64_and16:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: and x0, x2, x8
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load64_and16:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0, #6]
; CHECKBE-NEXT: and x0, x3, x8
; CHECKBE-NEXT: ret
%x = load i64, ptr %p, align 4
%xz = zext i64 %x to i128
%a = and i128 %y, %xz
%t = trunc i128 %a to i64
%r = and i64 %t, 65535
ret i64 %r
}
define i64 @load16_and16(ptr %p, i64 %y) {
; CHECK-LABEL: load16_and16:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: and x0, x1, x8
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load16_and16:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0]
; CHECKBE-NEXT: and x0, x1, x8
; CHECKBE-NEXT: ret
%x = load i16, ptr %p, align 4
%xz = zext i16 %x to i64
%a = and i64 %y, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load16_and8(ptr %p, i64 %y) {
; CHECK-LABEL: load16_and8:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load16_and8:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xff
; CHECKBE-NEXT: ret
%x = load i16, ptr %p, align 4
%xz = zext i16 %x to i64
%a = and i64 %y, %xz
%r = and i64 %a, 255
ret i64 %r
}
define i64 @load16_and7(ptr %p, i64 %y) {
; CHECK-LABEL: load16_and7:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0x7f
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load16_and7:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0x7f
; CHECKBE-NEXT: ret
%x = load i16, ptr %p, align 4
%xz = zext i16 %x to i64
%a = and i64 %y, %xz
%r = and i64 %a, 127
ret i64 %r
}
define i64 @load8_and16(ptr %p, i64 %y) {
; CHECK-LABEL: load8_and16:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrb w8, [x0]
; CHECK-NEXT: and x0, x1, x8
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load8_and16:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrb w8, [x0]
; CHECKBE-NEXT: and x0, x1, x8
; CHECKBE-NEXT: ret
%x = load i8, ptr %p, align 4
%xz = zext i8 %x to i64
%a = and i64 %y, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load8_and16_zext(ptr %p, i8 %y) {
; CHECK-LABEL: load8_and16_zext:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrb w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load8_and16_zext:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrb w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xff
; CHECKBE-NEXT: ret
%x = load i8, ptr %p, align 4
%xz = zext i8 %x to i64
%yz = zext i8 %y to i64
%a = and i64 %yz, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load8_and16_sext(ptr %p, i8 %y) {
; CHECK-LABEL: load8_and16_sext:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrb w8, [x0]
; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
; CHECK-NEXT: and x0, x1, x8
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load8_and16_sext:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrb w8, [x0]
; CHECKBE-NEXT: // kill: def $w1 killed $w1 def $x1
; CHECKBE-NEXT: and x0, x1, x8
; CHECKBE-NEXT: ret
%x = load i8, ptr %p, align 4
%xz = zext i8 %x to i64
%yz = sext i8 %y to i64
%a = and i64 %yz, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load8_and16_or(ptr %p, i64 %y) {
; CHECK-LABEL: load8_and16_or:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrb w8, [x0]
; CHECK-NEXT: orr w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load8_and16_or:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrb w8, [x0]
; CHECKBE-NEXT: orr w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i8, ptr %p, align 4
%xz = zext i8 %x to i64
%a = or i64 %y, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load16_and8_manyext(ptr %p, i32 %y) {
; CHECK-LABEL: load16_and8_manyext:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: and w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load16_and8_manyext:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0]
; CHECKBE-NEXT: and w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xff
; CHECKBE-NEXT: ret
%x = load i16, ptr %p, align 4
%xz = zext i16 %x to i32
%a = and i32 %y, %xz
%az = zext i32 %a to i64
%r = and i64 %az, 255
ret i64 %r
}
define i64 @multiple_load(ptr %p, ptr %q) {
; CHECK-LABEL: multiple_load:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: ldr w9, [x1]
; CHECK-NEXT: and w8, w9, w8
; CHECK-NEXT: and x0, x8, #0xff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: multiple_load:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0]
; CHECKBE-NEXT: ldr w9, [x1]
; CHECKBE-NEXT: and w8, w9, w8
; CHECKBE-NEXT: and x0, x8, #0xff
; CHECKBE-NEXT: ret
%x = load i16, ptr %p, align 4
%xz = zext i16 %x to i64
%y = load i32, ptr %q, align 4
%yz = zext i32 %y to i64
%a = and i64 %yz, %xz
%r = and i64 %a, 255
ret i64 %r
}
define i64 @multiple_load_or(ptr %p, ptr %q) {
; CHECK-LABEL: multiple_load_or:
; CHECK: // %bb.0:
; CHECK-NEXT: ldrh w8, [x0]
; CHECK-NEXT: ldr w9, [x1]
; CHECK-NEXT: orr w8, w9, w8
; CHECK-NEXT: and x0, x8, #0xff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: multiple_load_or:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldrh w8, [x0]
; CHECKBE-NEXT: ldr w9, [x1]
; CHECKBE-NEXT: orr w8, w9, w8
; CHECKBE-NEXT: and x0, x8, #0xff
; CHECKBE-NEXT: ret
%x = load i16, ptr %p, align 4
%xz = zext i16 %x to i64
%y = load i32, ptr %q, align 4
%yz = zext i32 %y to i64
%a = or i64 %yz, %xz
%r = and i64 %a, 255
ret i64 %r
}
define i64 @load32_and16_zexty(ptr %p, i32 %y) {
; CHECK-LABEL: load32_and16_zexty:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: orr w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_zexty:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: orr w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%yz = zext i32 %y to i64
%a = or i64 %yz, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define i64 @load32_and16_sexty(ptr %p, i32 %y) {
; CHECK-LABEL: load32_and16_sexty:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr w8, [x0]
; CHECK-NEXT: orr w8, w1, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: load32_and16_sexty:
; CHECKBE: // %bb.0:
; CHECKBE-NEXT: ldr w8, [x0]
; CHECKBE-NEXT: orr w8, w1, w8
; CHECKBE-NEXT: and x0, x8, #0xffff
; CHECKBE-NEXT: ret
%x = load i32, ptr %p, align 4
%xz = zext i32 %x to i64
%yz = sext i32 %y to i64
%a = or i64 %yz, %xz
%r = and i64 %a, 65535
ret i64 %r
}
define zeroext i1 @bigger(ptr nocapture readonly %c, ptr nocapture readonly %e, i64 %d, i64 %p1) {
; CHECK-LABEL: bigger:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: ldrb w8, [x1, x2]
; CHECK-NEXT: ldrb w9, [x0, x2]
; CHECK-NEXT: and w10, w3, #0x7
; CHECK-NEXT: mov w11, #8 // =0x8
; CHECK-NEXT: sub w10, w11, w10
; CHECK-NEXT: eor w8, w8, w9
; CHECK-NEXT: mov w9, #5 // =0x5
; CHECK-NEXT: lsr w8, w8, w10
; CHECK-NEXT: tst w8, w9
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
;
; CHECKBE-LABEL: bigger:
; CHECKBE: // %bb.0: // %entry
; CHECKBE-NEXT: ldrb w8, [x1, x2]
; CHECKBE-NEXT: ldrb w9, [x0, x2]
; CHECKBE-NEXT: and w10, w3, #0x7
; CHECKBE-NEXT: mov w11, #8 // =0x8
; CHECKBE-NEXT: sub w10, w11, w10
; CHECKBE-NEXT: eor w8, w8, w9
; CHECKBE-NEXT: mov w9, #5 // =0x5
; CHECKBE-NEXT: lsr w8, w8, w10
; CHECKBE-NEXT: tst w8, w9
; CHECKBE-NEXT: cset w0, eq
; CHECKBE-NEXT: ret
entry:
%0 = trunc i64 %p1 to i16
%1 = and i16 %0, 7
%sh_prom = sub nuw nsw i16 8, %1
%shl = shl nuw nsw i16 5, %sh_prom
%arrayidx = getelementptr inbounds i8, ptr %c, i64 %d
%2 = load i8, ptr %arrayidx, align 1
%3 = and i16 %shl, 255
%conv2 = zext i16 %3 to i32
%arrayidx3 = getelementptr inbounds i8, ptr %e, i64 %d
%4 = load i8, ptr %arrayidx3, align 1
%5 = xor i8 %4, %2
%6 = zext i8 %5 to i32
%7 = and i32 %6, %conv2
%cmp.not = icmp eq i32 %7, 0
ret i1 %cmp.not
}