|  | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | 
|  | ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s -check-prefix=NO_SCALAR_INC | 
|  | ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -sve-use-scalar-inc-vl=true < %s | FileCheck %s | 
|  | ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s | FileCheck %s | 
|  |  | 
|  | ; INCB | 
|  |  | 
|  | define i32 @incb(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: incb: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntb x8, vl5 | 
|  | ; NO_SCALAR_INC-NEXT:    add w0, w8, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: incb: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    incb x0, vl5 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntb(i32 5) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = add i32 %conv, %a | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @incb_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: incb_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntb x8, vl8 | 
|  | ; NO_SCALAR_INC-NEXT:    add w0, w0, w8, lsl #2 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: incb_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    incb x0, vl8, mul #4 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntb(i32 8) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 4 | 
|  | %out = add i32 %mul, %a | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | ; | 
|  | ; DECB | 
|  | ; | 
|  |  | 
|  | define i32 @decb(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: decb: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntb x8, vl6 | 
|  | ; NO_SCALAR_INC-NEXT:    sub w0, w0, w8 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: decb: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    decb x0, vl6 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntb(i32 6) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = sub i32 %a, %conv | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @decb_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: decb_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntb x8, vl6 | 
|  | ; NO_SCALAR_INC-NEXT:    sub w0, w0, w8, lsl #3 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: decb_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    decb x0, vl6, mul #8 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntb(i32 6) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 8 | 
|  | %out = sub i32 %a, %mul | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | ; INCH | 
|  |  | 
|  | define i32 @inch(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: inch: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cnth x8, #16 | 
|  | ; NO_SCALAR_INC-NEXT:    add w0, w8, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: inch: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    inch x0, #16 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cnth(i32 16) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = add i32 %conv, %a | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @inch_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: inch_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cnth x8, vl8 | 
|  | ; NO_SCALAR_INC-NEXT:    mov w9, #5 // =0x5 | 
|  | ; NO_SCALAR_INC-NEXT:    madd w0, w8, w9, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: inch_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    inch x0, vl8, mul #5 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cnth(i32 8) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 5 | 
|  | %out = add i32 %mul, %a | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | ; | 
|  | ; DECH | 
|  | ; | 
|  |  | 
|  | define i32 @dech(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: dech: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cnth x8, vl1 | 
|  | ; NO_SCALAR_INC-NEXT:    sub w0, w0, w8 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: dech: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    dech x0, vl1 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cnth(i32 1) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = sub i32 %a, %conv | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @dech_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: dech_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cnth x8, vl16 | 
|  | ; NO_SCALAR_INC-NEXT:    mov w9, #7 // =0x7 | 
|  | ; NO_SCALAR_INC-NEXT:    msub w0, w8, w9, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: dech_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    dech x0, vl16, mul #7 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cnth(i32 9) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 7 | 
|  | %out = sub i32 %a, %mul | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | ; | 
|  | ; INCW | 
|  | ; | 
|  |  | 
|  | define i32 @incw(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: incw: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntw x8, #16 | 
|  | ; NO_SCALAR_INC-NEXT:    add w0, w8, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: incw: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    incw x0, #16 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntw(i32 16) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = add i32 %conv, %a | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @incw_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: incw_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntw x8, vl32 | 
|  | ; NO_SCALAR_INC-NEXT:    mov w9, #12 // =0xc | 
|  | ; NO_SCALAR_INC-NEXT:    madd w0, w8, w9, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: incw_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    incw x0, vl32, mul #12 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntw(i32 10) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 12 | 
|  | %out = add i32 %mul, %a | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | ; | 
|  | ; DECW | 
|  | ; | 
|  |  | 
|  | define i32 @decw(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: decw: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntw x8, vl64 | 
|  | ; NO_SCALAR_INC-NEXT:    sub w0, w0, w8 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: decw: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    decw x0, vl64 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntw(i32 11) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = sub i32 %a, %conv | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @decw_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: decw_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntw x8, vl128 | 
|  | ; NO_SCALAR_INC-NEXT:    sub w0, w0, w8, lsl #4 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: decw_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    decw x0, vl128, mul #16 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntw(i32 12) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 16 | 
|  | %out = sub i32 %a, %mul | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | ; INCD | 
|  |  | 
|  | define i32 @incd(i32 %base) { | 
|  | ; NO_SCALAR_INC-LABEL: incd: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntd x8, vl64 | 
|  | ; NO_SCALAR_INC-NEXT:    add w0, w0, w8 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: incd: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    incd x0, vl64 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = tail call i64 @llvm.aarch64.sve.cntd(i32 11) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %add = add i32 %base, %conv | 
|  | ret i32 %add | 
|  | } | 
|  |  | 
|  | define i32 @incd_mul(i32 %base) { | 
|  | ; NO_SCALAR_INC-LABEL: incd_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntd x8, vl64 | 
|  | ; NO_SCALAR_INC-NEXT:    mov w9, #15 // =0xf | 
|  | ; NO_SCALAR_INC-NEXT:    madd w0, w8, w9, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: incd_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    incd x0, vl64, mul #15 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = tail call i64 @llvm.aarch64.sve.cntd(i32 11) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 15 | 
|  | %add = add i32 %base, %mul | 
|  | ret i32 %add | 
|  | } | 
|  |  | 
|  | ; | 
|  | ; DECD | 
|  | ; | 
|  |  | 
|  | define i32 @decd(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: decd: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntd x8, #16 | 
|  | ; NO_SCALAR_INC-NEXT:    sub w0, w0, w8 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: decd: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    decd x0, #16 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntd(i32 16) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %out = sub i32 %a, %conv | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | define i32 @decd_mul(i32 %a) { | 
|  | ; NO_SCALAR_INC-LABEL: decd_mul: | 
|  | ; NO_SCALAR_INC:       // %bb.0: | 
|  | ; NO_SCALAR_INC-NEXT:    cntd x8, vl2 | 
|  | ; NO_SCALAR_INC-NEXT:    mov w9, #9 // =0x9 | 
|  | ; NO_SCALAR_INC-NEXT:    msub w0, w8, w9, w0 | 
|  | ; NO_SCALAR_INC-NEXT:    ret | 
|  | ; | 
|  | ; CHECK-LABEL: decd_mul: | 
|  | ; CHECK:       // %bb.0: | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0 | 
|  | ; CHECK-NEXT:    decd x0, vl2, mul #9 | 
|  | ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0 | 
|  | ; CHECK-NEXT:    ret | 
|  | %cnt = call i64 @llvm.aarch64.sve.cntd(i32 2) | 
|  | %conv = trunc i64 %cnt to i32 | 
|  | %mul = mul i32 %conv, 9 | 
|  | %out = sub i32 %a, %mul | 
|  | ret i32 %out | 
|  | } | 
|  |  | 
|  | declare i64 @llvm.aarch64.sve.cntb(i32 %pattern) | 
|  | declare i64 @llvm.aarch64.sve.cnth(i32 %pattern) | 
|  | declare i64 @llvm.aarch64.sve.cntw(i32 %pattern) | 
|  | declare i64 @llvm.aarch64.sve.cntd(i32 %pattern) |