; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64-linux-unknown -mattr=+sve -o - < %s | FileCheck %s define @vselect_cmp_ne( %a, %b, %c) { ; CHECK-LABEL: vselect_cmp_ne: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, z1.b ; CHECK-NEXT: sel z0.b, p0, z1.b, z2.b ; CHECK-NEXT: ret %cmp = icmp ne %a, %b %d = select %cmp, %b, %c ret %d } define @vselect_cmp_sgt( %a, %b, %c) { ; CHECK-LABEL: vselect_cmp_sgt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmpgt p0.b, p0/z, z0.b, z1.b ; CHECK-NEXT: sel z0.b, p0, z1.b, z2.b ; CHECK-NEXT: ret %cmp = icmp sgt %a, %b %d = select %cmp, %b, %c ret %d } define @vselect_cmp_ugt( %a, %b, %c) { ; CHECK-LABEL: vselect_cmp_ugt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmphi p0.b, p0/z, z0.b, z1.b ; CHECK-NEXT: sel z0.b, p0, z1.b, z2.b ; CHECK-NEXT: ret %cmp = icmp ugt %a, %b %d = select %cmp, %b, %c ret %d } ; Some folds to remove a redundant icmp if the original input was a predicate vector. define @fold_away_icmp_ptrue_all( %p) { ; CHECK-LABEL: fold_away_icmp_ptrue_all: ; CHECK: // %bb.0: ; CHECK-NEXT: ret %t0 = sext %p to %t1 = icmp ne %t0, zeroinitializer ret %t1 } define @fold_away_icmp_ptrue_vl16( %p) vscale_range(4, 4) { ; CHECK-LABEL: fold_away_icmp_ptrue_vl16: ; CHECK: // %bb.0: ; CHECK-NEXT: ret %t0 = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 9) ; VL16 is encoded as 9. %t1 = sext %p to %t2 = call @llvm.aarch64.sve.cmpne.nxv4i32( %t0, %t1, zeroinitializer) ret %t2 } declare @llvm.aarch64.sve.ptrue.nxv4i1(i32) declare @llvm.aarch64.sve.cmpne.nxv4i32(, , )