; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc -verify-machineinstrs -mattr=+sve < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" ; Muls with (-1) as operand should fold to neg. define @mul_neg_fold_i8( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.b, p0/m, z0.b ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv16i8( %pg, %a, splat(i8 -1)) ret %1 } define @mul_neg_fold_i16( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv8i16( %pg, %a, splat(i16 -1)) ret %1 } define @mul_neg_fold_i32( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv4i32( %pg, %a, splat(i32 -1)) ret %1 } define @mul_neg_fold_i64( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.d, p0/m, z0.d ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv2i64( %pg, %a, splat(i64 -1)) ret %1 } define @mul_neg_fold_u_i8( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_u_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.b, p0/m, z0.b ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.u.nxv16i8( %pg, %a, splat(i8 -1)) ret %1 } define @mul_neg_fold_u_i16( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_u_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %a, splat(i16 -1)) ret %1 } define @mul_neg_fold_u_i32( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_u_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a, splat(i32 -1)) ret %1 } define @mul_neg_fold_u_i64( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_u_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: neg z0.d, p0/m, z0.d ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg, %a, splat(i64 -1)) ret %1 } define @mul_neg_fold_different_argument_order_i8( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_different_argument_order_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.b, #-1 // =0xffffffffffffffff ; CHECK-NEXT: neg z1.b, p0/m, z0.b ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv16i8( %pg, splat(i8 -1), %a) ret %1 } define @mul_neg_fold_different_argument_order_i16( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_different_argument_order_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.h, #-1 // =0xffffffffffffffff ; CHECK-NEXT: neg z1.h, p0/m, z0.h ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv8i16( %pg, splat(i16 -1), %a) ret %1 } define @mul_neg_fold_different_argument_order_i32( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_different_argument_order_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.s, #-1 // =0xffffffffffffffff ; CHECK-NEXT: neg z1.s, p0/m, z0.s ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv4i32( %pg, splat(i32 -1), %a) ret %1 } define @mul_neg_fold_different_argument_order_i64( %pg, %a) { ; CHECK-LABEL: mul_neg_fold_different_argument_order_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.d, #-1 // =0xffffffffffffffff ; CHECK-NEXT: neg z1.d, p0/m, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %1 = call @llvm.aarch64.sve.mul.nxv2i64( %pg, splat(i64 -1), %a) ret %1 } declare @llvm.aarch64.sve.mul.u.nxv16i8(, , ) declare @llvm.aarch64.sve.mul.u.nxv8i16(, , ) declare @llvm.aarch64.sve.mul.u.nxv4i32(, , ) declare @llvm.aarch64.sve.mul.u.nxv2i64(, , ) declare @llvm.aarch64.sve.mul.nxv16i8(, , ) declare @llvm.aarch64.sve.mul.nxv8i16(, , ) declare @llvm.aarch64.sve.mul.nxv4i32(, , ) declare @llvm.aarch64.sve.mul.nxv2i64(, , )