Files
clang-p2996/llvm/test/CodeGen/AArch64/andorbrcompare.ll
David Green fdce239ae9 [AArch64] Attempt to emitConjunction from brcond
We currently use emitConjunction to create CCMP conjunctions from the
conditions of selects, helping turning and/ors into more optimal ccmp
sequences that don't need to go through csels. This extends that to also
be used whilst lowering brcond, giving more opportunity for better
condition generation.

Differential Revision: https://reviews.llvm.org/D118650
2022-02-08 11:27:10 +00:00

245 lines
5.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=aarch64-none-none-eabi -verify-machineinstrs %s -o - | FileCheck %s
declare void @dummy()
define i32 @and_eq_ne_ult(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_eq_ne_ult:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #0, ne
; CHECK-NEXT: ccmp w4, w5, #0, ne
; CHECK-NEXT: b.hs .LBB0_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB0_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp eq i32 %s0, %s1
%c1 = icmp ne i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp ult i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_ne_ult_ule(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_ne_ult_ule:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #4, lo
; CHECK-NEXT: ccmp w4, w5, #0, eq
; CHECK-NEXT: b.hi .LBB1_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB1_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp ne i32 %s0, %s1
%c1 = icmp ult i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp ule i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_ult_ule_ugt(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_ult_ule_ugt:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #2, ls
; CHECK-NEXT: ccmp w4, w5, #2, hs
; CHECK-NEXT: b.ls .LBB2_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB2_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp ult i32 %s0, %s1
%c1 = icmp ule i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp ugt i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_ule_ugt_uge(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_ule_ugt_uge:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #2, hi
; CHECK-NEXT: ccmp w4, w5, #2, hi
; CHECK-NEXT: b.lo .LBB3_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB3_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp ule i32 %s0, %s1
%c1 = icmp ugt i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp uge i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_ugt_uge_slt(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_ugt_uge_slt:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #0, hs
; CHECK-NEXT: ccmp w4, w5, #8, ls
; CHECK-NEXT: b.ge .LBB4_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB4_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp ugt i32 %s0, %s1
%c1 = icmp uge i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp slt i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_uge_slt_sle(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_uge_slt_sle:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #0, lt
; CHECK-NEXT: ccmp w4, w5, #4, lo
; CHECK-NEXT: b.gt .LBB5_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB5_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp uge i32 %s0, %s1
%c1 = icmp slt i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp sle i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_slt_sle_sgt(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_slt_sle_sgt:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #0, le
; CHECK-NEXT: ccmp w4, w5, #0, ge
; CHECK-NEXT: b.le .LBB6_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB6_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp slt i32 %s0, %s1
%c1 = icmp sle i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp sgt i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}
define i32 @and_sle_sgt_sge(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, i32* %p) {
; CHECK-LABEL: and_sle_sgt_sge:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmp w2, w3
; CHECK-NEXT: ccmp w0, w1, #0, gt
; CHECK-NEXT: ccmp w4, w5, #0, gt
; CHECK-NEXT: b.lt .LBB7_2
; CHECK-NEXT: // %bb.1: // %if
; CHECK-NEXT: mov w0, #1
; CHECK-NEXT: str w0, [x6]
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB7_2:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
%c0 = icmp sle i32 %s0, %s1
%c1 = icmp sgt i32 %s2, %s3
%a = and i1 %c0, %c1
%c2 = icmp sge i32 %s4, %s5
%o = or i1 %a, %c2
br i1 %o, label %if, label %else
if:
store i32 1, i32* %p
ret i32 1
else:
ret i32 0
}