diff options
author | Paul Walker <paul.walker@arm.com> | 2025-04-25 11:30:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-25 11:30:03 +0100 |
commit | 96ec17dfed358264b84fd6c407d0ca8d31229ebf (patch) | |
tree | 2f8f2e0782c6bbd4c673a37bccf648abac04d20a | |
parent | da14f6d4b9d8c2b1fde37cd766688ce5e26b2984 (diff) | |
download | llvm-96ec17dfed358264b84fd6c407d0ca8d31229ebf.zip llvm-96ec17dfed358264b84fd6c407d0ca8d31229ebf.tar.gz llvm-96ec17dfed358264b84fd6c407d0ca8d31229ebf.tar.bz2 |
[LLVM][InstCombine] Enable constant folding for SVE add,and,eor,fadd,fdiv,fsub,orr & sub intrinsics. (#136849)
This is the subset of binops (mul and fmul are already enabled) whose
behaviour fully aligns with the equivalent SVE intrinsic. The omissions
are integer divides and shifts that are defined to return poison for
values where the intrinsics have a defined result. These will be covered
in a seperate PR.
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp | 48 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-simplify-binop.ll | 40 |
2 files changed, 56 insertions, 32 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index c670b2ae..fcc5eb1 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -1268,9 +1268,11 @@ static SVEIntrinsicInfo constructSVEIntrinsicInfo(IntrinsicInst &II) { case Intrinsic::aarch64_sve_fabd: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fabd_u); case Intrinsic::aarch64_sve_fadd: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fadd_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fadd_u) + .setMatchingIROpcode(Instruction::FAdd); case Intrinsic::aarch64_sve_fdiv: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fdiv_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fdiv_u) + .setMatchingIROpcode(Instruction::FDiv); case Intrinsic::aarch64_sve_fmax: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fmax_u); case Intrinsic::aarch64_sve_fmaxnm: @@ -1293,9 +1295,11 @@ static SVEIntrinsicInfo constructSVEIntrinsicInfo(IntrinsicInst &II) { case Intrinsic::aarch64_sve_fnmls: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fnmls_u); case Intrinsic::aarch64_sve_fsub: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fsub_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_fsub_u) + .setMatchingIROpcode(Instruction::FSub); case Intrinsic::aarch64_sve_add: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_add_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_add_u) + .setMatchingIROpcode(Instruction::Add); case Intrinsic::aarch64_sve_mla: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_mla_u); case Intrinsic::aarch64_sve_mls: @@ -1312,7 +1316,8 @@ static SVEIntrinsicInfo constructSVEIntrinsicInfo(IntrinsicInst &II) { case Intrinsic::aarch64_sve_smulh: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_smulh_u); case Intrinsic::aarch64_sve_sub: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_sub_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_sub_u) + .setMatchingIROpcode(Instruction::Sub); case Intrinsic::aarch64_sve_uabd: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_uabd_u); case Intrinsic::aarch64_sve_umax: @@ -1328,24 +1333,51 @@ static SVEIntrinsicInfo constructSVEIntrinsicInfo(IntrinsicInst &II) { case Intrinsic::aarch64_sve_lsr: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_lsr_u); case Intrinsic::aarch64_sve_and: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_and_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_and_u) + .setMatchingIROpcode(Instruction::And); case Intrinsic::aarch64_sve_bic: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_bic_u); case Intrinsic::aarch64_sve_eor: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_eor_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_eor_u) + .setMatchingIROpcode(Instruction::Xor); case Intrinsic::aarch64_sve_orr: - return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_orr_u); + return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_orr_u) + .setMatchingIROpcode(Instruction::Or); case Intrinsic::aarch64_sve_sqsub: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_sqsub_u); case Intrinsic::aarch64_sve_uqsub: return SVEIntrinsicInfo::defaultMergingOp(Intrinsic::aarch64_sve_uqsub_u); + case Intrinsic::aarch64_sve_add_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::Add); + case Intrinsic::aarch64_sve_and_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::And); + case Intrinsic::aarch64_sve_eor_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::Xor); + case Intrinsic::aarch64_sve_fadd_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::FAdd); + case Intrinsic::aarch64_sve_fdiv_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::FDiv); case Intrinsic::aarch64_sve_fmul_u: return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( Instruction::FMul); + case Intrinsic::aarch64_sve_fsub_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::FSub); case Intrinsic::aarch64_sve_mul_u: return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( Instruction::Mul); + case Intrinsic::aarch64_sve_orr_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::Or); + case Intrinsic::aarch64_sve_sub_u: + return SVEIntrinsicInfo::defaultUndefOp().setMatchingIROpcode( + Instruction::Sub); case Intrinsic::aarch64_sve_addqv: case Intrinsic::aarch64_sve_and_z: diff --git a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-simplify-binop.ll b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-simplify-binop.ll index 85fc02cb..5099c2d 100644 --- a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-simplify-binop.ll +++ b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-simplify-binop.ll @@ -110,7 +110,7 @@ define <vscale x 4 x i32> @constant_mul_u_after_striping_inactive_lanes(<vscale define <vscale x 4 x i32> @constant_add(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_add( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 10), <vscale x 4 x i32> splat (i32 7) ; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) @@ -120,8 +120,7 @@ define <vscale x 4 x i32> @constant_add(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_add_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_add_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.add.u.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) -; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] +; CHECK-NEXT: ret <vscale x 4 x i32> splat (i32 10) ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.add.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) ret <vscale x 4 x i32> %r @@ -130,7 +129,7 @@ define <vscale x 4 x i32> @constant_add_u(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_and(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_and( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.and.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 14)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 6), <vscale x 4 x i32> splat (i32 7) ; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.and.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 14)) @@ -140,8 +139,7 @@ define <vscale x 4 x i32> @constant_and(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_and_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_and_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.and.u.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 14)) -; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] +; CHECK-NEXT: ret <vscale x 4 x i32> splat (i32 6) ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.and.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 14)) ret <vscale x 4 x i32> %r @@ -150,7 +148,7 @@ define <vscale x 4 x i32> @constant_and_u(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_eor(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_eor( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.eor.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 4), <vscale x 4 x i32> splat (i32 7) ; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.eor.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) @@ -160,8 +158,7 @@ define <vscale x 4 x i32> @constant_eor(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_eor_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_eor_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.eor.u.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) -; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] +; CHECK-NEXT: ret <vscale x 4 x i32> splat (i32 4) ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.eor.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) ret <vscale x 4 x i32> %r @@ -170,7 +167,7 @@ define <vscale x 4 x i32> @constant_eor_u(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x float> @constant_fadd(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x float> @constant_fadd( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.fadd.nxv4f32(<vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 7.000000e+00), <vscale x 4 x float> splat (float 6.000000e+00)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 1.300000e+01), <vscale x 4 x float> splat (float 7.000000e+00) ; CHECK-NEXT: ret <vscale x 4 x float> [[R]] ; %r = call <vscale x 4 x float> @llvm.aarch64.sve.fadd.nxv4f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> splat (float 7.0), <vscale x 4 x float> splat (float 6.0)) @@ -180,8 +177,7 @@ define <vscale x 4 x float> @constant_fadd(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x float> @constant_fadd_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x float> @constant_fadd_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.fadd.u.nxv4f32(<vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 7.000000e+00), <vscale x 4 x float> splat (float 6.000000e+00)) -; CHECK-NEXT: ret <vscale x 4 x float> [[R]] +; CHECK-NEXT: ret <vscale x 4 x float> splat (float 1.300000e+01) ; %r = call <vscale x 4 x float> @llvm.aarch64.sve.fadd.u.nxv4f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> splat (float 7.0), <vscale x 4 x float> splat (float 6.0)) ret <vscale x 4 x float> %r @@ -190,7 +186,7 @@ define <vscale x 4 x float> @constant_fadd_u(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x float> @constant_fdiv(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x float> @constant_fdiv( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.fdiv.nxv4f32(<vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 1.200000e+01), <vscale x 4 x float> splat (float 6.000000e+00)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 2.000000e+00), <vscale x 4 x float> splat (float 1.200000e+01) ; CHECK-NEXT: ret <vscale x 4 x float> [[R]] ; %r = call <vscale x 4 x float> @llvm.aarch64.sve.fdiv.nxv4f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> splat (float 12.0), <vscale x 4 x float> splat (float 6.0)) @@ -200,8 +196,7 @@ define <vscale x 4 x float> @constant_fdiv(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x float> @constant_fdiv_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x float> @constant_fdiv_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.fdiv.u.nxv4f32(<vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 7.000000e+00), <vscale x 4 x float> splat (float 6.000000e+00)) -; CHECK-NEXT: ret <vscale x 4 x float> [[R]] +; CHECK-NEXT: ret <vscale x 4 x float> splat (float 0x3FF2AAAAA0000000) ; %r = call <vscale x 4 x float> @llvm.aarch64.sve.fdiv.u.nxv4f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> splat (float 7.0), <vscale x 4 x float> splat (float 6.0)) ret <vscale x 4 x float> %r @@ -229,7 +224,7 @@ define <vscale x 4 x float> @constant_fmul_u(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x float> @constant_fsub(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x float> @constant_fsub( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.fsub.nxv4f32(<vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 7.000000e+00), <vscale x 4 x float> splat (float 6.000000e+00)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 1.000000e+00), <vscale x 4 x float> splat (float 7.000000e+00) ; CHECK-NEXT: ret <vscale x 4 x float> [[R]] ; %r = call <vscale x 4 x float> @llvm.aarch64.sve.fsub.nxv4f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> splat (float 7.0), <vscale x 4 x float> splat (float 6.0)) @@ -239,8 +234,7 @@ define <vscale x 4 x float> @constant_fsub(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x float> @constant_fsub_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x float> @constant_fsub_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.fsub.u.nxv4f32(<vscale x 4 x i1> [[PG]], <vscale x 4 x float> splat (float 7.000000e+00), <vscale x 4 x float> splat (float 6.000000e+00)) -; CHECK-NEXT: ret <vscale x 4 x float> [[R]] +; CHECK-NEXT: ret <vscale x 4 x float> splat (float 1.000000e+00) ; %r = call <vscale x 4 x float> @llvm.aarch64.sve.fsub.u.nxv4f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> splat (float 7.0), <vscale x 4 x float> splat (float 6.0)) ret <vscale x 4 x float> %r @@ -268,7 +262,7 @@ define <vscale x 4 x i32> @constant_mul_u(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_orr(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_orr( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.orr.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 13), <vscale x 4 x i32> splat (i32 3)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 15), <vscale x 4 x i32> splat (i32 13) ; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.orr.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 13), <vscale x 4 x i32> splat (i32 3)) @@ -278,8 +272,7 @@ define <vscale x 4 x i32> @constant_orr(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_orr_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_orr_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.orr.u.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 13), <vscale x 4 x i32> splat (i32 3)) -; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] +; CHECK-NEXT: ret <vscale x 4 x i32> splat (i32 15) ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.orr.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 13), <vscale x 4 x i32> splat (i32 3)) ret <vscale x 4 x i32> %r @@ -351,7 +344,7 @@ define <vscale x 4 x i32> @constant_sdiv_u_with_overflow(<vscale x 4 x i1> %pg) define <vscale x 4 x i32> @constant_sub(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_sub( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.sub.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 4), <vscale x 4 x i32> splat (i32 7) ; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.sub.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) @@ -361,8 +354,7 @@ define <vscale x 4 x i32> @constant_sub(<vscale x 4 x i1> %pg) #0 { define <vscale x 4 x i32> @constant_sub_u(<vscale x 4 x i1> %pg) #0 { ; CHECK-LABEL: define <vscale x 4 x i32> @constant_sub_u( ; CHECK-SAME: <vscale x 4 x i1> [[PG:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[R:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.sub.u.nxv4i32(<vscale x 4 x i1> [[PG]], <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) -; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] +; CHECK-NEXT: ret <vscale x 4 x i32> splat (i32 4) ; %r = call <vscale x 4 x i32> @llvm.aarch64.sve.sub.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat (i32 7), <vscale x 4 x i32> splat (i32 3)) ret <vscale x 4 x i32> %r |