557 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -verify-machineinstrs < %s | FileCheck %s -check-prefix=NO_SCALAR_INC3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -sve-use-scalar-inc-vl=true -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,disable-fast-inc-vl -sve-use-scalar-inc-vl=true -verify-machineinstrs < %s | FileCheck %s -check-prefix=NO_FAST_INC5; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 -verify-machineinstrs < %s | FileCheck %s6; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 -sve-use-scalar-inc-vl=false -verify-machineinstrs < %s | FileCheck %s -check-prefix=NO_SCALAR_INC7; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2,disable-fast-inc-vl -verify-machineinstrs < %s | FileCheck %s -check-prefix=NO_FAST_INC8 9define <vscale x 8 x i16> @inch_vec(<vscale x 8 x i16> %a) {10; NO_SCALAR_INC-LABEL: inch_vec:11; NO_SCALAR_INC: // %bb.0:12; NO_SCALAR_INC-NEXT: inch z0.h13; NO_SCALAR_INC-NEXT: ret14;15; CHECK-LABEL: inch_vec:16; CHECK: // %bb.0:17; CHECK-NEXT: inch z0.h18; CHECK-NEXT: ret19;20; NO_FAST_INC-LABEL: inch_vec:21; NO_FAST_INC: // %bb.0:22; NO_FAST_INC-NEXT: inch z0.h23; NO_FAST_INC-NEXT: ret24 %vscale = call i16 @llvm.vscale.i16()25 %mul = mul i16 %vscale, 826 %vl = insertelement <vscale x 8 x i16> poison, i16 %mul, i32 027 %vl.splat = shufflevector <vscale x 8 x i16> %vl, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer28 %res = add <vscale x 8 x i16> %a, %vl.splat29 ret <vscale x 8 x i16> %res30}31 32define <vscale x 4 x i32> @incw_vec(<vscale x 4 x i32> %a) {33; NO_SCALAR_INC-LABEL: incw_vec:34; NO_SCALAR_INC: // %bb.0:35; NO_SCALAR_INC-NEXT: incw z0.s36; NO_SCALAR_INC-NEXT: ret37;38; CHECK-LABEL: incw_vec:39; CHECK: // %bb.0:40; CHECK-NEXT: incw z0.s41; CHECK-NEXT: ret42;43; NO_FAST_INC-LABEL: incw_vec:44; NO_FAST_INC: // %bb.0:45; NO_FAST_INC-NEXT: incw z0.s46; NO_FAST_INC-NEXT: ret47 %vscale = call i32 @llvm.vscale.i32()48 %mul = mul i32 %vscale, 449 %vl = insertelement <vscale x 4 x i32> poison, i32 %mul, i32 050 %vl.splat = shufflevector <vscale x 4 x i32> %vl, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer51 %res = add <vscale x 4 x i32> %a, %vl.splat52 ret <vscale x 4 x i32> %res53}54 55define <vscale x 2 x i64> @incd_vec(<vscale x 2 x i64> %a) {56; NO_SCALAR_INC-LABEL: incd_vec:57; NO_SCALAR_INC: // %bb.0:58; NO_SCALAR_INC-NEXT: incd z0.d59; NO_SCALAR_INC-NEXT: ret60;61; CHECK-LABEL: incd_vec:62; CHECK: // %bb.0:63; CHECK-NEXT: incd z0.d64; CHECK-NEXT: ret65;66; NO_FAST_INC-LABEL: incd_vec:67; NO_FAST_INC: // %bb.0:68; NO_FAST_INC-NEXT: incd z0.d69; NO_FAST_INC-NEXT: ret70 %vscale = call i64 @llvm.vscale.i64()71 %mul = mul i64 %vscale, 272 %vl = insertelement <vscale x 2 x i64> poison, i64 %mul, i32 073 %vl.splat = shufflevector <vscale x 2 x i64> %vl, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer74 %res = add <vscale x 2 x i64> %a, %vl.splat75 ret <vscale x 2 x i64> %res76}77 78define <vscale x 8 x i16> @dech_vec(<vscale x 8 x i16> %a) {79; NO_SCALAR_INC-LABEL: dech_vec:80; NO_SCALAR_INC: // %bb.0:81; NO_SCALAR_INC-NEXT: dech z0.h, all, mul #282; NO_SCALAR_INC-NEXT: ret83;84; CHECK-LABEL: dech_vec:85; CHECK: // %bb.0:86; CHECK-NEXT: dech z0.h, all, mul #287; CHECK-NEXT: ret88;89; NO_FAST_INC-LABEL: dech_vec:90; NO_FAST_INC: // %bb.0:91; NO_FAST_INC-NEXT: dech z0.h, all, mul #292; NO_FAST_INC-NEXT: ret93 %vscale = call i16 @llvm.vscale.i16()94 %mul = mul i16 %vscale, 1695 %vl = insertelement <vscale x 8 x i16> poison, i16 %mul, i32 096 %vl.splat = shufflevector <vscale x 8 x i16> %vl, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer97 %res = sub <vscale x 8 x i16> %a, %vl.splat98 ret <vscale x 8 x i16> %res99}100 101define <vscale x 4 x i32> @decw_vec(<vscale x 4 x i32> %a) {102; NO_SCALAR_INC-LABEL: decw_vec:103; NO_SCALAR_INC: // %bb.0:104; NO_SCALAR_INC-NEXT: decw z0.s, all, mul #4105; NO_SCALAR_INC-NEXT: ret106;107; CHECK-LABEL: decw_vec:108; CHECK: // %bb.0:109; CHECK-NEXT: decw z0.s, all, mul #4110; CHECK-NEXT: ret111;112; NO_FAST_INC-LABEL: decw_vec:113; NO_FAST_INC: // %bb.0:114; NO_FAST_INC-NEXT: decw z0.s, all, mul #4115; NO_FAST_INC-NEXT: ret116 %vscale = call i32 @llvm.vscale.i32()117 %mul = mul i32 %vscale, 16118 %vl = insertelement <vscale x 4 x i32> poison, i32 %mul, i32 0119 %vl.splat = shufflevector <vscale x 4 x i32> %vl, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer120 %res = sub <vscale x 4 x i32> %a, %vl.splat121 ret <vscale x 4 x i32> %res122}123 124define <vscale x 2 x i64> @decd_vec(<vscale x 2 x i64> %a) {125; NO_SCALAR_INC-LABEL: decd_vec:126; NO_SCALAR_INC: // %bb.0:127; NO_SCALAR_INC-NEXT: decd z0.d, all, mul #8128; NO_SCALAR_INC-NEXT: ret129;130; CHECK-LABEL: decd_vec:131; CHECK: // %bb.0:132; CHECK-NEXT: decd z0.d, all, mul #8133; CHECK-NEXT: ret134;135; NO_FAST_INC-LABEL: decd_vec:136; NO_FAST_INC: // %bb.0:137; NO_FAST_INC-NEXT: decd z0.d, all, mul #8138; NO_FAST_INC-NEXT: ret139 %vscale = call i64 @llvm.vscale.i64()140 %mul = mul i64 %vscale, 16141 %vl = insertelement <vscale x 2 x i64> poison, i64 %mul, i32 0142 %vl.splat = shufflevector <vscale x 2 x i64> %vl, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer143 %res = sub <vscale x 2 x i64> %a, %vl.splat144 ret <vscale x 2 x i64> %res145}146 147; NOTE: As there is no need for the predicate pattern we148; fall back to using ADDVL with its larger immediate range.149define i64 @incb_scalar_i64(i64 %a) {150; NO_SCALAR_INC-LABEL: incb_scalar_i64:151; NO_SCALAR_INC: // %bb.0:152; NO_SCALAR_INC-NEXT: rdvl x8, #1153; NO_SCALAR_INC-NEXT: add x0, x0, x8154; NO_SCALAR_INC-NEXT: ret155;156; CHECK-LABEL: incb_scalar_i64:157; CHECK: // %bb.0:158; CHECK-NEXT: incb x0159; CHECK-NEXT: ret160;161; NO_FAST_INC-LABEL: incb_scalar_i64:162; NO_FAST_INC: // %bb.0:163; NO_FAST_INC-NEXT: addvl x0, x0, #1164; NO_FAST_INC-NEXT: ret165 %vscale = call i64 @llvm.vscale.i64()166 %mul = mul i64 %vscale, 16167 %add = add i64 %a, %mul168 ret i64 %add169}170 171define i64 @inch_scalar_i64(i64 %a) {172; NO_SCALAR_INC-LABEL: inch_scalar_i64:173; NO_SCALAR_INC: // %bb.0:174; NO_SCALAR_INC-NEXT: cnth x8175; NO_SCALAR_INC-NEXT: add x0, x0, x8176; NO_SCALAR_INC-NEXT: ret177;178; CHECK-LABEL: inch_scalar_i64:179; CHECK: // %bb.0:180; CHECK-NEXT: inch x0181; CHECK-NEXT: ret182;183; NO_FAST_INC-LABEL: inch_scalar_i64:184; NO_FAST_INC: // %bb.0:185; NO_FAST_INC-NEXT: inch x0186; NO_FAST_INC-NEXT: ret187 %vscale = call i64 @llvm.vscale.i64()188 %mul = mul i64 %vscale, 8189 %add = add i64 %a, %mul190 ret i64 %add191}192 193define i64 @incw_scalar_i64(i64 %a) {194; NO_SCALAR_INC-LABEL: incw_scalar_i64:195; NO_SCALAR_INC: // %bb.0:196; NO_SCALAR_INC-NEXT: cntw x8197; NO_SCALAR_INC-NEXT: add x0, x0, x8198; NO_SCALAR_INC-NEXT: ret199;200; CHECK-LABEL: incw_scalar_i64:201; CHECK: // %bb.0:202; CHECK-NEXT: incw x0203; CHECK-NEXT: ret204;205; NO_FAST_INC-LABEL: incw_scalar_i64:206; NO_FAST_INC: // %bb.0:207; NO_FAST_INC-NEXT: incw x0208; NO_FAST_INC-NEXT: ret209 %vscale = call i64 @llvm.vscale.i64()210 %mul = mul i64 %vscale, 4211 %add = add i64 %a, %mul212 ret i64 %add213}214 215define i64 @incd_scalar_i64(i64 %a) {216; NO_SCALAR_INC-LABEL: incd_scalar_i64:217; NO_SCALAR_INC: // %bb.0:218; NO_SCALAR_INC-NEXT: cntd x8219; NO_SCALAR_INC-NEXT: add x0, x0, x8220; NO_SCALAR_INC-NEXT: ret221;222; CHECK-LABEL: incd_scalar_i64:223; CHECK: // %bb.0:224; CHECK-NEXT: incd x0225; CHECK-NEXT: ret226;227; NO_FAST_INC-LABEL: incd_scalar_i64:228; NO_FAST_INC: // %bb.0:229; NO_FAST_INC-NEXT: incd x0230; NO_FAST_INC-NEXT: ret231 %vscale = call i64 @llvm.vscale.i64()232 %mul = mul i64 %vscale, 2233 %add = add i64 %a, %mul234 ret i64 %add235}236 237; NOTE: As there is no need for the predicate pattern we238; fall back to using ADDVL with its larger immediate range.239define i64 @decb_scalar_i64(i64 %a) {240; NO_SCALAR_INC-LABEL: decb_scalar_i64:241; NO_SCALAR_INC: // %bb.0:242; NO_SCALAR_INC-NEXT: cnth x8, all, mul #4243; NO_SCALAR_INC-NEXT: sub x0, x0, x8244; NO_SCALAR_INC-NEXT: ret245;246; CHECK-LABEL: decb_scalar_i64:247; CHECK: // %bb.0:248; CHECK-NEXT: decb x0, all, mul #2249; CHECK-NEXT: ret250;251; NO_FAST_INC-LABEL: decb_scalar_i64:252; NO_FAST_INC: // %bb.0:253; NO_FAST_INC-NEXT: addvl x0, x0, #-2254; NO_FAST_INC-NEXT: ret255 %vscale = call i64 @llvm.vscale.i64()256 %mul = mul i64 %vscale, 32257 %sub = sub i64 %a, %mul258 ret i64 %sub259}260 261define i64 @dech_scalar_i64(i64 %a) {262; NO_SCALAR_INC-LABEL: dech_scalar_i64:263; NO_SCALAR_INC: // %bb.0:264; NO_SCALAR_INC-NEXT: cnth x8, all, mul #3265; NO_SCALAR_INC-NEXT: sub x0, x0, x8266; NO_SCALAR_INC-NEXT: ret267;268; CHECK-LABEL: dech_scalar_i64:269; CHECK: // %bb.0:270; CHECK-NEXT: dech x0, all, mul #3271; CHECK-NEXT: ret272;273; NO_FAST_INC-LABEL: dech_scalar_i64:274; NO_FAST_INC: // %bb.0:275; NO_FAST_INC-NEXT: dech x0, all, mul #3276; NO_FAST_INC-NEXT: ret277 %vscale = call i64 @llvm.vscale.i64()278 %mul = mul i64 %vscale, 24279 %sub = sub i64 %a, %mul280 ret i64 %sub281}282 283define i64 @decw_scalar_i64(i64 %a) {284; NO_SCALAR_INC-LABEL: decw_scalar_i64:285; NO_SCALAR_INC: // %bb.0:286; NO_SCALAR_INC-NEXT: cntw x8, all, mul #3287; NO_SCALAR_INC-NEXT: sub x0, x0, x8288; NO_SCALAR_INC-NEXT: ret289;290; CHECK-LABEL: decw_scalar_i64:291; CHECK: // %bb.0:292; CHECK-NEXT: decw x0, all, mul #3293; CHECK-NEXT: ret294;295; NO_FAST_INC-LABEL: decw_scalar_i64:296; NO_FAST_INC: // %bb.0:297; NO_FAST_INC-NEXT: decw x0, all, mul #3298; NO_FAST_INC-NEXT: ret299 %vscale = call i64 @llvm.vscale.i64()300 %mul = mul i64 %vscale, 12301 %sub = sub i64 %a, %mul302 ret i64 %sub303}304 305define i64 @decd_scalar_i64(i64 %a) {306; NO_SCALAR_INC-LABEL: decd_scalar_i64:307; NO_SCALAR_INC: // %bb.0:308; NO_SCALAR_INC-NEXT: cntd x8, all, mul #3309; NO_SCALAR_INC-NEXT: sub x0, x0, x8310; NO_SCALAR_INC-NEXT: ret311;312; CHECK-LABEL: decd_scalar_i64:313; CHECK: // %bb.0:314; CHECK-NEXT: decd x0, all, mul #3315; CHECK-NEXT: ret316;317; NO_FAST_INC-LABEL: decd_scalar_i64:318; NO_FAST_INC: // %bb.0:319; NO_FAST_INC-NEXT: decd x0, all, mul #3320; NO_FAST_INC-NEXT: ret321 %vscale = call i64 @llvm.vscale.i64()322 %mul = mul i64 %vscale, 6323 %sub = sub i64 %a, %mul324 ret i64 %sub325}326 327; NOTE: As there is no need for the predicate pattern we328; fall back to using ADDVL with its larger immediate range.329define i32 @incb_scalar_i32(i32 %a) {330; NO_SCALAR_INC-LABEL: incb_scalar_i32:331; NO_SCALAR_INC: // %bb.0:332; NO_SCALAR_INC-NEXT: rdvl x8, #3333; NO_SCALAR_INC-NEXT: add w0, w0, w8334; NO_SCALAR_INC-NEXT: ret335;336; CHECK-LABEL: incb_scalar_i32:337; CHECK: // %bb.0:338; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0339; CHECK-NEXT: addvl x0, x0, #3340; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0341; CHECK-NEXT: ret342;343; NO_FAST_INC-LABEL: incb_scalar_i32:344; NO_FAST_INC: // %bb.0:345; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0346; NO_FAST_INC-NEXT: addvl x0, x0, #3347; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0348; NO_FAST_INC-NEXT: ret349 350 %vscale = call i64 @llvm.vscale.i64()351 %mul = mul i64 %vscale, 48352 %vl = trunc i64 %mul to i32353 %add = add i32 %a, %vl354 ret i32 %add355}356 357define i32 @inch_scalar_i32(i32 %a) {358; NO_SCALAR_INC-LABEL: inch_scalar_i32:359; NO_SCALAR_INC: // %bb.0:360; NO_SCALAR_INC-NEXT: cnth x8, all, mul #7361; NO_SCALAR_INC-NEXT: add w0, w0, w8362; NO_SCALAR_INC-NEXT: ret363;364; CHECK-LABEL: inch_scalar_i32:365; CHECK: // %bb.0:366; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0367; CHECK-NEXT: inch x0, all, mul #7368; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0369; CHECK-NEXT: ret370;371; NO_FAST_INC-LABEL: inch_scalar_i32:372; NO_FAST_INC: // %bb.0:373; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0374; NO_FAST_INC-NEXT: inch x0, all, mul #7375; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0376; NO_FAST_INC-NEXT: ret377 378 %vscale = call i64 @llvm.vscale.i64()379 %mul = mul i64 %vscale, 56380 %vl = trunc i64 %mul to i32381 %add = add i32 %a, %vl382 ret i32 %add383}384 385define i32 @incw_scalar_i32(i32 %a) {386; NO_SCALAR_INC-LABEL: incw_scalar_i32:387; NO_SCALAR_INC: // %bb.0:388; NO_SCALAR_INC-NEXT: cntw x8, all, mul #7389; NO_SCALAR_INC-NEXT: add w0, w0, w8390; NO_SCALAR_INC-NEXT: ret391;392; CHECK-LABEL: incw_scalar_i32:393; CHECK: // %bb.0:394; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0395; CHECK-NEXT: incw x0, all, mul #7396; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0397; CHECK-NEXT: ret398;399; NO_FAST_INC-LABEL: incw_scalar_i32:400; NO_FAST_INC: // %bb.0:401; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0402; NO_FAST_INC-NEXT: incw x0, all, mul #7403; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0404; NO_FAST_INC-NEXT: ret405 406 %vscale = call i64 @llvm.vscale.i64()407 %mul = mul i64 %vscale, 28408 %vl = trunc i64 %mul to i32409 %add = add i32 %a, %vl410 ret i32 %add411}412 413define i32 @incd_scalar_i32(i32 %a) {414; NO_SCALAR_INC-LABEL: incd_scalar_i32:415; NO_SCALAR_INC: // %bb.0:416; NO_SCALAR_INC-NEXT: cntd x8, all, mul #7417; NO_SCALAR_INC-NEXT: add w0, w0, w8418; NO_SCALAR_INC-NEXT: ret419;420; CHECK-LABEL: incd_scalar_i32:421; CHECK: // %bb.0:422; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0423; CHECK-NEXT: incd x0, all, mul #7424; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0425; CHECK-NEXT: ret426;427; NO_FAST_INC-LABEL: incd_scalar_i32:428; NO_FAST_INC: // %bb.0:429; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0430; NO_FAST_INC-NEXT: incd x0, all, mul #7431; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0432; NO_FAST_INC-NEXT: ret433 434 %vscale = call i64 @llvm.vscale.i64()435 %mul = mul i64 %vscale, 14436 %vl = trunc i64 %mul to i32437 %add = add i32 %a, %vl438 ret i32 %add439}440 441; NOTE: As there is no need for the predicate pattern we442; fall back to using ADDVL with its larger immediate range.443define i32 @decb_scalar_i32(i32 %a) {444; NO_SCALAR_INC-LABEL: decb_scalar_i32:445; NO_SCALAR_INC: // %bb.0:446; NO_SCALAR_INC-NEXT: cnth x8, all, mul #8447; NO_SCALAR_INC-NEXT: sub w0, w0, w8448; NO_SCALAR_INC-NEXT: ret449;450; CHECK-LABEL: decb_scalar_i32:451; CHECK: // %bb.0:452; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0453; CHECK-NEXT: decb x0, all, mul #4454; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0455; CHECK-NEXT: ret456;457; NO_FAST_INC-LABEL: decb_scalar_i32:458; NO_FAST_INC: // %bb.0:459; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0460; NO_FAST_INC-NEXT: addvl x0, x0, #-4461; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0462; NO_FAST_INC-NEXT: ret463 464 %vscale = call i64 @llvm.vscale.i64()465 %mul = mul i64 %vscale, 64466 %vl = trunc i64 %mul to i32467 %sub = sub i32 %a, %vl468 ret i32 %sub469}470 471define i32 @dech_scalar_i32(i32 %a) {472; NO_SCALAR_INC-LABEL: dech_scalar_i32:473; NO_SCALAR_INC: // %bb.0:474; NO_SCALAR_INC-NEXT: cnth x8475; NO_SCALAR_INC-NEXT: sub w0, w0, w8476; NO_SCALAR_INC-NEXT: ret477;478; CHECK-LABEL: dech_scalar_i32:479; CHECK: // %bb.0:480; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0481; CHECK-NEXT: dech x0482; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0483; CHECK-NEXT: ret484;485; NO_FAST_INC-LABEL: dech_scalar_i32:486; NO_FAST_INC: // %bb.0:487; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0488; NO_FAST_INC-NEXT: dech x0489; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0490; NO_FAST_INC-NEXT: ret491 492 %vscale = call i64 @llvm.vscale.i64()493 %mul = mul i64 %vscale, 8494 %vl = trunc i64 %mul to i32495 %sub = sub i32 %a, %vl496 ret i32 %sub497}498 499define i32 @decw_scalar_i32(i32 %a) {500; NO_SCALAR_INC-LABEL: decw_scalar_i32:501; NO_SCALAR_INC: // %bb.0:502; NO_SCALAR_INC-NEXT: cntw x8503; NO_SCALAR_INC-NEXT: sub w0, w0, w8504; NO_SCALAR_INC-NEXT: ret505;506; CHECK-LABEL: decw_scalar_i32:507; CHECK: // %bb.0:508; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0509; CHECK-NEXT: decw x0510; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0511; CHECK-NEXT: ret512;513; NO_FAST_INC-LABEL: decw_scalar_i32:514; NO_FAST_INC: // %bb.0:515; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0516; NO_FAST_INC-NEXT: decw x0517; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0518; NO_FAST_INC-NEXT: ret519 520 %vscale = call i64 @llvm.vscale.i64()521 %mul = mul i64 %vscale, 4522 %vl = trunc i64 %mul to i32523 %sub = sub i32 %a, %vl524 ret i32 %sub525}526 527define i32 @decd_scalar_i32(i32 %a) {528; NO_SCALAR_INC-LABEL: decd_scalar_i32:529; NO_SCALAR_INC: // %bb.0:530; NO_SCALAR_INC-NEXT: cntd x8531; NO_SCALAR_INC-NEXT: sub w0, w0, w8532; NO_SCALAR_INC-NEXT: ret533;534; CHECK-LABEL: decd_scalar_i32:535; CHECK: // %bb.0:536; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0537; CHECK-NEXT: decd x0538; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0539; CHECK-NEXT: ret540;541; NO_FAST_INC-LABEL: decd_scalar_i32:542; NO_FAST_INC: // %bb.0:543; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 def $x0544; NO_FAST_INC-NEXT: decd x0545; NO_FAST_INC-NEXT: // kill: def $w0 killed $w0 killed $x0546; NO_FAST_INC-NEXT: ret547 %vscale = call i64 @llvm.vscale.i64()548 %mul = mul i64 %vscale, 2549 %vl = trunc i64 %mul to i32550 %sub = sub i32 %a, %vl551 ret i32 %sub552}553 554declare i16 @llvm.vscale.i16()555declare i32 @llvm.vscale.i32()556declare i64 @llvm.vscale.i64()557