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