; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 ; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s define @vaaddu_1( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_1: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i16.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i16.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i16( %xz, %yz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i16( %a, splat (i16 1), %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i16( %b, splat (i16 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i16( %c, %m, i32 %vl) ret %d } define @vaaddu_2( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_2: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i16.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i16.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i16( %xz, %yz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i16( splat (i16 1), %a, %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i16( %b, splat (i16 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i16( %c, %m, i32 %vl) ret %d } define @vaaddu_3( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_3: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i16.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i16.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i16( %xz, splat (i16 1), %m, i32 %vl) %b = call @llvm.vp.add.nxv2i16( %a, %yz, %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i16( %b, splat (i16 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i16( %c, %m, i32 %vl) ret %d } define @vaaddu_4( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_4: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i16.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i16.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i16( %xz, splat (i16 1), %m, i32 %vl) %b = call @llvm.vp.add.nxv2i16( %yz, %a, %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i16( %b, splat (i16 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i16( %c, %m, i32 %vl) ret %d } define @vaaddu_5( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_5: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i16.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i16.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i16( splat (i16 1), %xz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i16( %a, %yz, %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i16( %b, splat (i16 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i16( %c, %m, i32 %vl) ret %d } define @vaaddu_6( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_6: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i16.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i16.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i16( splat (i16 1), %xz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i16( %yz, %a, %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i16( %b, splat (i16 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i16( %c, %m, i32 %vl) ret %d } ; Test where the size is reduced by 4x instead of 2x. define @vaaddu_7( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_7: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v8, v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i32.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i32.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i32( %xz, %yz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i32( %a, splat (i32 1), %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i32( %b, splat (i32 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i32( %c, %m, i32 %vl) ret %d } ; Test where the zext can't be completely removed. define @vaaddu_8( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_8: ; CHECK: # %bb.0: ; CHECK-NEXT: csrwi vxrm, 0 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vaaddu.vv v9, v8, v9 ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma ; CHECK-NEXT: vzext.vf2 v8, v9 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i32.nxv2i8( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i32.nxv2i8( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i32( %xz, %yz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i32( %a, splat (i32 1), %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i32( %b, splat (i32 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i16.nxv2i32( %c, %m, i32 %vl) ret %d } define @vaaddu_9( %x, %y, %m, i32 zeroext %vl) { ; CHECK-LABEL: vaaddu_9: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma ; CHECK-NEXT: vwaddu.vv v10, v8, v9 ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma ; CHECK-NEXT: vadd.vi v8, v10, 1 ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma ; CHECK-NEXT: vnsrl.wi v8, v8, 1 ; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma ; CHECK-NEXT: vnsrl.wi v8, v8, 0 ; CHECK-NEXT: ret %xz = call @llvm.vp.zext.nxv2i32.nxv2i16( %x, %m, i32 %vl) %yz = call @llvm.vp.zext.nxv2i32.nxv2i16( %y, %m, i32 %vl) %a = call @llvm.vp.add.nxv2i32( %xz, %yz, %m, i32 %vl) %b = call @llvm.vp.add.nxv2i32( %a, splat (i32 1), %m, i32 %vl) %c = call @llvm.vp.lshr.nxv2i32( %b, splat (i32 1), %m, i32 %vl) %d = call @llvm.vp.trunc.nxv2i8.nxv2i32( %c, %m, i32 %vl) ret %d }