brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.7 KiB · 8bd38d7 Raw
543 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: opt -passes=instcombine -S %s | llc -mtriple=aarch64--linux-gnu -mattr=+sve -o - | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6;7; Immediate Compares8;9 10define i32 @cmple_imm_nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a) {11; CHECK-LABEL: cmple_imm_nxv16i8:12; CHECK:       // %bb.0:13; CHECK-NEXT:    cmple p0.b, p0/z, z0.b, #014; CHECK-NEXT:    cset w0, ne15; CHECK-NEXT:    ret16  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8> %a)17  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)18  %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %2, <vscale x 16 x i1> %1)19  %conv = zext i1 %3 to i3220  ret i32 %conv21}22 23;24; Wide Compares25;26 27define i32 @cmple_wide_nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) {28; CHECK-LABEL: cmple_wide_nxv16i8:29; CHECK:       // %bb.0:30; CHECK-NEXT:    cmple p0.b, p0/z, z0.b, z1.d31; CHECK-NEXT:    cset w0, ne32; CHECK-NEXT:    ret33  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmple.wide.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b)34  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)35  %conv = zext i1 %2 to i3236  ret i32 %conv37}38 39define i32 @cmple_wide_nxv8i16(<vscale x 16 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) {40; CHECK-LABEL: cmple_wide_nxv8i16:41; CHECK:       // %bb.0:42; CHECK-NEXT:    cmple p0.h, p0/z, z0.h, z1.d43; CHECK-NEXT:    cset w0, ne44; CHECK-NEXT:    ret45  %1 = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)46  %2 = tail call <vscale x 8 x i1> @llvm.aarch64.sve.cmple.wide.nxv8i16(<vscale x 8 x i1> %1, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b)47  %3 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %2)48  %4 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %3)49  %conv = zext i1 %4 to i3250  ret i32 %conv51}52 53define i32 @cmple_wide_nxv4i32(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) {54; CHECK-LABEL: cmple_wide_nxv4i32:55; CHECK:       // %bb.0:56; CHECK-NEXT:    cmple p0.s, p0/z, z0.s, z1.d57; CHECK-NEXT:    cset w0, ne58; CHECK-NEXT:    ret59  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)60  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmple.wide.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b)61  %3 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %2)62  %4 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %3)63  %conv = zext i1 %4 to i3264  ret i32 %conv65}66 67; ==============================================================================68; PTEST_OP(PG, CMP(PG, ...))69; ==============================================================================70 71;72; PTEST_FIRST(PG, CMP8(PG, A, B)). PTEST is redundant.73;74define i1 @cmp8_ptest_first_px(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {75; CHECK-LABEL: cmp8_ptest_first_px:76; CHECK:       // %bb.0:77; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b78; CHECK-NEXT:    cset w0, mi79; CHECK-NEXT:    ret80  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)81  %2 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)82  ret i1 %283}84 85;86; PTEST_LAST(PG, CMP8(PG, A, B)). PTEST is redundant.87;88define i1 @cmp8_ptest_last_px(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {89; CHECK-LABEL: cmp8_ptest_last_px:90; CHECK:       // %bb.0:91; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b92; CHECK-NEXT:    cset w0, lo93; CHECK-NEXT:    ret94  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)95  %2 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)96  ret i1 %297}98 99;100; PTEST_ANY(PG, CMP8(PG, A, B)). PTEST is redundant.101;102define i1 @cmp8_ptest_any_px(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {103; CHECK-LABEL: cmp8_ptest_any_px:104; CHECK:       // %bb.0:105; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b106; CHECK-NEXT:    cset w0, ne107; CHECK-NEXT:    ret108  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)109  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)110  ret i1 %2111}112 113;114; Same as above except PG = incorrectly sized PTRUE115;116define i1 @cmp8_ptest_any_px_bad_ptrue(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {117; CHECK-LABEL: cmp8_ptest_any_px_bad_ptrue:118; CHECK:       // %bb.0:119; CHECK-NEXT:    ptrue p0.s120; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b121; CHECK-NEXT:    cset w0, ne122; CHECK-NEXT:    ret123  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)124  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %1)125  %3 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %2, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)126  %4 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %2, <vscale x 16 x i1> %3)127  ret i1 %4128}129 130;131; PTEST_FIRST(PG, CMP32(PG, A, B)). Can't remove PTEST since PTEST.B vs CMP.S.132;133define i1 @cmp32_ptest_first_px(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {134; CHECK-LABEL: cmp32_ptest_first_px:135; CHECK:       // %bb.0:136; CHECK-NEXT:    cmpge p1.s, p0/z, z0.s, z1.s137; CHECK-NEXT:    ptest p0, p1.b138; CHECK-NEXT:    cset w0, mi139; CHECK-NEXT:    ret140  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)141  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)142  %3 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %2)143  %4 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %3)144  ret i1 %4145}146 147;148; PTEST_LAST(PG, CMP32(PG, A, B)). Can't remove PTEST since PTEST.B vs CMP.S.149;150define i1 @cmp32_ptest_last_px(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {151; CHECK-LABEL: cmp32_ptest_last_px:152; CHECK:       // %bb.0:153; CHECK-NEXT:    cmpge p1.s, p0/z, z0.s, z1.s154; CHECK-NEXT:    ptest p0, p1.b155; CHECK-NEXT:    cset w0, lo156; CHECK-NEXT:    ret157  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)158  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)159  %3 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %2)160  %4 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %3)161  ret i1 %4162}163 164;165; PTEST_ANY(PG, CMP32(PG, A, B)). PTEST is redundant.166;167define i1 @cmp32_ptest_any_px(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {168; CHECK-LABEL: cmp32_ptest_any_px:169; CHECK:       // %bb.0:170; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s171; CHECK-NEXT:    cset w0, ne172; CHECK-NEXT:    ret173  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)174  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)175  %3 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %2)176  %4 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %3)177  ret i1 %4178}179 180;181; Same as above except PG = incorrectly sized PTRUE182;183define i1 @cmp32_ptest_any_px_bad_ptrue(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {184; CHECK-LABEL: cmp32_ptest_any_px_bad_ptrue:185; CHECK:       // %bb.0:186; CHECK-NEXT:    ptrue p0.b187; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s188; CHECK-NEXT:    cset w0, ne189; CHECK-NEXT:    ret190  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)191  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %1)192  %3 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %2, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)193  %4 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %3)194  %5 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %4)195  ret i1 %5196}197 198; ==============================================================================199; PTEST_OP(X=CMP(PG, ...), X)200; ==============================================================================201 202;203; PTEST_FIRST(X=CMP8(PG, A, B), X). PTEST is redundant if condition is changed204; to any.205;206; Can't remove PTEST and keep the same condition (first), since the mask for207; the implicit PTEST (PG) performed by the compare differs from the mask208; specified to the explicit PTEST and could have a different result.209;210; For example, consider211;212;   PG=<1, 1, x, x>213;   Z0=<1, 2, x, x>214;   Z1=<2, 1, x, x>215;216;   X=CMPLE(PG, Z0, Z1)217;    =<0, 1, x, x>       NZCV=0xxx218;   PTEST(X, X),         NZCV=1xxx219;220; where the first active flag (bit 'N' in NZCV) is set by the explicit PTEST,221; but not by the implicit PTEST as part of the compare. However, given the222; PTEST mask and source are the same, first is equivalent to any. The same223; applies to last active.224;225define i1 @cmp8_ptest_first_xx(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {226; CHECK-LABEL: cmp8_ptest_first_xx:227; CHECK:       // %bb.0:228; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b229; CHECK-NEXT:    cset w0, ne230; CHECK-NEXT:    ret231  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)232  %2 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %1)233  ret i1 %2234}235 236;237; PTEST_LAST(X=CMP8(PG, A, B), X). PTEST is redundant if condition is changed238; to any.239;240define i1 @cmp8_ptest_last_xx(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {241; CHECK-LABEL: cmp8_ptest_last_xx:242; CHECK:       // %bb.0:243; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b244; CHECK-NEXT:    cset w0, ne245; CHECK-NEXT:    ret246  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)247  %2 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %1)248  ret i1 %2249}250 251;252; PTEST_ANY(X=CMP8(PG, A, B), X). PTEST is redundant.253;254define i1 @cmp8_ptest_any_xx(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {255; CHECK-LABEL: cmp8_ptest_any_xx:256; CHECK:       // %bb.0:257; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b258; CHECK-NEXT:    cset w0, ne259; CHECK-NEXT:    ret260  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)261  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %1)262  ret i1 %2263}264 265;266; PTEST_FIRST(X=CMP32(PG, A, B), X). PTEST is redundant if condition is changed267; to any.268;269define i1 @cmp32_ptest_first_xx(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {270; CHECK-LABEL: cmp32_ptest_first_xx:271; CHECK:       // %bb.0:272; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s273; CHECK-NEXT:    cset w0, ne274; CHECK-NEXT:    ret275  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)276  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)277  %3 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv4i1(<vscale x 4 x i1> %2, <vscale x 4 x i1> %2)278  ret i1 %3279}280 281;282; PTEST_LAST(X=CMP32(PG, A, B), X). PTEST is redundant if condition is changed283; to any.284;285define i1 @cmp32_ptest_last_xx(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {286; CHECK-LABEL: cmp32_ptest_last_xx:287; CHECK:       // %bb.0:288; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s289; CHECK-NEXT:    cset w0, ne290; CHECK-NEXT:    ret291  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)292  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)293  %3 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv4i1(<vscale x 4 x i1> %2, <vscale x 4 x i1> %2)294  ret i1 %3295}296 297;298; PTEST_ANY(X=CMP32(PG, A, B), X). PTEST is redundant.299;300define i1 @cmp32_ptest_any_xx(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {301; CHECK-LABEL: cmp32_ptest_any_xx:302; CHECK:       // %bb.0:303; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s304; CHECK-NEXT:    cset w0, ne305; CHECK-NEXT:    ret306  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)307  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)308  %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv4i1(<vscale x 4 x i1> %2, <vscale x 4 x i1> %2)309  ret i1 %3310}311 312; ==============================================================================313; PTEST_OP(PTRUE_ALL, CMP(PG, ...))314; ==============================================================================315 316;317; PTEST_FIRST(PTRUE_ALL, CMP8(PG, A, B)). Can't remove PTEST since mask is318; different.319;320define i1 @cmp8_ptest_first_ax(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {321; CHECK-LABEL: cmp8_ptest_first_ax:322; CHECK:       // %bb.0:323; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b324; CHECK-NEXT:    ptrue p1.b325; CHECK-NEXT:    ptest p1, p0.b326; CHECK-NEXT:    cset w0, mi327; CHECK-NEXT:    ret328  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)329  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)330  %3 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv16i1(<vscale x 16 x i1> %2, <vscale x 16 x i1> %1)331  ret i1 %3332}333 334;335; PTEST_LAST(PTRUE_ALL, CMP8(PG, A, B)). Can't remove PTEST since mask is336; different.337;338define i1 @cmp8_ptest_last_ax(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {339; CHECK-LABEL: cmp8_ptest_last_ax:340; CHECK:       // %bb.0:341; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b342; CHECK-NEXT:    ptrue p1.b343; CHECK-NEXT:    ptest p1, p0.b344; CHECK-NEXT:    cset w0, lo345; CHECK-NEXT:    ret346  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)347  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)348  %3 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv16i1(<vscale x 16 x i1> %2, <vscale x 16 x i1> %1)349  ret i1 %3350}351 352;353; PTEST_ANY(PTRUE_ALL, CMP8(PG, A, B)). PTEST is redundant.354;355define i1 @cmp8_ptest_any_ax(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {356; CHECK-LABEL: cmp8_ptest_any_ax:357; CHECK:       // %bb.0:358; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b359; CHECK-NEXT:    cset w0, ne360; CHECK-NEXT:    ret361  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)362  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)363  %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %2, <vscale x 16 x i1> %1)364  ret i1 %3365}366 367;368; PTEST_FIRST(PTRUE_ALL, CMP32(PG, A, B)). Can't remove PTEST since mask is369; different.370;371define i1 @cmp32_ptest_first_ax(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {372; CHECK-LABEL: cmp32_ptest_first_ax:373; CHECK:       // %bb.0:374; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s375; CHECK-NEXT:    ptrue p1.s376; CHECK-NEXT:    ptest p1, p0.b377; CHECK-NEXT:    cset w0, mi378; CHECK-NEXT:    ret379  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)380  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)381  %3 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)382  %4 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv4i1(<vscale x 4 x i1> %3, <vscale x 4 x i1> %2)383  ret i1 %4384}385 386;387; PTEST_LAST(PTRUE_ALL, CMP32(PG, A, B)). Can't remove PTEST since mask is388; different.389;390define i1 @cmp32_ptest_last_ax(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {391; CHECK-LABEL: cmp32_ptest_last_ax:392; CHECK:       // %bb.0:393; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s394; CHECK-NEXT:    ptrue p1.s395; CHECK-NEXT:    ptest p1, p0.b396; CHECK-NEXT:    cset w0, lo397; CHECK-NEXT:    ret398  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)399  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)400  %3 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)401  %4 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv4i1(<vscale x 4 x i1> %3, <vscale x 4 x i1> %2)402  ret i1 %4403}404 405;406; PTEST_ANY(PTRUE_ALL, CMP32(PG, A, B)). PTEST is redundant.407;408define i1 @cmp32_ptest_any_ax(<vscale x 16 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {409; CHECK-LABEL: cmp32_ptest_any_ax:410; CHECK:       // %bb.0:411; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s412; CHECK-NEXT:    cset w0, ne413; CHECK-NEXT:    ret414  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)415  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)416  %3 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)417  %4 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv4i1(<vscale x 4 x i1> %3, <vscale x 4 x i1> %2)418  ret i1 %4419}420 421; ==============================================================================422; PTEST_OP(PTRUE_ALL, CMP(PTRUE_ALL, ...))423; ==============================================================================424 425;426; PTEST_FIRST(PTRUE_ALL, CMP8(PTRUE_ALL, A, B)). PTEST is redundant.427;428define i1 @cmp8_ptest_first_aa(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {429; CHECK-LABEL: cmp8_ptest_first_aa:430; CHECK:       // %bb.0:431; CHECK-NEXT:    ptrue p0.b432; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b433; CHECK-NEXT:    cset w0, mi434; CHECK-NEXT:    ret435  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)436  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %1, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)437  %3 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %2)438  ret i1 %3439}440 441;442; PTEST_LAST(PTRUE_ALL, CMP8(PTRUE_ALL, A, B)). PTEST is redundant.443;444define i1 @cmp8_ptest_last_aa(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {445; CHECK-LABEL: cmp8_ptest_last_aa:446; CHECK:       // %bb.0:447; CHECK-NEXT:    ptrue p0.b448; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b449; CHECK-NEXT:    cset w0, lo450; CHECK-NEXT:    ret451  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)452  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %1, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)453  %3 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %2)454  ret i1 %3455}456 457;458; PTEST_ANY(PTRUE_ALL, CMP8(PTRUE_ALL, A, B)). PTEST is redundant.459;460define i1 @cmp8_ptest_any_aa(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {461; CHECK-LABEL: cmp8_ptest_any_aa:462; CHECK:       // %bb.0:463; CHECK-NEXT:    ptrue p0.b464; CHECK-NEXT:    cmpge p0.b, p0/z, z0.b, z1.b465; CHECK-NEXT:    cset w0, ne466; CHECK-NEXT:    ret467  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31)468  %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %1, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b)469  %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %1, <vscale x 16 x i1> %2)470  ret i1 %3471}472 473;474; PTEST_FIRST(PTRUE_ALL, CMP32(PTRUE_ALL, A, B)). PTEST is redundant.475;476define i1 @cmp32_ptest_first_aa(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {477; CHECK-LABEL: cmp32_ptest_first_aa:478; CHECK:       // %bb.0:479; CHECK-NEXT:    ptrue p0.s480; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s481; CHECK-NEXT:    cset w0, mi482; CHECK-NEXT:    ret483  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)484  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)485  %3 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %2)486  ret i1 %3487}488 489;490; PTEST_LAST(PTRUE_ALL, CMP32(PTRUE_ALL, A, B)). PTEST is redundant.491;492define i1 @cmp32_ptest_last_aa(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {493; CHECK-LABEL: cmp32_ptest_last_aa:494; CHECK:       // %bb.0:495; CHECK-NEXT:    ptrue p0.s496; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s497; CHECK-NEXT:    cset w0, lo498; CHECK-NEXT:    ret499  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)500  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)501  %3 = tail call i1 @llvm.aarch64.sve.ptest.last.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %2)502  ret i1 %3503}504 505;506; PTEST_ANY(PTRUE_ALL, CMP32(PTRUE_ALL, A, B)). PTEST is redundant.507;508define i1 @cmp32_ptest_any_aa(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {509; CHECK-LABEL: cmp32_ptest_any_aa:510; CHECK:       // %bb.0:511; CHECK-NEXT:    ptrue p0.s512; CHECK-NEXT:    cmpge p0.s, p0/z, z0.s, z1.s513; CHECK-NEXT:    cset w0, ne514; CHECK-NEXT:    ret515  %1 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)516  %2 = tail call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %1, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b)517  %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %2)518  ret i1 %3519}520 521declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)522declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)523declare <vscale x 16 x i1> @llvm.aarch64.sve.cmple.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>)524declare <vscale x 8 x i1> @llvm.aarch64.sve.cmple.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>)525declare <vscale x 4 x i1> @llvm.aarch64.sve.cmple.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>)526 527declare i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>)528declare i1 @llvm.aarch64.sve.ptest.first.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>)529declare i1 @llvm.aarch64.sve.ptest.last.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>)530 531declare i1 @llvm.aarch64.sve.ptest.any.nxv4i1(<vscale x 4 x i1>, <vscale x 4 x i1>)532declare i1 @llvm.aarch64.sve.ptest.first.nxv4i1(<vscale x 4 x i1>, <vscale x 4 x i1>)533declare i1 @llvm.aarch64.sve.ptest.last.nxv4i1(<vscale x 4 x i1>, <vscale x 4 x i1>)534 535declare <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32)536declare <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32)537 538declare <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1>)539declare <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1>)540 541declare <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1>)542declare <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1>)543