353 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 %s -check-prefix=NO_SCALAR_INC3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -sve-use-scalar-inc-vl=true < %s | FileCheck %s4; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s | FileCheck %s5 6; INCB7 8define i32 @incb(i32 %a) {9; NO_SCALAR_INC-LABEL: incb:10; NO_SCALAR_INC: // %bb.0:11; NO_SCALAR_INC-NEXT: cntb x8, vl512; NO_SCALAR_INC-NEXT: add w0, w8, w013; NO_SCALAR_INC-NEXT: ret14;15; CHECK-LABEL: incb:16; CHECK: // %bb.0:17; CHECK-NEXT: // kill: def $w0 killed $w0 def $x018; CHECK-NEXT: incb x0, vl519; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x020; CHECK-NEXT: ret21 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 5)22 %conv = trunc i64 %cnt to i3223 %out = add i32 %conv, %a24 ret i32 %out25}26 27define i32 @incb_mul(i32 %a) {28; NO_SCALAR_INC-LABEL: incb_mul:29; NO_SCALAR_INC: // %bb.0:30; NO_SCALAR_INC-NEXT: cntb x8, vl831; NO_SCALAR_INC-NEXT: add w0, w0, w8, lsl #232; NO_SCALAR_INC-NEXT: ret33;34; CHECK-LABEL: incb_mul:35; CHECK: // %bb.0:36; CHECK-NEXT: // kill: def $w0 killed $w0 def $x037; CHECK-NEXT: incb x0, vl8, mul #438; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x039; CHECK-NEXT: ret40 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 8)41 %conv = trunc i64 %cnt to i3242 %mul = mul i32 %conv, 443 %out = add i32 %mul, %a44 ret i32 %out45}46 47;48; DECB49;50 51define i32 @decb(i32 %a) {52; NO_SCALAR_INC-LABEL: decb:53; NO_SCALAR_INC: // %bb.0:54; NO_SCALAR_INC-NEXT: cntb x8, vl655; NO_SCALAR_INC-NEXT: sub w0, w0, w856; NO_SCALAR_INC-NEXT: ret57;58; CHECK-LABEL: decb:59; CHECK: // %bb.0:60; CHECK-NEXT: // kill: def $w0 killed $w0 def $x061; CHECK-NEXT: decb x0, vl662; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x063; CHECK-NEXT: ret64 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 6)65 %conv = trunc i64 %cnt to i3266 %out = sub i32 %a, %conv67 ret i32 %out68}69 70define i32 @decb_mul(i32 %a) {71; NO_SCALAR_INC-LABEL: decb_mul:72; NO_SCALAR_INC: // %bb.0:73; NO_SCALAR_INC-NEXT: cntb x8, vl674; NO_SCALAR_INC-NEXT: sub w0, w0, w8, lsl #375; NO_SCALAR_INC-NEXT: ret76;77; CHECK-LABEL: decb_mul:78; CHECK: // %bb.0:79; CHECK-NEXT: // kill: def $w0 killed $w0 def $x080; CHECK-NEXT: decb x0, vl6, mul #881; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x082; CHECK-NEXT: ret83 %cnt = call i64 @llvm.aarch64.sve.cntb(i32 6)84 %conv = trunc i64 %cnt to i3285 %mul = mul i32 %conv, 886 %out = sub i32 %a, %mul87 ret i32 %out88}89 90; INCH91 92define i32 @inch(i32 %a) {93; NO_SCALAR_INC-LABEL: inch:94; NO_SCALAR_INC: // %bb.0:95; NO_SCALAR_INC-NEXT: cnth x8, #1696; NO_SCALAR_INC-NEXT: add w0, w8, w097; NO_SCALAR_INC-NEXT: ret98;99; CHECK-LABEL: inch:100; CHECK: // %bb.0:101; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0102; CHECK-NEXT: inch x0, #16103; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0104; CHECK-NEXT: ret105 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 16)106 %conv = trunc i64 %cnt to i32107 %out = add i32 %conv, %a108 ret i32 %out109}110 111define i32 @inch_mul(i32 %a) {112; NO_SCALAR_INC-LABEL: inch_mul:113; NO_SCALAR_INC: // %bb.0:114; NO_SCALAR_INC-NEXT: cnth x8, vl8115; NO_SCALAR_INC-NEXT: mov w9, #5 // =0x5116; NO_SCALAR_INC-NEXT: madd w0, w8, w9, w0117; NO_SCALAR_INC-NEXT: ret118;119; CHECK-LABEL: inch_mul:120; CHECK: // %bb.0:121; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0122; CHECK-NEXT: inch x0, vl8, mul #5123; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0124; CHECK-NEXT: ret125 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 8)126 %conv = trunc i64 %cnt to i32127 %mul = mul i32 %conv, 5128 %out = add i32 %mul, %a129 ret i32 %out130}131 132;133; DECH134;135 136define i32 @dech(i32 %a) {137; NO_SCALAR_INC-LABEL: dech:138; NO_SCALAR_INC: // %bb.0:139; NO_SCALAR_INC-NEXT: cnth x8, vl1140; NO_SCALAR_INC-NEXT: sub w0, w0, w8141; NO_SCALAR_INC-NEXT: ret142;143; CHECK-LABEL: dech:144; CHECK: // %bb.0:145; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0146; CHECK-NEXT: dech x0, vl1147; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0148; CHECK-NEXT: ret149 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 1)150 %conv = trunc i64 %cnt to i32151 %out = sub i32 %a, %conv152 ret i32 %out153}154 155define i32 @dech_mul(i32 %a) {156; NO_SCALAR_INC-LABEL: dech_mul:157; NO_SCALAR_INC: // %bb.0:158; NO_SCALAR_INC-NEXT: cnth x8, vl16159; NO_SCALAR_INC-NEXT: mov w9, #7 // =0x7160; NO_SCALAR_INC-NEXT: msub w0, w8, w9, w0161; NO_SCALAR_INC-NEXT: ret162;163; CHECK-LABEL: dech_mul:164; CHECK: // %bb.0:165; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0166; CHECK-NEXT: dech x0, vl16, mul #7167; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0168; CHECK-NEXT: ret169 %cnt = call i64 @llvm.aarch64.sve.cnth(i32 9)170 %conv = trunc i64 %cnt to i32171 %mul = mul i32 %conv, 7172 %out = sub i32 %a, %mul173 ret i32 %out174}175 176;177; INCW178;179 180define i32 @incw(i32 %a) {181; NO_SCALAR_INC-LABEL: incw:182; NO_SCALAR_INC: // %bb.0:183; NO_SCALAR_INC-NEXT: cntw x8, #16184; NO_SCALAR_INC-NEXT: add w0, w8, w0185; NO_SCALAR_INC-NEXT: ret186;187; CHECK-LABEL: incw:188; CHECK: // %bb.0:189; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0190; CHECK-NEXT: incw x0, #16191; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0192; CHECK-NEXT: ret193 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 16)194 %conv = trunc i64 %cnt to i32195 %out = add i32 %conv, %a196 ret i32 %out197}198 199define i32 @incw_mul(i32 %a) {200; NO_SCALAR_INC-LABEL: incw_mul:201; NO_SCALAR_INC: // %bb.0:202; NO_SCALAR_INC-NEXT: cntw x8, vl32203; NO_SCALAR_INC-NEXT: mov w9, #12 // =0xc204; NO_SCALAR_INC-NEXT: madd w0, w8, w9, w0205; NO_SCALAR_INC-NEXT: ret206;207; CHECK-LABEL: incw_mul:208; CHECK: // %bb.0:209; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0210; CHECK-NEXT: incw x0, vl32, mul #12211; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0212; CHECK-NEXT: ret213 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 10)214 %conv = trunc i64 %cnt to i32215 %mul = mul i32 %conv, 12216 %out = add i32 %mul, %a217 ret i32 %out218}219 220;221; DECW222;223 224define i32 @decw(i32 %a) {225; NO_SCALAR_INC-LABEL: decw:226; NO_SCALAR_INC: // %bb.0:227; NO_SCALAR_INC-NEXT: cntw x8, vl64228; NO_SCALAR_INC-NEXT: sub w0, w0, w8229; NO_SCALAR_INC-NEXT: ret230;231; CHECK-LABEL: decw:232; CHECK: // %bb.0:233; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0234; CHECK-NEXT: decw x0, vl64235; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0236; CHECK-NEXT: ret237 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 11)238 %conv = trunc i64 %cnt to i32239 %out = sub i32 %a, %conv240 ret i32 %out241}242 243define i32 @decw_mul(i32 %a) {244; NO_SCALAR_INC-LABEL: decw_mul:245; NO_SCALAR_INC: // %bb.0:246; NO_SCALAR_INC-NEXT: cntw x8, vl128247; NO_SCALAR_INC-NEXT: sub w0, w0, w8, lsl #4248; NO_SCALAR_INC-NEXT: ret249;250; CHECK-LABEL: decw_mul:251; CHECK: // %bb.0:252; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0253; CHECK-NEXT: decw x0, vl128, mul #16254; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0255; CHECK-NEXT: ret256 %cnt = call i64 @llvm.aarch64.sve.cntw(i32 12)257 %conv = trunc i64 %cnt to i32258 %mul = mul i32 %conv, 16259 %out = sub i32 %a, %mul260 ret i32 %out261}262 263; INCD264 265define i32 @incd(i32 %base) {266; NO_SCALAR_INC-LABEL: incd:267; NO_SCALAR_INC: // %bb.0:268; NO_SCALAR_INC-NEXT: cntd x8, vl64269; NO_SCALAR_INC-NEXT: add w0, w0, w8270; NO_SCALAR_INC-NEXT: ret271;272; CHECK-LABEL: incd:273; CHECK: // %bb.0:274; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0275; CHECK-NEXT: incd x0, vl64276; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0277; CHECK-NEXT: ret278 %cnt = tail call i64 @llvm.aarch64.sve.cntd(i32 11)279 %conv = trunc i64 %cnt to i32280 %add = add i32 %base, %conv281 ret i32 %add282}283 284define i32 @incd_mul(i32 %base) {285; NO_SCALAR_INC-LABEL: incd_mul:286; NO_SCALAR_INC: // %bb.0:287; NO_SCALAR_INC-NEXT: cntd x8, vl64288; NO_SCALAR_INC-NEXT: mov w9, #15 // =0xf289; NO_SCALAR_INC-NEXT: madd w0, w8, w9, w0290; NO_SCALAR_INC-NEXT: ret291;292; CHECK-LABEL: incd_mul:293; CHECK: // %bb.0:294; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0295; CHECK-NEXT: incd x0, vl64, mul #15296; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0297; CHECK-NEXT: ret298 %cnt = tail call i64 @llvm.aarch64.sve.cntd(i32 11)299 %conv = trunc i64 %cnt to i32300 %mul = mul i32 %conv, 15301 %add = add i32 %base, %mul302 ret i32 %add303}304 305;306; DECD307;308 309define i32 @decd(i32 %a) {310; NO_SCALAR_INC-LABEL: decd:311; NO_SCALAR_INC: // %bb.0:312; NO_SCALAR_INC-NEXT: cntd x8, #16313; NO_SCALAR_INC-NEXT: sub w0, w0, w8314; NO_SCALAR_INC-NEXT: ret315;316; CHECK-LABEL: decd:317; CHECK: // %bb.0:318; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0319; CHECK-NEXT: decd x0, #16320; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0321; CHECK-NEXT: ret322 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 16)323 %conv = trunc i64 %cnt to i32324 %out = sub i32 %a, %conv325 ret i32 %out326}327 328define i32 @decd_mul(i32 %a) {329; NO_SCALAR_INC-LABEL: decd_mul:330; NO_SCALAR_INC: // %bb.0:331; NO_SCALAR_INC-NEXT: cntd x8, vl2332; NO_SCALAR_INC-NEXT: mov w9, #9 // =0x9333; NO_SCALAR_INC-NEXT: msub w0, w8, w9, w0334; NO_SCALAR_INC-NEXT: ret335;336; CHECK-LABEL: decd_mul:337; CHECK: // %bb.0:338; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0339; CHECK-NEXT: decd x0, vl2, mul #9340; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0341; CHECK-NEXT: ret342 %cnt = call i64 @llvm.aarch64.sve.cntd(i32 2)343 %conv = trunc i64 %cnt to i32344 %mul = mul i32 %conv, 9345 %out = sub i32 %a, %mul346 ret i32 %out347}348 349declare i64 @llvm.aarch64.sve.cntb(i32 %pattern)350declare i64 @llvm.aarch64.sve.cnth(i32 %pattern)351declare i64 @llvm.aarch64.sve.cntw(i32 %pattern)352declare i64 @llvm.aarch64.sve.cntd(i32 %pattern)353