566 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -sve-use-scalar-inc-vl=true < %s | FileCheck %s -check-prefix=USE_SCALAR_INC4; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s | FileCheck %s -check-prefix=USE_SCALAR_INC5; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -force-streaming < %s | FileCheck %s -check-prefix=USE_SCALAR_INC6; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 -sve-use-scalar-inc-vl=false < %s | FileCheck %s7; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -sve-use-scalar-inc-vl=false -force-streaming < %s | FileCheck %s8 9;10; CNTB11;12 13define i64 @cntb() {14; CHECK-LABEL: cntb:15; CHECK: // %bb.0:16; CHECK-NEXT: cntb x0, vl217; CHECK-NEXT: ret18;19; USE_SCALAR_INC-LABEL: cntb:20; USE_SCALAR_INC: // %bb.0:21; USE_SCALAR_INC-NEXT: cntb x0, vl222; USE_SCALAR_INC-NEXT: ret23 %out = call i64 @llvm.aarch64.sve.cntb(i32 2)24 ret i64 %out25}26 27define i64 @cntb_mul3() {28; CHECK-LABEL: cntb_mul3:29; CHECK: // %bb.0:30; CHECK-NEXT: cntb x0, vl6, mul #331; CHECK-NEXT: ret32;33; USE_SCALAR_INC-LABEL: cntb_mul3:34; USE_SCALAR_INC: // %bb.0:35; USE_SCALAR_INC-NEXT: cntb x0, vl6, mul #336; USE_SCALAR_INC-NEXT: ret37 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 6)38 %out = mul i64 %cnt, 339 ret i64 %out40}41 42define i64 @cntb_mul4() {43; CHECK-LABEL: cntb_mul4:44; CHECK: // %bb.0:45; CHECK-NEXT: cntb x0, vl8, mul #446; CHECK-NEXT: ret47;48; USE_SCALAR_INC-LABEL: cntb_mul4:49; USE_SCALAR_INC: // %bb.0:50; USE_SCALAR_INC-NEXT: cntb x0, vl8, mul #451; USE_SCALAR_INC-NEXT: ret52 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 8)53 %out = mul i64 %cnt, 454 ret i64 %out55}56 57;58; CNTH59;60 61define i64 @cnth() {62; CHECK-LABEL: cnth:63; CHECK: // %bb.0:64; CHECK-NEXT: cnth x0, vl365; CHECK-NEXT: ret66;67; USE_SCALAR_INC-LABEL: cnth:68; USE_SCALAR_INC: // %bb.0:69; USE_SCALAR_INC-NEXT: cnth x0, vl370; USE_SCALAR_INC-NEXT: ret71 %out = call i64 @llvm.aarch64.sve.cnth(i32 3)72 ret i64 %out73}74 75define i64 @cnth_mul5() {76; CHECK-LABEL: cnth_mul5:77; CHECK: // %bb.0:78; CHECK-NEXT: cnth x0, vl7, mul #579; CHECK-NEXT: ret80;81; USE_SCALAR_INC-LABEL: cnth_mul5:82; USE_SCALAR_INC: // %bb.0:83; USE_SCALAR_INC-NEXT: cnth x0, vl7, mul #584; USE_SCALAR_INC-NEXT: ret85 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 7)86 %out = mul i64 %cnt, 587 ret i64 %out88}89 90define i64 @cnth_mul8() {91; CHECK-LABEL: cnth_mul8:92; CHECK: // %bb.0:93; CHECK-NEXT: cnth x0, vl5, mul #894; CHECK-NEXT: ret95;96; USE_SCALAR_INC-LABEL: cnth_mul8:97; USE_SCALAR_INC: // %bb.0:98; USE_SCALAR_INC-NEXT: cnth x0, vl5, mul #899; USE_SCALAR_INC-NEXT: ret100 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 5)101 %out = mul i64 %cnt, 8102 ret i64 %out103}104 105;106; CNTW107;108 109define i64 @cntw() {110; CHECK-LABEL: cntw:111; CHECK: // %bb.0:112; CHECK-NEXT: cntw x0, vl4113; CHECK-NEXT: ret114;115; USE_SCALAR_INC-LABEL: cntw:116; USE_SCALAR_INC: // %bb.0:117; USE_SCALAR_INC-NEXT: cntw x0, vl4118; USE_SCALAR_INC-NEXT: ret119 %out = call i64 @llvm.aarch64.sve.cntw(i32 4)120 ret i64 %out121}122 123define i64 @cntw_mul11() {124; CHECK-LABEL: cntw_mul11:125; CHECK: // %bb.0:126; CHECK-NEXT: cntw x0, vl8, mul #11127; CHECK-NEXT: ret128;129; USE_SCALAR_INC-LABEL: cntw_mul11:130; USE_SCALAR_INC: // %bb.0:131; USE_SCALAR_INC-NEXT: cntw x0, vl8, mul #11132; USE_SCALAR_INC-NEXT: ret133 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 8)134 %out = mul i64 %cnt, 11135 ret i64 %out136}137 138define i64 @cntw_mul2() {139; CHECK-LABEL: cntw_mul2:140; CHECK: // %bb.0:141; CHECK-NEXT: cntw x0, vl6, mul #2142; CHECK-NEXT: ret143;144; USE_SCALAR_INC-LABEL: cntw_mul2:145; USE_SCALAR_INC: // %bb.0:146; USE_SCALAR_INC-NEXT: cntw x0, vl6, mul #2147; USE_SCALAR_INC-NEXT: ret148 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 6)149 %out = mul i64 %cnt, 2150 ret i64 %out151}152 153;154; CNTD155;156 157define i64 @cntd() {158; CHECK-LABEL: cntd:159; CHECK: // %bb.0:160; CHECK-NEXT: cntd x0, vl5161; CHECK-NEXT: ret162;163; USE_SCALAR_INC-LABEL: cntd:164; USE_SCALAR_INC: // %bb.0:165; USE_SCALAR_INC-NEXT: cntd x0, vl5166; USE_SCALAR_INC-NEXT: ret167 %out = call i64 @llvm.aarch64.sve.cntd(i32 5)168 ret i64 %out169}170 171define i64 @cntd_mul15() {172; CHECK-LABEL: cntd_mul15:173; CHECK: // %bb.0:174; CHECK-NEXT: cntd x0, vl16, mul #15175; CHECK-NEXT: ret176;177; USE_SCALAR_INC-LABEL: cntd_mul15:178; USE_SCALAR_INC: // %bb.0:179; USE_SCALAR_INC-NEXT: cntd x0, vl16, mul #15180; USE_SCALAR_INC-NEXT: ret181 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 9)182 %out = mul i64 %cnt, 15183 ret i64 %out184}185 186define i64 @cntd_mul16() {187; CHECK-LABEL: cntd_mul16:188; CHECK: // %bb.0:189; CHECK-NEXT: cntd x0, vl32, mul #16190; CHECK-NEXT: ret191;192; USE_SCALAR_INC-LABEL: cntd_mul16:193; USE_SCALAR_INC: // %bb.0:194; USE_SCALAR_INC-NEXT: cntd x0, vl32, mul #16195; USE_SCALAR_INC-NEXT: ret196 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 10)197 %out = mul i64 %cnt, 16198 ret i64 %out199}200 201;202; CNTP203;204 205define i64 @cntp_b8(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) {206; CHECK-LABEL: cntp_b8:207; CHECK: // %bb.0:208; CHECK-NEXT: cntp x0, p0, p1.b209; CHECK-NEXT: ret210;211; USE_SCALAR_INC-LABEL: cntp_b8:212; USE_SCALAR_INC: // %bb.0:213; USE_SCALAR_INC-NEXT: cntp x0, p0, p1.b214; USE_SCALAR_INC-NEXT: ret215 %out = call i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1> %pg,216 <vscale x 16 x i1> %a)217 ret i64 %out218}219 220define i64 @cntp_b16(<vscale x 8 x i1> %pg, <vscale x 8 x i1> %a) {221; CHECK-LABEL: cntp_b16:222; CHECK: // %bb.0:223; CHECK-NEXT: cntp x0, p0, p1.h224; CHECK-NEXT: ret225;226; USE_SCALAR_INC-LABEL: cntp_b16:227; USE_SCALAR_INC: // %bb.0:228; USE_SCALAR_INC-NEXT: cntp x0, p0, p1.h229; USE_SCALAR_INC-NEXT: ret230 %out = call i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1> %pg,231 <vscale x 8 x i1> %a)232 ret i64 %out233}234 235define i64 @cntp_b32(<vscale x 4 x i1> %pg, <vscale x 4 x i1> %a) {236; CHECK-LABEL: cntp_b32:237; CHECK: // %bb.0:238; CHECK-NEXT: cntp x0, p0, p1.s239; CHECK-NEXT: ret240;241; USE_SCALAR_INC-LABEL: cntp_b32:242; USE_SCALAR_INC: // %bb.0:243; USE_SCALAR_INC-NEXT: cntp x0, p0, p1.s244; USE_SCALAR_INC-NEXT: ret245 %out = call i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1> %pg,246 <vscale x 4 x i1> %a)247 ret i64 %out248}249 250define i64 @cntp_b64(<vscale x 2 x i1> %pg, <vscale x 2 x i1> %a) {251; CHECK-LABEL: cntp_b64:252; CHECK: // %bb.0:253; CHECK-NEXT: cntp x0, p0, p1.d254; CHECK-NEXT: ret255;256; USE_SCALAR_INC-LABEL: cntp_b64:257; USE_SCALAR_INC: // %bb.0:258; USE_SCALAR_INC-NEXT: cntp x0, p0, p1.d259; USE_SCALAR_INC-NEXT: ret260 %out = call i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1> %pg,261 <vscale x 2 x i1> %a)262 ret i64 %out263}264 265;266; INCB267;268 269define i64 @incb(i64 %a) {270; CHECK-LABEL: incb:271; CHECK: // %bb.0:272; CHECK-NEXT: cntb x8, vl5273; CHECK-NEXT: add x0, x8, x0274; CHECK-NEXT: ret275;276; USE_SCALAR_INC-LABEL: incb:277; USE_SCALAR_INC: // %bb.0:278; USE_SCALAR_INC-NEXT: incb x0, vl5279; USE_SCALAR_INC-NEXT: ret280 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 5)281 %out = add i64 %cnt, %a282 ret i64 %out283}284 285define i64 @incb_mul(i64 %a) {286; CHECK-LABEL: incb_mul:287; CHECK: // %bb.0:288; CHECK-NEXT: cntb x8, vl4289; CHECK-NEXT: add x0, x0, x8, lsl #2290; CHECK-NEXT: ret291;292; USE_SCALAR_INC-LABEL: incb_mul:293; USE_SCALAR_INC: // %bb.0:294; USE_SCALAR_INC-NEXT: incb x0, vl4, mul #4295; USE_SCALAR_INC-NEXT: ret296 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 4)297 %mul = mul i64 %cnt, 4298 %out = add i64 %mul, %a299 ret i64 %out300}301 302;303; DECB304;305 306define i64 @decb(i64 %a) {307; CHECK-LABEL: decb:308; CHECK: // %bb.0:309; CHECK-NEXT: cntb x8, vl6310; CHECK-NEXT: sub x0, x0, x8311; CHECK-NEXT: ret312;313; USE_SCALAR_INC-LABEL: decb:314; USE_SCALAR_INC: // %bb.0:315; USE_SCALAR_INC-NEXT: decb x0, vl6316; USE_SCALAR_INC-NEXT: ret317 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 6)318 %out = sub i64 %a, %cnt319 ret i64 %out320}321 322define i64 @decb_mul(i64 %a) {323; CHECK-LABEL: decb_mul:324; CHECK: // %bb.0:325; CHECK-NEXT: cntb x8, vl7326; CHECK-NEXT: sub x0, x0, x8, lsl #3327; CHECK-NEXT: ret328;329; USE_SCALAR_INC-LABEL: decb_mul:330; USE_SCALAR_INC: // %bb.0:331; USE_SCALAR_INC-NEXT: decb x0, vl7, mul #8332; USE_SCALAR_INC-NEXT: ret333 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 7)334 %mul = mul i64 %cnt, 8335 %out = sub i64 %a, %mul336 ret i64 %out337}338 339;340; INCH341;342 343define i64 @inch(i64 %a) {344; CHECK-LABEL: inch:345; CHECK: // %bb.0:346; CHECK-NEXT: cnth x8, vl4347; CHECK-NEXT: add x0, x8, x0348; CHECK-NEXT: ret349;350; USE_SCALAR_INC-LABEL: inch:351; USE_SCALAR_INC: // %bb.0:352; USE_SCALAR_INC-NEXT: inch x0, vl4353; USE_SCALAR_INC-NEXT: ret354 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 4)355 %out = add i64 %cnt, %a356 ret i64 %out357}358 359define i64 @inch_mul(i64 %a) {360; CHECK-LABEL: inch_mul:361; CHECK: // %bb.0:362; CHECK-NEXT: cnth x8, vl8, mul #5363; CHECK-NEXT: add x0, x8, x0364; CHECK-NEXT: ret365;366; USE_SCALAR_INC-LABEL: inch_mul:367; USE_SCALAR_INC: // %bb.0:368; USE_SCALAR_INC-NEXT: inch x0, vl8, mul #5369; USE_SCALAR_INC-NEXT: ret370 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 8)371 %mul = mul i64 %cnt, 5372 %out = add i64 %mul, %a373 ret i64 %out374}375 376;377; DECH378;379 380define i64 @dech(i64 %a) {381; CHECK-LABEL: dech:382; CHECK: // %bb.0:383; CHECK-NEXT: cnth x8, vl1384; CHECK-NEXT: sub x0, x0, x8385; CHECK-NEXT: ret386;387; USE_SCALAR_INC-LABEL: dech:388; USE_SCALAR_INC: // %bb.0:389; USE_SCALAR_INC-NEXT: dech x0, vl1390; USE_SCALAR_INC-NEXT: ret391 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 1)392 %out = sub i64 %a, %cnt393 ret i64 %out394}395 396define i64 @dech_mul(i64 %a) {397; CHECK-LABEL: dech_mul:398; CHECK: // %bb.0:399; CHECK-NEXT: cnth x8, vl16, mul #7400; CHECK-NEXT: sub x0, x0, x8401; CHECK-NEXT: ret402;403; USE_SCALAR_INC-LABEL: dech_mul:404; USE_SCALAR_INC: // %bb.0:405; USE_SCALAR_INC-NEXT: dech x0, vl16, mul #7406; USE_SCALAR_INC-NEXT: ret407 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 9)408 %mul = mul i64 %cnt, 7409 %out = sub i64 %a, %mul410 ret i64 %out411}412 413;414; INCW415;416 417define i64 @incw(i64 %a) {418; CHECK-LABEL: incw:419; CHECK: // %bb.0:420; CHECK-NEXT: cntw x8, #16421; CHECK-NEXT: add x0, x8, x0422; CHECK-NEXT: ret423;424; USE_SCALAR_INC-LABEL: incw:425; USE_SCALAR_INC: // %bb.0:426; USE_SCALAR_INC-NEXT: incw x0, #16427; USE_SCALAR_INC-NEXT: ret428 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 16)429 %out = add i64 %cnt, %a430 ret i64 %out431}432 433define i64 @incw_mul(i64 %a) {434; CHECK-LABEL: incw_mul:435; CHECK: // %bb.0:436; CHECK-NEXT: cntw x8, vl32, mul #12437; CHECK-NEXT: add x0, x8, x0438; CHECK-NEXT: ret439;440; USE_SCALAR_INC-LABEL: incw_mul:441; USE_SCALAR_INC: // %bb.0:442; USE_SCALAR_INC-NEXT: incw x0, vl32, mul #12443; USE_SCALAR_INC-NEXT: ret444 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 10)445 %mul = mul i64 %cnt, 12446 %out = add i64 %mul, %a447 ret i64 %out448}449 450;451; DECW452;453 454define i64 @decw(i64 %a) {455; CHECK-LABEL: decw:456; CHECK: // %bb.0:457; CHECK-NEXT: cntw x8458; CHECK-NEXT: sub x0, x0, x8459; CHECK-NEXT: ret460;461; USE_SCALAR_INC-LABEL: decw:462; USE_SCALAR_INC: // %bb.0:463; USE_SCALAR_INC-NEXT: decw x0464; USE_SCALAR_INC-NEXT: ret465 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 31)466 %out = sub i64 %a, %cnt467 ret i64 %out468}469 470define i64 @decw_mul(i64 %a) {471; CHECK-LABEL: decw_mul:472; CHECK: // %bb.0:473; CHECK-NEXT: cntw x8, vl128474; CHECK-NEXT: sub x0, x0, x8, lsl #4475; CHECK-NEXT: ret476;477; USE_SCALAR_INC-LABEL: decw_mul:478; USE_SCALAR_INC: // %bb.0:479; USE_SCALAR_INC-NEXT: decw x0, vl128, mul #16480; USE_SCALAR_INC-NEXT: ret481 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 12)482 %mul = mul i64 %cnt, 16483 %out = sub i64 %a, %mul484 ret i64 %out485}486 487define i64 @incd(i64 %a) {488; CHECK-LABEL: incd:489; CHECK: // %bb.0:490; CHECK-NEXT: cntd x8, vl8491; CHECK-NEXT: add x0, x8, x0492; CHECK-NEXT: ret493;494; USE_SCALAR_INC-LABEL: incd:495; USE_SCALAR_INC: // %bb.0:496; USE_SCALAR_INC-NEXT: incd x0, vl8497; USE_SCALAR_INC-NEXT: ret498 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 8)499 %out = add i64 %cnt, %a500 ret i64 %out501}502 503define i64 @incd_mul(i64 %a) {504; CHECK-LABEL: incd_mul:505; CHECK: // %bb.0:506; CHECK-NEXT: cntd x8, all, mul #15507; CHECK-NEXT: add x0, x8, x0508; CHECK-NEXT: ret509;510; USE_SCALAR_INC-LABEL: incd_mul:511; USE_SCALAR_INC: // %bb.0:512; USE_SCALAR_INC-NEXT: incd x0, all, mul #15513; USE_SCALAR_INC-NEXT: ret514 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 31)515 %mul = mul i64 %cnt, 15516 %out = add i64 %mul, %a517 ret i64 %out518}519 520;521; DECD522;523 524define i64 @decd(i64 %a) {525; CHECK-LABEL: decd:526; CHECK: // %bb.0:527; CHECK-NEXT: cntd x8, #16528; CHECK-NEXT: sub x0, x0, x8529; CHECK-NEXT: ret530;531; USE_SCALAR_INC-LABEL: decd:532; USE_SCALAR_INC: // %bb.0:533; USE_SCALAR_INC-NEXT: decd x0, #16534; USE_SCALAR_INC-NEXT: ret535 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 16)536 %out = sub i64 %a, %cnt537 ret i64 %out538}539 540define i64 @decd_mul(i64 %a) {541; CHECK-LABEL: decd_mul:542; CHECK: // %bb.0:543; CHECK-NEXT: cntd x8, vl2, mul #9544; CHECK-NEXT: sub x0, x0, x8545; CHECK-NEXT: ret546;547; USE_SCALAR_INC-LABEL: decd_mul:548; USE_SCALAR_INC: // %bb.0:549; USE_SCALAR_INC-NEXT: decd x0, vl2, mul #9550; USE_SCALAR_INC-NEXT: ret551 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 2)552 %mul = mul i64 %cnt, 9553 %out = sub i64 %a, %mul554 ret i64 %out555}556 557declare i64 @llvm.aarch64.sve.cntb(i32 %pattern)558declare i64 @llvm.aarch64.sve.cnth(i32 %pattern)559declare i64 @llvm.aarch64.sve.cntw(i32 %pattern)560declare i64 @llvm.aarch64.sve.cntd(i32 %pattern)561 562declare i64 @llvm.aarch64.sve.cntp.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>)563declare i64 @llvm.aarch64.sve.cntp.nxv8i1(<vscale x 8 x i1>, <vscale x 8 x i1>)564declare i64 @llvm.aarch64.sve.cntp.nxv4i1(<vscale x 4 x i1>, <vscale x 4 x i1>)565declare i64 @llvm.aarch64.sve.cntp.nxv2i1(<vscale x 2 x i1>, <vscale x 2 x i1>)566